Пример #1
0
def event_keywords(group_id, sender_name, content):
    """
    群聊内容关键词检测
    :param group_id:
    :param sender_name:
    :param content:
    :return:
    """
    group_table = users.UserInfo().db[settings.groups_table]
    keywords = list(
        group_table.find({'group_id': group_id}, {
            '_id': 0,
            'keywords': 1
        }))
    if 'keywords' in keywords[0]:
        keywords = keywords[0]['keywords']
    else:
        return
    items = list(users.UserInfo().db[settings.auto_response_table].find(
        {'group_id': group_id}, {
            '_id': 0,
            'keywords': 1,
            'reply': 1
        }))

    for keyword in keywords:
        if keyword in content:
            for item in items:
                if keyword in item['keywords']:
                    itchat.send_msg(
                        '@{}\n{}'.format(sender_name, item['reply']), group_id)
                    break
            break
Пример #2
0
 def get(self, user_name, *args, **kwargs):
     mongo_obj = users.UserInfo().db
     groups = mongo_obj[settings.groups_table].find(
         {'user_name': user_name}, {
             '_id': 0,
             'group_name': 1,
             'group_id': 1
         })
     welcome_words = list(mongo_obj[settings.groups_table].find(
         {
             'user_name': user_name,
             'welcome_words': {
                 '$exists': True
             }
         }, {
             '_id': 0,
             'group_name': 1,
             'group_id': 1,
             'welcome_words': 1
         }))
     self.render('welcome.html',
                 user_name=user_name,
                 groups=groups,
                 server_host=settings.server_host,
                 server_port=settings.server_port,
                 welcome_words=welcome_words)
Пример #3
0
    def get(self, user_name, *args, **kwargs):
        user_name = user_name
        base_path = '../static/qrcs/'

        table = users.UserInfo().table
        try:
            is_first = table.find({'user_name': user_name}, {
                'is_first': 1,
                '_id': 0
            })[0]['is_first']
        except:
            return

        if not is_first:
            self.redirect('/u/{}/control'.format(user_name))
        else:
            # 将没有绑定的小助手,随机选择一个二维码, 文件名,
            robot_name = 'robot1'
            qrc_path = base_path + 'qrc1.png'

            # 生成验证码
            captcha_num = ''.join(
                [str(random.randint(1, 9)) for x in range(4)])
            self.render('init.html',
                        qrc_path=qrc_path,
                        captcha_num=captcha_num,
                        websocket_host=settings.websocket_host,
                        control_url=settings.control_url)
            print(user_name, qrc_path, captcha_num)
            # 将验证码及用户名存入redis
            self.captcha_to_redis(robot_name, user_name, captcha_num)
Пример #4
0
    def post(self, *args, **kwargs):
        # 返回信息 error_type 1---- 输入密码不一致;2----用户名已存在;3----手机号已存在
        msg = {'is_success': 0, 'error_type': 1, 'info': ''}
        dct = {}
        dct['user_name'] = self.get_argument('user_name')
        dct['pwd'] = self.get_argument('pwd')
        dct['repwd'] = self.get_argument('repwd')
        dct['phone'] = self.get_argument('phone')
        dct['is_first'] = 1

        if dct['pwd'] != dct['repwd']:
            msg['info'] = '两次密码不一致'
            self.write(msg)
            return
        user_info = users.UserInfo()
        result_user_name = user_info.check_is_exist(
            **{'user_name': dct['user_name']})
        if not result_user_name:
            msg['error_type'] = 1
            msg['info'] = '用户名已存在'
            self.write(msg)
            return
        result_phone = user_info.check_is_exist(**{'phone': dct['phone']})
        if not result_phone:
            msg['error_type'] = 2
            msg['info'] = '该手机号已注册'
            self.write(msg)
            return
        msg['is_success'] = 1
        msg['error_type'] = 0
        user_info.insert(**dct)
        msg['info'] = '注册成功'
        self.write(msg)
