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
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)
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)
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)
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 } })
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)
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}})
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': '未知操作'})
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)
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': '未知操作'})
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)
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)
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'})
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})
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'})
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()
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}))
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)
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)
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']))
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()
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)