Example #1
0
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)
Example #2
0
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)
Example #3
0
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, "无管理权限")
Example #4
0
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)
Example #5
0
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
Example #6
0
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)
Example #7
0
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
Example #8
0
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
Example #9
0
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
Example #10
0
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}'")
Example #11
0
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
Example #12
0
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