Пример #5
0
def deal_with_friend(msg):
    # 验证码处理
    conn_redis = redis.Redis(host=settings.redis_host,
                             password=settings.redis_pwd,
                             db=13)
    dct = json.loads(conn_redis.get(robot_name).decode())
    captcha_num = dct['captcha_num']
    user_name = dct['user_name']
    add_friend_compile = re.compile(str(captcha_num))
    u_id = msg['RecommendInfo']['UserName']
    if add_friend_compile.search(msg['Content']) is not None:
        itchat.add_friend(**msg['Text'])  # 自动将新好友的消息录入,不需要重载通讯录

        # 调用websocket 发送 跳转命令
        info_dct = settings.make_info(robot_name,
                                      to_user=user_name,
                                      msg=u_id,
                                      msg_type=4,
                                      is_success=1)
        ws.send(info_dct)

        # 发送欢迎语
        itchat.send_msg('我是鲲鲲 \n喜欢唱\t跳\tRAP\t打篮球 ',
                        msg['RecommendInfo']['UserName'])
        itchat.send_image('cxk.jpg', msg['RecommendInfo']['UserName'])

        # 添加助手成功--->更改用户表,添加小助手名称信息--->更改is_first参数---->创建相关对应表
        db = users.UserInfo()
        db.table.update({'user_name': user_name}, {
            '$set': {
                'robot_name': robot_name,
                'is_first': 0,
                'wechat_id': u_id
            }
        })
Пример #6
0
 def post(self, *args, **kwargs):
     dct = {}
     msg = {'is_success': 0, 'info': '账户名或密码错误'}
     dct['user_name'] = self.get_argument('user_name')
     dct['pwd'] = self.get_argument('pwd')
     user_info = users.UserInfo()
     is_exist = user_info.check_is_exist(**dct)
     if not is_exist:
         msg['is_success'] = 1
         self.write(msg)
     else:
         self.write(msg)
Пример #7
0
    def send_romms(job_id, groups_id, content):
        print('调度任务执行')
        job_table = users.UserInfo().db[settings.jobs_table]
        try:
            for group_id in groups_id:
                itchat.send_msg(content, group_id)

            # 更改任务状态--发送成功
            job_table.update({'job_id': job_id}, {'$set': {'status': 1}})
        except:
            pass
            # 更改任务状态--发送失败
            job_table.update({'job_id': job_id}, {'$set': {'status': 2}})
Пример #8
0
 def post(self, *args, **kwargs):
     set_type = self.get_argument('set_type')
     group_id = self.get_argument('group_id')
     table = users.UserInfo().db[settings.groups_table]
     func_dct = {
         'stop': self.stop,
         'delete': self.delete,
         'start': self.start
     }
     if set_type in func_dct:
         func_dct[set_type](table, group_id)
     else:
         self.write({'status': 0, 'info': '未知操作'})
Пример #9
0
 def get(self, user_name, *args, **kwargs):
     print(user_name)
     db = users.UserInfo().db[settings.groups_table]
     group_list = [
         x for x in db.find({'user_name': user_name}, {
             '_id': 0,
             'group_name': 1,
             'group_id': 1
         })
     ]
     self.render('control.html',
                 websocket_host=settings.websocket_host,
                 group_list=group_list,
                 user_name=user_name)
Пример #10
0
 def post(self, *args, **kwargs):
     do = self.get_argument('set_type')
     response_info_id = self.get_argument('response_info_id')
     table = users.UserInfo().db[settings.auto_response_table]
     func_dct = {
         'stop': self.stop,
         'delete': self.delete,
         'start': self.start,
         'update': self.update
     }
     if do in func_dct:
         func_dct[do](table, response_info_id)
     else:
         self.write({'status': 0, 'info': '未知操作'})
Пример #11
0
 def get(self, user_name, *args, **kwargs):
     mongo_obj = users.UserInfo().db
     groups = mongo_obj[settings.groups_table].find(
         {'user_name': user_name}, {
             '_id': 0,
             'group_name': 1,
             'group_id': 1
         })
     keywords = []
     self.render('auto_response.html',
                 user_name=user_name,
                 groups=groups,
                 server_host=settings.server_host,
                 server_port=settings.server_port,
                 keywords=keywords)
Пример #12
0
    def post(self, user_name, *args, **kwargs):
        groups = self.get_argument('groups')
        words = self.get_argument('words')
        switch = self.get_argument('switch')
        words_type = self.get_argument('words_type')
        table = users.UserInfo().db[settings.groups_table]
        table.update({'group_id': {
            '$in': groups
        }}, {
            '$set': {
                settings.words_dict[words_type][0]: words,
                settings.words_dict[words_type][1]: switch,
            }
        },
                     multi=True)

        print(groups, words, switch, words_type)
Пример #13
0
    def post(self, user_name, *args, **kwargs):
        group_ids = self.get_argument('groups').split(',')
        welcome_words = self.get_argument('welcome_words')
        frequence = int(self.get_argument('frequence'))
        mongo_obj = users.UserInfo().db

        for group_id in group_ids:
            mongo_obj[settings.groups_table].update({'group_id': group_id}, {
                '$set': {
                    'welcome_words': welcome_words,
                    'frequence': frequence,
                    'switch': 'on'
                }
            })

        print(welcome_words)
        print(group_ids)
        self.write({'msg': 'success'})
