def send_alert(group_id, user_class, type='private'): group_menbers = globalDB.get_class_members(user_class) current_date = time.strftime("%Y-%m-%d", time.localtime()) alert_users = {} #user_id:last_date for user_id in group_menbers: #print(user_id) try: last_date = dbconn.check_status(user_id) except TypeError: #还没发过照片 alert_users[user_id] = '无记录' else: if (str(last_date) != str(current_date)): alert_users[user_id] = str(last_date)[5:] #print(alert_users) msg = f"今天还有{len(alert_users)}位小可爱未完成哦\n" if (type == 'private'): for user_id in alert_users.keys(): last_date = alert_users[user_id] msg += f"{globalDB.get_user(user_id)['user_name']}({alert_users[user_id]})" msg += f"{globalDB.get_user(user_id)['user_count']}\n" msg += f"{user_class} {current_date}\n完成情况:{len(group_menbers)-len(alert_users)}/{len(group_menbers)}" goapi.sendMsg(group_id, msg) elif (type == 'group'): for user_id in alert_users.keys(): globalDB.add_user_count(str(user_id)) last_date = alert_users[user_id] msg += f"[CQ:at,qq={user_id}]({alert_users[user_id]})-" msg += f"{globalDB.get_user(user_id)['user_count']}\n" msg += f"{user_class} {current_date}\n完成情况:{len(group_menbers)-len(alert_users)}/{len(group_menbers)}" goapi.sendGroupMsg(group_id, msg)
def list_class_menbers(user_id, user_class): msg = f"{user_class}成员情况:\n" ret = globalDB.get_class_members(user_class) for i in range(0, len(ret)): msg += f"{ret[i]} {globalDB.get_user(str(ret[i]))['user_name']} " msg += f"{globalDB.get_user(str(ret[i]))['user_count']}\n" msg += f"共计{str(len(ret))}人" goapi.sendMsg(user_id, msg)
def readMsg(user_id, message): #处理消息核心 user_id = str(user_id) #管理员列表 admin_list = adminConf.show_admin() if ('image' in message): if (globalDB.check_register(user_id)): #用户已注册 get_img(user_id, message) else: #用户未注册 goapi.sendMsg(user_id, '您还没注册呢,请输入例如"注册@张三@计科20-2"\n 班级请严格按格式输入,否则可能统计不上哦') return if ('/admin' in message): user_class = globalDB.get_user(user_id)['user_class'] upload_date = time.strftime("%Y-%m-%d", time.localtime()) print(user_id) if (user_id in admin_list.keys()): group_id = admin_list[user_id] if ('群提醒' in message): send_alert(group_id, globalDB.get_user(user_id)['user_class'], 'group') elif ('提醒' in message): send_alert(user_id, globalDB.get_user(user_id)['user_class'], 'private') upload_date = time.strftime("%Y-%m-%d", time.localtime()) time.sleep(1) #ocr_err_upload(user_id,user_class,upload_date) ocr_err_upload(user_id, user_class, upload_date) time.sleep(2) send_images_info(user_id, user_class) elif ('打包' in message): cmp_ret = compress.zip_file( upload_date, globalDB.get_user(user_id)['user_class']) goapi.sendMsg(user_id, f"---打包完毕---\n共处理:{cmp_ret['file_num']}张照片") goapi.sendMsg( user_id, '下载地址:http://static.catop.top:8001/' + urllib.parse.quote(cmp_ret['file_name'])) elif ('成员' in message): list_class_menbers(user_id, user_class) else: goapi.sendMsg(user_id, "目前支持以下管理指令呢:\n群提醒\n提醒\n打包\n成员\n") else: goapi.sendMsg(user_id, "无管理权限")
def handler(message, qid, type, message_id): """获取舔狗""" url = 'http://api.tianapi.com/txapi/tiangou/index' params = {'key':'ce9683fb3b39fb211a0834c09165c599'} res = requests.get(url,params=params) res_dict = json.loads(res.text) text = "" if(res_dict['code'] == 200): text = res_dict['newslist'][0]['content'] #return text if(type == 'private'): goapi.sendMsg(qid, text) else: goapi.sendGroupMsg(qid, text)
def getEvent(): data = request.json post_type = data.get('post_type') if (post_type == 'message'): message_type = data.get('message_type') message = data.get('message') message_id = data.get('message_id') user_id = str(data.get('user_id')) sender = data.get('sender') #sender为dict if (message_type == 'private'): #处理私聊消息 CB_logger('Flask', f'接收私聊消息@{user_id}:{message[:20]}') CB_router(user_id, message, 'private', sender=sender, message_id=message_id) elif (message_type == 'group'): #处理群聊消息 group_id = data.get('group_id') CB_logger('Flask', f'接收群消息@{group_id}@{user_id}:{message[:20]}') CB_router(user_id, message, 'group', group_id, sender=sender, message_id=message_id) elif (post_type == 'request'): request_type = data.get('request_type') if (request_type == 'friend'): user_id = str(data.get('user_id')) comment = str(data.get('comment')) flag = str(data.get('flag')) CB_logger('Flask', f'\n[flask]接收加好友请求@{user_id}:{comment[:20]}') time.sleep(random.randint(5, 10)) goapi.add_request(flag) time.sleep(random.randint(5, 10)) goapi.sendMsg(user_id, "欢迎!\n请先注册,例如'注册@张三@信安20-2'\n 班级请严格按格式输入,否则可能统计不上哦") else: #暂不处理其他类型上报,为防止go-cq报错而设置 pass return data
def handler(message, qid, type, message_id): """获取网易云热评""" url = 'https://v1.hitokoto.cn' params = {'c': 'j'} res = requests.get(url, params=params) res_dict = json.loads(res.text) text = "" if (res_dict['from']): text = res_dict['hitokoto'] + '——' + res_dict['from'] else: text = res_dict['hitokoto'] if (type == 'private'): goapi.sendMsg(qid, text) else: goapi.sendGroupMsg(qid, text)
def send_images_info(user_id, user_class): """上报班级图片情况(次数和成绩)""" class_menbers = globalDB.get_class_members(user_class) today_upload_count = 0 upload_date = time.strftime("%Y-%m-%d", time.localtime()) msg = f"{user_class} {upload_date}情况:\n" for i in range(0, len(class_menbers)): if (str(dbconn.check_status(class_menbers[i])) == str(upload_date)): today_upload_count += 1 img_info = dbconn.get_latest_img_info(class_menbers[i], upload_date)[0] if (img_info['ocr_err_code'] == 0): msg += f"·{globalDB.get_user(class_menbers[i])['user_name']} 次数{img_info['ocr_times']} 分数{img_info['ocr_scores']}\n" else: msg += f"·{globalDB.get_user(class_menbers[i])['user_name']} 未识别到\n" msg += f"共计{today_upload_count}张照片" goapi.sendMsg(user_id, msg) return msg
def ocr_err_upload(user_id, user_class, upload_date): """为管理员上报ocr错误的图片""" msg = "OCR无法识别以下图片:\n" err_list = [] class_menbers = globalDB.get_class_members(user_class) for i in range(0, len(class_menbers)): img_date = dbconn.check_status(class_menbers[i]) if (str(img_date) == str(upload_date)): img_info = dbconn.get_latest_img_info(class_menbers[i], upload_date)[0] #print(img_info) if (img_info['ocr_err_code'] == 1): print(img_info) err_list.append(img_info['file_name']) for i in range(0, len(err_list)): cqCode = f"[CQ:image,file=file:{cwd}/images{err_list[i]}]" msg += f"{cqCode}\n" msg += f"数量:{len(err_list)}/{len(class_menbers)}" goapi.sendMsg(user_id, msg) return msg
def sudo_act(user_id, message): if ('/sudo' in message and (user_id == '601179193' or user_id == "29242764")): #try: if ('增加管理员' in message): admin_id = message.split('@')[1] group_id = message.split('@')[2] goapi.sendMsg(user_id, str(adminConf.add_admin(admin_id, group_id))) elif ('删除管理员' in message): admin_id = message.split('@')[1] goapi.sendMsg(user_id, str(adminConf.del_admin(admin_id))) elif ('展示管理员' in message): goapi.sendMsg(user_id, str(adminConf.show_admin())) else: goapi.sendMsg(user_id, '增加管理员\n删除管理员\n展示管理员') return
def amuseRouter(message, qid, type, message_id): """娱乐插件路由""" if ('#help' in message): if (type == 'private'): goapi.sendMsg(qid, f"当前支持娱乐功能:{ENABLED_PLUGINS}") else: goapi.sendGroupMsg(qid, f"当前支持娱乐功能:{ENABLED_PLUGINS}") return if (qid in DISABLE_GROUP) or (qid in DISABLE_FRIEND): if (type == 'private'): goapi.sendMsg(qid, "抱歉,您暂无此权限") else: goapi.sendGroupMsg(qid, "抱歉,您所在的群组暂无此权限") else: try: message = message[1:] if not ('[CQ' in message): #无CQ码,空格分割函数名和参数列表 func_name = message.split(' ')[0] else: #有CQ码,按CQ码分割函数名和参数列表 func_name = message.split('[')[0] #检查插件名称合法性,防止eval注入 if (func_name not in ENABLED_PLUGINS): logger.plog("AmuseCtrl", f"找不到娱乐模块'{func_name}'", "warning") if (type == 'private'): goapi.sendMsg(qid, f"还没有'{func_name}'功能呢~") else: goapi.sendGroupMsg(qid, f"还没有'{func_name}'功能呢~") cmd = f"__import__('{func_name}').handler('{message}','{qid}','{type}','{message_id}')" eval(cmd) except: logger.plog("AmuseCtrl", f"用户调用娱乐模块'{func_name}'失败\n命令:{cmd}", "error") else: logger.plog("AmuseCtrl", f"成功调用娱乐模块'{func_name}'")
def get_img(user_id, message): #从message中解析到图片下载地址,并保存数据库,下载文件 try: img_url = message.split('url=')[1][0:-1] user_name = globalDB.get_user(user_id)['user_name'] user_class = globalDB.get_user(user_id)['user_class'] upload_date = time.strftime("%Y-%m-%d", time.localtime()) upload_time = time.strftime("%H:%M:%S", time.localtime()) #修改文件名格式(注意只保存文件名和数据库中显示的file_name改变,目录等名称不变) file_date = time.strftime("%Y%m%d", time.localtime()) #安全过滤 if not (img_url[0:24] == 'http://c2cpicdw.qpic.cn/'): goapi.sendMsg(user_id, '图片url解析错误') return #判断文件目录是否存在 if not (os.path.exists(f"{cwd}/images/{upload_date}")): os.mkdir(f"{cwd}/images/{upload_date}") if not (os.path.exists(f"{cwd}/images/{upload_date}/{user_class}")): os.mkdir(f"{cwd}/images/{upload_date}/{user_class}") file_name = f"/{upload_date}/{user_class}/{user_class}班-{user_name}-{file_date}.jpg" if (dbconn.check_today_upload(user_id, upload_date)): goapi.sendMsg(user_id, '您今天已经上传过照片啦,已覆盖之前的图片~') download_img(img_url, file_name) #print(img_url) except Exception as err: goapi.sendMsg(user_id, '图片下载出错了!') print(err) else: print("成功处理图片:" + file_name) goapi.sendMsg( user_id, "成功处理图片,正在识别...\n" + f"{user_class}班-{user_name}-{file_date}.jpg") """图片识别部分""" try: print(file_name) ocr_ret = ocrplus.ocr_img(f"{cwd}/images" + file_name) ocr_err_code = ocr_ret['err_code'] if (ocr_err_code == 0): goapi.sendMsg( user_id, f"参赛次数:{ocr_ret['个人参赛次数']}\n个人积分:{ocr_ret['个人积分']}") ocr_times = ocr_ret['个人参赛次数'] ocr_scores = ocr_ret['个人积分'] else: print("图片无法识别:" + ocr_ret) #图片识别接口返回无法识别 goapi.sendMsg(user_id, f"嘤!图片无法识别,可能是字体原因,图片将人工复核~") dbconn.insert_img(user_id, file_name, upload_date, upload_time, '1', '0', '0') return except: #图片识别接口出错 print("OCR接口出错:") goapi.sendMsg(user_id, f"嘤!图片无法识别,可能是字体原因,图片将人工复核~") dbconn.insert_img(user_id, file_name, upload_date, upload_time, '1', '0', '0') else: dbconn.insert_img(user_id, file_name, upload_date, upload_time, ocr_err_code, ocr_times, ocr_scores) return
def readMsg(user_id,message): admin_list = adminConf.show_admin() if(str(user_id) in admin_list.keys()): try: user_class = dbconn.get_user_by_id(user_id)['user_class'] if(user_class == None): goapi.sendMsg(user_id,'您还未绑定任何组织。') return if('新建' in message): title = message.split('@')[1] description = message.split('@')[2] pid = dbconn.add_project(title,description,user_class) goapi.sendMsg(user_id,f"----新建项目----\n项目id:{pid}\n项目标题:{title}\n项目描述:{description}") url = f"https://cloud1.catop.top:8002/ClassAlert/?pid={pid}" goapi.sendMsg(user_id,f"完成后请确认:\n项目:{title}\n链接:{url}") elif('提醒' in message): pid = message.split('@')[1] project_class = dbconn.get_project(pid)['user_class'] if not(project_class == user_class): goapi.sendMsg(user_id,f"该项目归属于{project_class},您注册在{user_class},暂无管理权限。") return url = f"https://cloud1.catop.top:8002/ClassAlert/?pid={pid}" alert_list = dbconn.get_unset_user(pid) title = dbconn.get_project(pid)['title'] err_list = [] for uid in alert_list.keys(): try: user_name = dbconn.get_user_by_id(uid)['user_name'] ####连续发送多条带链接私聊消息可能会被风控 goapi.sendMsg(uid,f"亲爱的{user_name},不好意思打扰一下,请及时完成{title}\n点击确认:{url}") #goapi.sendMsg(uid,f"{user_name}您好,请及时完成{title}\n,完成后点击链接确认。(连续发送多条带链接私聊消息可能会被风控,请自行查阅管理员创建的链接)") except: err_list.append(str(uid)) dbconn.unset_count(uid) time.sleep(random.randint(2,3)) goapi.sendMsg(user_id,f"已发送私聊消息{len(alert_list.keys())}条,失败{len(err_list)}条\n失败名单:{err_list}") elif('统计' in message): pid = message.split('@')[1] project_class = dbconn.get_project(pid)['user_class'] if not(project_class == user_class): goapi.sendMsg(user_id,f"该项目归属于{project_class},您注册在{user_class},暂无管理权限。") return alert_list = dbconn.get_unset_user(pid) msg = "----未完成名单----\n" msg += f"项目id:{pid}\n" for uid in alert_list.keys(): msg += f"{uid}({alert_list[uid]})\n" msg += f"共计{len(alert_list.keys())}条" goapi.sendMsg(user_id,msg) msg = "----已完成名单----\n" completed_list = {} user_list = dbconn.get_userinfo(user_class) submit_list = dbconn.get_submit_info(pid) for i in range(0,len(user_list)): user_name = user_list[i]['user_name'] file_flag = 0 complete_flag = 0 file_name = "" for k in range(0,len(submit_list)): if(submit_list[k]['username'] == user_name): complete_flag = 1 #检查是否有文件 if not(submit_list[k]['file_name'] == ''): file_flag = 1 file_name = submit_list[k]['file_name'] if(complete_flag == 1): msg += f"{user_name}" else: continue if(file_flag == 1): msg += f"-{file_name[10:]}\n" else: msg += "\n" goapi.sendMsg(user_id,msg) elif('成员' in message): user_list = dbconn.get_userinfo(user_class) msg = f"{user_class}\n" for i in range(0,len(user_list)): msg += f"{user_list[i]['user_name']} 次数:{user_list[i]['user_count']}\n" msg += f"共计{len(user_list)}人" goapi.sendMsg(user_id,msg) elif('打包' in message): pid = message.split('@')[1] project_class = dbconn.get_project(pid)['user_class'] if not(project_class == user_class): goapi.sendMsg(user_id,f"该项目归属于{project_class},您注册在{user_class},暂无管理权限。") return comp_ret = archive_proj_files(pid) goapi.sendMsg(user_id,f"----打包完毕----\n项目id:{pid}\n有效文件:{comp_ret['file_num']}\n下载地址:https://cloud1.catop.top:8002/ClassAlert/compressed/{comp_ret['file_name']}") else: goapi.sendMsg(user_id,'/alert\n新建@项目标题@项目描述\n提醒@项目id\n成员\n统计@项目id\n打包@项目id') except Exception as err: goapi.sendMsg(user_id,f'错误{err}\n文件:{err.__traceback__.tb_frame.f_globals["__file__"]}\n行数{err.__traceback__.tb_lineno}') else: pass else: goapi.sendMsg(user_id,'您暂无管理员权限,请联系加入') return