def record_text_msg(msg): """ 监听群的文字聊天记录并处理艾特我的信息 :param msg: :return: """ from_group_id_ = msg['FromUserName'] # 收到消息的群的标识 group_name = msg['User']['NickName'] # 群名 custom_logger.debug('收到一条%s群的消息:%s' % (group_name, msg['Content'])) # 2018.8.17 只记录本群的聊天记录; 2018.8.21 增加我发出去的消息的判断 if from_group_id_ == money_notify_groups or msg[ 'ToUserName'] == money_notify_groups: custom_logger.debug(u"记录败友群聊天记录...%s" % money_notify_groups) # 处理艾特我的信息,给予简单自动回复 match_groups = re.search(r'(兄弟|西大|读书|广州|胡吃海喝|深圳)', group_name, re.M | re.I) if match_groups is None: # 只处理上述群 return if msg['IsAt']: at_msg_counter[from_group_id_] += 1 reply_msg = deal_at_msg(from_group_id_) if reply_msg: itchat.send(reply_msg, from_group_id_)
def download_pictures(msg): """ 处理群聊图片 :param msg: 源消息对象 :return: """ if msg['FileName'].endswith('.gif'): # 不要gif图片 return # 群名 group_name = msg['User']['NickName'] custom_logger.info('收到一个文件: %s' % group_name) filter_groups = re.search(r'(达令|电商|开发|答疑|咨询|讨论|配送|系)', group_name, re.M | re.I) if filter_groups is None: # 不在上述过滤词内 msg['Text'](msg['FileName']) # 先下载至本地,分析结束再决定是否删除 type_symbol = { PICTURE: 'img', VIDEO: 'vid', }.get(msg.type, 'fil') custom_logger.debug('@%s@%s' % (type_symbol, msg.fileName)) custom_logger.info('文件来自群:%s' % group_name) reply_msg = generate_reply_msg(msg.fileName, msg['ActualNickName']) if reply_msg: custom_logger.info(reply_msg) else: custom_logger.info("此群不用回复!")
def guess_person_action(num, res_list): """ 根据照片猜测人的行为 :param num: 人的数量 :param res_list: 服务器返回的json结果 :return: 回复内容 """ custom_logger.info("识别出的人数:%s" % num) custom_logger.debug(res_list['faceList']) if num == 1: score = res_list['faceList'][0]['beauty'] # 颜值 sex = res_list['faceList'][0]['gender'] # 性别 if score > 90: return [ '这个美女的简直亮瞎了我的双眼', '这颜值,至少95分,啧啧', '美,比杨幂都美!', '经过大数据分析,此人有入选全球最美脸蛋的潜质' ][random.randint(4)] if sex < 50 else '这个超级大帅哥是谁?请收下我的膝盖' if sex < 50 and (75 < score <= 90): return ['经鉴定,美女一枚', '看到美女一天心情就好了', '你们觉得这个姑娘美不美?'][random.randint(3)] else: custom_logger.info('要么是男的,要么是长的丑,不理会,嘿嘿...') if num == 2: return ['这两个人是谁呀?', '看着眼熟', '他们两个在干啥?', '二人行必有一照'][random.randint(4)] if 2 < num <= 5: # 人多就PK颜值,让大家对话题感兴趣 tmp_msg = res_list['imageStory'] if res_list['bestLoc'] != -1: # 如果发现美女(因为后台程序只计算了女性)就不用默认的内容 tmp_msg = [ '有没有觉得左起第%d颜值特别高啊?', '感觉第%d个是个大美女', '经过大数据分析,第%d最受宅男欢迎' ][random.randint(3)] % (res_list['bestLoc'] + 1) return tmp_msg if num > 5: return ['好热闹啊~', '好多人', '人多热闹', '一言不合就合照'][random.randint(4)] return ''
def receive_red_packet(msg): """ 监听群内红包消息 :param msg: :return: """ if u"收到红包" in msg['Content']: custom_logger.info(u'收到一个群红包') group_name = msg['User']['NickName'] # 群名 global money_notify_groups, groups if len(money_notify_groups) == 0: # 因为群组搜索会产生网络请求,所以只在第一次搜索 groups = itchat.get_chatrooms(update=True) users = itchat.search_chatrooms(name=u'败友') # 把红包消息通知给这个群 money_notify_groups = users[0]['UserName'] # 获取这个群的唯一标示 custom_logger.info(money_notify_groups) if msg['FromUserName'] == money_notify_groups: # 2018.8.6 过滤本群的红包通知 custom_logger.info(u"同一个群的红包不通知...") return match_groups = re.search(r'(兄弟|西大|读书|广州|胡吃海喝|深圳)', group_name, re.M | re.I) if match_groups: msgbody = u'"%s"群红包,@Tonny @All' % group_name itchat.send(msgbody, toUserName=money_notify_groups) # 告诉指定的好友群内有红包 if '胡吃海喝' in group_name: custom_logger.foodie_warn("胡吃海喝", "收到红包") custom_logger.debug(msg) else: custom_logger.info("此群红包不用通知那帮二货...") filter_groups = re.search(r'(达令|电商|珠海)', group_name, re.M | re.I) if filter_groups is None: # 不在上述过滤词内 notify_user.send(u'"%s"群红包' % group_name) # 通知我自己的小号
def get_tag(text, cnt): """ 关键词统计函数 :param text: 待解析字符串 :param cnt: 计数器 :return: """ text = re.sub(r"\[.*\]", "", text) # 用正则表达式去掉表情符号 text = re.sub(r"@\S+?\s+", "", text) # 去掉艾特的用户信息部分 custom_logger.info('正在分析句子:%s' % text) tag_list = jieba.analyse.extract_tags(text) # 关键词提取模式 # tag_list = jieba.cut(text, cut_all=False) # 直接切词模式 custom_logger.info(tag_list) for tag in tag_list: cnt[tag] += 1 custom_logger.debug(cnt)
def is_at_too_many(to_group): """ 判断短时间是否被艾特多次 :param to_group: 所在群 :return: True - 恶意艾特,False - 非恶意 """ now = time.time() custom_logger.debug(at_msg_counter) custom_logger.debug(first_at_time) at_num = at_msg_counter[to_group] at_time = first_at_time[to_group] if (now - at_time) <= 90: # 设1.5分钟为监测期限 if at_num >= 5: return True else: # 超过监测期限重置@状态为第一条 at_msg_counter[to_group] = 1 return False