Пример #14
0
 def post(self, *args, **kwargs):
     group_id = self.get_argument('group_id')
     user_name = self.get_argument('user_name')
     db = users.UserInfo().db[settings.member_ids_table.format(user_name)]
     members = [
         x for x in db.find(
             {
                 'group_id': group_id,
                 'quit_time': {
                     '$exists': False
                 }
             }, {
                 '_id': 0,
                 'member_id': 1,
                 'member_name': 1
             })
     ]
     self.write({'members': members})
Пример #15
0
    def post(self, user_name, *args, **kwargs):
        group_ids = self.get_argument('group_ids').split(',')
        keywords = self.get_argument('keywords')
        reply = self.get_argument('reply')

        mongo_obj = users.UserInfo().db
        mongo_obj[settings.auto_response_table].create_index('md5',
                                                             unique=True)

        for group_id in group_ids:
            md5 = make_md5(reply + group_id)
            mongo_obj[settings.auto_response_table].insert({
                'md5':
                md5,
                'reply':
                reply,
                'group_id':
                group_id,
                'user_name':
                user_name
            })

        for keyword in keywords.split(','):
            for group_id in group_ids:
                md5 = make_md5(reply + group_id)
                mongo_obj[settings.groups_table].update(
                    {'group_id': group_id},
                    {'$addToSet': {
                        'keywords': keyword
                    }},
                    multi=True)
                mongo_obj[settings.auto_response_table].update({'md5': md5}, {
                    '$addToSet': {
                        'keywords': keyword
                    },
                    '$set': {
                        'switch': 'on'
                    }
                },
                                                               multi=True)
        print(keywords)
        print(group_ids)
        print(reply)
        self.write({'msg': 'success'})
Пример #16
0
    def activity(self):
        db = users.UserInfo().db
        user_name = self.get_argument('user_name')

        # 数据时间段
        start_time = self.get_argument('start_time')
        end_time = self.get_argument('end_time')

        group_table = db[settings.groups_table]
        member_table = db[settings.member_ids_table.format(user_name)]
        dialogue_table = db[settings.dialogue_history_table.format(user_name)]
        print('activity')
        # 总群数
        groups_count = group_table.find({'user_name': user_name}, {}).count()
        # 总用户数
        member_count = len(member_table.distinct('member_id'))
        # 当日入群人数, 历史退群人数
        member_join_count = member_table.find({
            'join_time': {
                '$regex': '{}.+'.format(get_time().split()[0])
            }
        }).count()
        member_quit_count = member_table.find({
            'quit_time': {
                '$exists': True
            }
        }).count()
        # 群消息数
        msg_count = dialogue_table.find().count()
        # 发言人数

        # 消息数据  每天,对应总消息数,默认为一周

        # 消息类型占比    文本、图片、链接、小程序、其他 各种消息类型占比

        # 用户占比  每天对应的,群总人数、活跃人数

        # 分时消息分布   最近一周内,每个小时内的总消息量

        self.success()
Пример #17
0
 def post(self, *args, **kwargs):
     user_name = self.get_argument('user_name')
     group_id = self.get_argument('group_id')
     page_num = int(self.get_argument('page_num'))
     print('history handler')
     print(user_name, group_id, page_num)
     mongo_obj = users.UserInfo().db
     results = mongo_obj[settings.dialogue_history_table.format(
         user_name)].find({
             'group_id': group_id
         }, {
             '_id': 0,
             'sender_name': 1,
             'content': 1,
             'send_time': 1,
             'sender_id': 1
         }).sort([('send_time', -1)
                  ]).limit(settings.dialogue_history_length).skip(
                      (page_num - 1) * settings.dialogue_history_length)
     datas = [item for item in results]
     print(datas)
     self.write(json.dumps({'datas': datas}))
Пример #18
0
    def post(self, user_name, *args, **kwargs):
        """
        定时群发处理, 获取用户对应的机器人名称,存储到mongo 同时 redis 发布任务
        """
        dct = {}
        dct['groups_id'] = self.get_argument('groups_id')  # 群id列表
        dct['content'] = self.get_argument('content')  # 发送内容
        # material_id = self.get_argument('material_id')      # 素材ID 列表
        dct['send_month'] = self.get_argument('send_month')  # 发送时间
        dct['send_day'] = self.get_argument('send_day')
        dct['send_hour'] = self.get_argument('send_hour')
        dct['send_minute'] = self.get_argument('send_minute')
        dct['job_id'] = make_md5(''.join(
            [str(value) for key, value in dct.items()]))

        # 任务状态 0--未发送,1--发送成功,2--发送失败。 默认为0, 未发送
        dct['status'] = 0

        db = users.UserInfo().db

        # 查询用户对应robot
        user_table = db[settings.user_info_table]
        robot_name = user_table.find({'user_name': user_name},
                                     {'robot_name': 1})

        # 查询素材id对应素材内容

        # 增加任务状态
        jobs_table = db[settings.jobs_table.format(user_name)]
        jobs_table.insert(dct)

        # redis发布任务
        conn_redis = redis.Redis(host=settings.redis_host,
                                 password=settings.redis_pwd)
        job_info = json.dumps(dct)
        conn_redis.publish(robot_name, job_info)

        print(dct)
Пример #19
0
def event_welcome(user_name, new_member_names, chatroom_id):
    """
    群新成员欢迎
    :param user_name: 机器人绑定的用户id @。。。。。
    :param sender_id: 群新成员id @。。。。。
    :param chatroom_id: 群id @@。。。。。
    :return: none
    """
    group_table = users.UserInfo().db[settings.groups_table]
    welcome_info = list(
        group_table.find(
            {
                'user_name': user_name,
                'group_id': chatroom_id,
                'switch': 'on'
            }, {
                'welcome_words': 1,
                'frequence': 1
            }))
    if not welcome_info:
        return
    welcome_info = welcome_info[0]
    welcome_words = welcome_info['welcome_words']
    welcome_frequence = int(welcome_info['frequence']) * 60  # 换算为秒

    conn_redis = redis.Redis(host=settings.redis_host,
                             password=settings.redis_pwd,
                             db=13)
    is_exists = conn_redis.exists(chatroom_id)
    if is_exists:
        return
    else:
        print(welcome_words)
        itchat.send_msg('@' + new_member_names + '\n' + welcome_words,
                        chatroom_id)
        conn_redis.set(chatroom_id, 'send', ex=welcome_frequence)
Пример #20
0
def update_members():
    """
    监听群成员变化
    :return:
    """
    rooms = itchat.get_chatrooms()

    db = users.UserInfo().db
    user_name = list(db[settings.user_info_table].find(
        {'robot_name': robot_name}, {
            '_id': 0,
            'user_name': 1
        }))[0]['user_name']
    member_table = db[settings.member_ids_table.format(user_name)]

    for room in rooms:
        room_id = room['UserName']
        members = room['MemberList']
        member_now_ids = [info['UserName'] for info in members]
        member_exsits_ids = [
            member['member_id'] for member in member_table.find(
                {'group_id': room_id}, {'member_id': 1})
        ]
        new_members_id = [
            member for member in member_now_ids
            if member not in member_exsits_ids
        ]
        new_members_name = ','.join([
            info['NickName'] for info in members
            if info['UserName'] in new_members_id
        ])
        new_member_info = [
            info for info in members if info['UserName'] in new_members_id
        ]

        # print([new_members_name])

        for member in members:
            member_id = member['UserName']
            member_name = member['NickName']
            # print(member_id, user_name)
            member_table.update({
                'group_id': room_id,
                'member_id': member_id
            }, {'$set': {
                'member_name': member_name
            }})
        # member_table.remove({'member_id': {'$nin': member_now_ids}, 'group_id': room_id})
        member_table.update(
            {
                'member_id': {
                    '$nin': member_now_ids
                },
                'group_id': room_id
            }, {'$set': {
                'quit_time': get_time()
            }})

        if new_members_id:
            event_welcome(user_name, new_members_name, room_id)

        for info in new_member_info:
            dct = {}
            dct['member_id'] = info['UserName']
            dct['member_name'] = info['NickName']
            dct['group_id'] = room_id
            dct['join_time'] = get_time()
            member_table.insert(dct)
            if os.path.isfile(settings.head_imgs_dir.format(info['UserName'])):
                continue
            itchat.get_head_img(userName=info['UserName'],
                                chatroomUserName=room_id,
                                picDir=settings.head_imgs_dir.format(
                                    info['UserName']))
Пример #21
0
        self.success()

    def word_frequency(self):
        print('frequency')
        self.success()

    def success(self):
        self.write({'status': 1})

    def error(self, info):
        self.write({'status': 0, 'info': info})


if __name__ == '__main__':
    db = users.UserInfo().db
    user_name = 'test2'
    group_table = db[settings.groups_table]
    member_table = db[settings.member_ids_table.format(user_name)]
    dialogue_table = db[settings.dialogue_history_table.format(user_name)]

    member_join_count = member_table.find({
        'join_time': {
            '$regex': '{}.+'.format(get_time().split()[0])
        }
    }).count()
    member_quit_count = member_table.find({
        'quit_time': {
            '$exists': True
        }
    }).count()
Пример #22
0
def group_reply_text(msg):
    # 消息来自于哪个群聊
    chatroom_id = msg['FromUserName']
    to_user_name = msg['ToUserName']
    if '@@' not in chatroom_id:
        return

    # 发送者的昵称
    username = msg['ActualNickName']
    # 当前群名称
    chatroom_name = msg['User']['NickName']
    # 发信人微信id
    sender_id = msg['ActualUserName']

    print(json.dumps(msg))
    print(chatroom_name, chatroom_id, to_user_name, sep='***********')

    obj = users.UserInfo()
    user_name = obj.table.find({'robot_name': robot_name}, {
        '_id': 0,
        'user_name': 1
    })[0]['user_name']

    member_table = settings.member_ids_table.format(user_name)
    # sender_name = obj.db[member_table].find({'member_id': sender_id}, {'member_name': 1})[0]['member_name']
    sender_name = username

    msg_type = 1
    if msg['Type'] == TEXT:
        content = msg['Content']
    elif msg['Type'] == 'Picture':
        msg_type = 2

    #############敏感词判断#####################

    #############敏感词判断#####################

    elif msg['AppMsgType'] == 5:
        msg_type = 3
        # 判断是否开启链接监测
        switch = 'on'
        if switch == 'on':
            print('分享链接')
            return
    elif msg['AppMsgType'] == 33:
        msg_type = 4
        # 判断是否开启小程序监测
        switch = 'on'
        if switch == 'on':
            print('小程序类型')
            return

    # 根据消息类型转发至其他群
    if msg['Type'] == TEXT:
        info_dct = settings.make_info(robot_name,
                                      to_user=user_name,
                                      msg=content,
                                      msg_type=2,
                                      is_success=0,
                                      sender_id=sender_id,
                                      sender_name=sender_name,
                                      group_id=chatroom_id)
        try:
            ws.send(info_dct)
        except:
            pass
        # itchat.send('%s' % (content), chatroom_id)

    # 保存聊天记录
    obj.db[settings.dialogue_history_table.format(user_name)].create_index(
        'send_time')
    obj.db[settings.dialogue_history_table.format(user_name)].insert({
        'user_name':
        user_name,
        'group_name':
        chatroom_name,
        'sender_name':
        sender_name,
        'group_id':
        chatroom_id,
        'sender_id':
        sender_id,
        'content':
        content,
        'msg_type':
        msg_type,
        'send_time':
        get_time(),
        'timestamp':
        int(time.time())
    })

    # 更新群成员头像、昵称信息
    member_list = msg['User']['MemberList']
    member_info_list = []
    for member in member_list:
        dct = {}
        dct['member_id'] = member['UserName']
        dct['member_name'] = member['NickName']
        dct['group_id'] = chatroom_id
        member_info_list.append(dct)

    member_exists_ids = [
        info_dict['member_id']
        for info_dict in obj.db[member_table].find({'group_id': chatroom_id}, {
            '_id': 0,
            'member_id': 1
        })
    ]
    update_info = [
        info for info in member_info_list
        if info['member_id'] not in member_exists_ids
    ]

    for info in update_info:
        obj.db[member_table].insert(info)
        if os.path.isfile(settings.head_imgs_dir.format(info['member_id'])):
            continue
        itchat.get_head_img(userName=info['member_id'],
                            chatroomUserName=chatroom_id,
                            picDir=settings.head_imgs_dir.format(
                                info['member_id']))

    # 更新用户绑定的群信息
    table = obj.db[settings.groups_table]
    group_ids = [
        item['group_id'] for item in table.find({'user_name': user_name}, {
            '_id': 0,
            'group_id': 1
        })
    ]
    if chatroom_id not in group_ids:
        table.insert({
            'user_name': user_name,
            'group_name': chatroom_name,
            'group_id': chatroom_id,
            'link_existed_info': settings.link_existed_info,
            'switch_link': 'off',
            'pro_existed_info': settings.pro_existed_info,
            'switch_pro': 'off',
            'sensitive_word_exsited_info':
            settings.sensitive_word_exsited_info,
            'switch_sensitive_word': 'off'
        })

    # print(msg['Content'], msg['Type'], chatroom_id, sep='\n')

    # 列表不为空,则有新成员进入
    if update_info:
        new_member_names = ','.join(
            [member['member_name'] for member in update_info])
        event_welcome(user_name, new_member_names, chatroom_id)

    event_keywords(chatroom_id, sender_name, content)