async def on_message(self, msg: Message): """listen message event""" self_contact = await self.my_self() from_contact = msg.talker() log.info('below are dict of message: ') log.info(str(msg.__dict__)) quoted, text, mention = split_quote_and_mention(msg.text()) log.info('finish spliting') log.info(f'quoted: {quoted}, text: {text}, mention: {mention}') room = msg.room() to_bot = self_contact.get_id() in msg.payload.mention_ids or\ self_contact.get_id() == msg.payload.to_id or\ self_contact.payload.name == mention conversation: Union[ Room, Contact] = from_contact if room is None else room await conversation.ready() log.info(f'finish preprocess, talker: {from_contact.get_id()}, to_bot: {to_bot}') try: if self.tag_controller.handle_msg(quoted, text, from_contact.get_id(), to_bot): log.info('tag controller found reply') await conversation.say(self.tag_controller.get_reply()) elif self.question_answering.handle_msg(text, to_bot): log.info('question answering found reply') await conversation.say(self.question_answering.get_reply()) elif self.display.handle_msg(text, to_bot): log.info('display found reply') await conversation.say(self.display.get_reply()) except Exception as error: log.info(f'something went wrong for tagging plugin: {error}')
async def on_message(self, msg: Message): """listen message event""" from_contact = msg.talker() text = msg.text() room = msg.room() if room is None: return if text in ['#ding', 'dong']: if room.room_id not in self.room_data: self.room_data[room.room_id] = {'__status__': 'running'} await self.re_init_job(room.room_id) if text == '#ding': self.room_data[room.room_id]['__ding__'] = True if text == '#ding start': self.room_data[room.room_id] = {'__status__': 'running'} await room.say('#ding') await self.re_init_job(room.room_id) if text == 'dong': if room.room_id in self.room_data: self.room_data[room.room_id][from_contact.contact_id] = { 'id': from_contact.contact_id, 'time': datetime.now(), 'name': from_contact.name, } # refresh the scheduler job await self.re_init_job(room.room_id)
async def on_message(self, msg: Message): """listen message event""" talker = msg.talker() room = msg.room() conversation_id = room.room_id if room else talker.contact_id # 1. TODO: use finder to match Room/Contact if conversation_id not in self.conversation_ids: return # only process the plain text message if msg.type() != MessageType.MESSAGE_TYPE_TEXT: return rasa_response = requests.post( self.endpoint, json=dict( sender=conversation_id, message=msg.text() ) ) messages: List[dict] = rasa_response.json() if len(messages) == 0: return conversational: Union[Room, Contact] = room if room else talker for message in messages: msg_text = message.get('text', None) if not msg_text: continue await conversational.say(msg_text)
async def api_filter(msg: Message, from_contact: Contact): flag = 0 if msg.type() == MessageType.MESSAGE_TYPE_TEXT: result = request(text_url, urlencode({'text': msg.text()})) result = json.loads(result) if result['conclusion'] == '不合规' or '疑似': try: flag = 1 word = result['data'][0]['msg'] await msg.say(word) await msg.say(f"用户@{from_contact.name}违规") except Exception as e: print("合规") flag = 0 elif msg.type() == MessageType.MESSAGE_TYPE_IMAGE: img = await msg.to_file_box() if not os.path.exists(f'./img/{img.name}'): await img.to_file(f'./img/{img.name}') result = request(image_url, urlencode({'image': base64.b64encode(read_file(f'./img/{img.name}'))})) result = json.loads(result) if result['conclusion'] == '不合规' or '疑似': try: flag = 1 word = result['data'][0]['msg'] await msg.say(word) await msg.say(f"用户@{from_contact.name}违规") except Exception as e: print('合规') flag = 0 if flag == 0: print("api检测没毛病") return flag
async def on_message(self, msg: Message): """listen message event""" self_contact = await self.my_self() from_contact = msg.talker() quoted, text, mention = split_quote_and_mention(msg.text()) room = msg.room() to_bot = self_contact.get_id() in msg.payload.mention_ids or\ self_contact.get_id() == msg.payload.to_id or\ self_contact.payload.name == mention conversation: Union[Room, Contact] = from_contact if room is None else room await conversation.ready() if isinstance(conversation, Contact): if not to_bot: return if self.language == 'zh': # await conversation.say('成员管理功能必须在群聊中使用') pass else: await conversation.say('Not work if not in chat room') return member_count = len(await conversation.member_list()) # real people >= 4, 3 thumbsdown needed, 3 => 2, 2 => 1 counts_limit = 3 if member_count > 4 else member_count // 2 if text.strip() == self.thumbsdown: time_delta = datetime.now() - self.date[mention] if self.counts[mention] != 0 and time_delta > timedelta(hours=12): self.counts[mention] = 0 # former thumbsdown expired self.counts[mention] = self.counts[mention] + 1 self.date[mention] = datetime.now() if self.language == 'zh': await conversation.say( f'成员{mention}目前已经被踩{self.counts[mention]}次,' f'被踩{counts_limit}次的成员将被移出群聊') else: await conversation.say( f'thumbsdown of {mention} is currently {self.counts[mention]}, ' f'member with thumbsdown to {counts_limit} ' 'will be removed from chat') if self.counts[mention] >= counts_limit: removed_contact = Contact.load(msg.payload.mention_ids[0]) await removed_contact.ready() await conversation.delete(removed_contact) if self.language == 'zh': await conversation.say(f'{removed_contact.name}已被移出群聊') else: await conversation.say( f'{removed_contact.name} is removed from chat') print(msg.__dict__)
async def on_message(self, msg: Message): """listen message event""" from_contact = msg.talker() text = msg.text() room = msg.room() if text == '#ding': conversation: Union[ Room, Contact] = from_contact if room is None else room conversation_id = from_contact.contact_id if room is None \ else room.room_id if self.can_send_dong(conversation_id): await conversation.ready() await conversation.say('dong')
async def on_message(self, msg: Message): """listen message event""" from_contact = msg.talker() text = msg.text() room = msg.room() if text == '#ding': conversation: Union[ Room, Contact] = from_contact if room is None else room await conversation.ready() await conversation.say('dong') file_box = FileBox.from_url( 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/' 'u=1116676390,2305043183&fm=26&gp=0.jpg', name='ding-dong.jpg') await conversation.say(file_box)
async def on_message(self, msg: Message): """listen message event""" from_contact = msg.talker() text = msg.text() room = msg.room() if text == '今天天气如何': conversation: Union[ Room, Contact] = from_contact if room is None else room await conversation.ready() response = requests.get('https://tianqiapi.com/api?version=v61&' 'appid=32896971&appsecret=5bR8Gs9x') result = response.json() result_msg = f'今天{result["wea"]} 最低温度{result["tem2"]}度 ' \ f'最高温度{result["tem1"]}度' await conversation.say(result_msg)
async def on_message(self, msg: Message): """check the keyword and reply to talker""" conversation: Union[ Room, Contact] = msg.room() if msg.room() else msg.talker() await conversation.ready() text = msg.text() # find the match rules for matcher, rules in self.rule_map.items(): is_match = await matcher.match(conversation) if is_match: for rule in rules: if rule.keyword == text: await conversation.say(rule.reply_content)
async def on_message(self, msg: Message): """listen message event""" self_contact = await self.my_self() from_contact = msg.talker() quoted, text, mention = split_quote_and_mention(msg.text()) room = msg.room() to_bot = self_contact.get_id() in msg.payload.mention_ids or\ self_contact.get_id() == msg.payload.to_id or\ self_contact.payload.name == mention conversation: Union[Room, Contact] = from_contact if room is None else room await conversation.ready() try: if self.help.handle_msg(text, to_bot): log.info('help system found reply') await conversation.say(self.help.get_reply()) except Exception as error: log.info(f'something went wrong for help system plugin: {error}')
async def calculatespeak(msg: Message, from_contact: Contact, room: Room, collection): print("对用户发出信息进行对应操作") if room == None: return find_res = find(collection=collection, id=from_contact.contact_id) update(collection, from_contact.contact_id, "speak_num", find_res["speak_num"] + 1) if msg.message_type() == MessageType.MESSAGE_TYPE_IMAGE: update(collection, from_contact.contact_id, "imgs_num", find_res["imgs_num"] + 1)
async def on_message(self, msg: Message): user = msg.talker() text = msg.text() if Judge.is_ask_self_weight(text): msg_ = await Search.search_weight(user) await msg.say(msg_) if Judge.is_ask_self_login(text): user = await Search.create_self(user) if user: await msg.say('成功,欢迎🥳{}'.format(user.name)) if Judge.is_ask_tag_weight(text): text = text.replace(':', ':') text = text.split(':') msg_ = await Search.update_weight(user, tag_weight=float(text[-1])) await msg.say(msg_) if Judge.is_ask_present_weight(text): text = text.replace(':', ':') text = text.split(':') msg_ = await Search.update_weight(user, present_weight=float(text[-1])) await msg.say(msg_) if Judge.is_ask_me(text): await msg.say('我在') if Judge.is_ask_weather(text): text = text.replace("天气", '') URL2 = 'https://geoapi.qweather.com/v2/city/lookup?location={}&key=86bae3f81a9c4af9ae7187b23250dffc'.format( text) resp = requests.get(URL2) city = resp.json() if int(city.get('code', 0)) != 200: await msg.say('找不到这个城市') else: url = 'https://devapi.qweather.com/v7/weather/now?location={}&key=86bae3f81a9c4af9ae7187b23250dffc'.format( city.get('location', [])[0].get('id')) resp = requests.get(url) weather = resp.json() if int(weather.get('code', 0)) != 200: await msg.say('搜索不到该气温') else: msg_ = '{}\n🍁天气:{}\n🍁当前温度为:{}摄氏度\n🍁体感温度为:{}摄氏度'.format( text, weather['now']['text'], weather['now']['temp'], weather['now']['feelsLike']) await msg.say(msg_)
async def on_message(msg: Message): who = msg.talker() # 发消息的人 #设置好微信名,只要是他发的消息就回复 if who.name == 'TTZO': #输入,翻译,模型输出,翻译,发送 tf = fanyi(text, 'zh-CHS2en') robott = module.generate(list(tf)) returns = fanyi(robott[0], 'en2zh-CHS') await msg.say(returns)
async def on_message(msg: Message): """ Message Handler for the Bot """ if msg.text() == 'ding': await msg.say('dong') file_box = FileBox.from_url( 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/' 'u=1116676390,2305043183&fm=26&gp=0.jpg', name='ding-dong.jpg') await msg.say(file_box)
async def on_message(self, msg: Message): """ Message Handler for the Bot """ contact = msg.talker() # 发消息人 content = msg.text() # 消息内容 room = msg.room() # 是否是群消息 contact_name = contact.name if room: # 群聊入口,未做任何处理 if room.room_id == config_list['room_id'] and ( msg.type() == Message.Type.MESSAGE_TYPE_TEXT): print('群聊') room_id = room.room_id print('群名:{},发消息人:{},内容:{}'.format(room_id, contact_name, content)) print('使用API发送群消息') else: dividing_line() print('非群聊') if msg.type() == Message.Type.MESSAGE_TYPE_TEXT: # 处理文本类型消息 if content == 'ding': await sendTextMsgToContact(contact=contact, text="这是自动回复: dong dong dong") elif content == 'hi' or content == '你好' or content == "帮助": info0 = "我是机器人助手--懂懂,很高兴为您服务!\n" info1 = "1.收到'ding',自动回复\n" info2 = "2.收到'帮助',自动回复\n" info3 = "3.收到'小程序'or'微信小程序',自动回复\n" info4 = "4.收到'情话@your_content',自动回复,例如 情话@春天\n" info5 = "5.收到'藏头诗@your_content',自动回复,例如 藏头诗@我喜欢你\n" info6 = "6.收到'city+天气',自动回复,例如 长沙天气\n" help_info = info0 + info1 + info2 + info3 + info4 + info5 + info6 await sendTextMsgToContact(contact=contact, text=help_info) elif content == '小程序' or content == "微信小程序": file_url = 'https://upload-images.jianshu.io/upload_images/10519098-690ae0fde75147a1.png' \ '?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240' await sendMediaMsgToContact(contact=contact, fileUrl=file_url, filePath='') elif '天气' in content: city_name = content[:-2] weather_info = get_weather_data(city_name) await contact.say(weather_info) elif "情话" in content: content = content[3:] res = chat_bot(content=content, mode='1') await contact.say(res) elif "藏头诗" in content: # 藏头诗模式 content = content[4:] res = chat_bot(content=content, mode='2') await contact.say(res) else: res = chat_bot(content=content, mode='0') await contact.say(res) # 处理图片类型消息 elif msg.type() == Message.Type.MESSAGE_TYPE_IMAGE: dividing_line() await contact.say( '不好意思,暂时处理不了图片类型消息,我们已经在催程序员小哥哥日夜加班优化项目了!希望您能够理解!')
async def on_message(self, msg: Message): """ listen for message event """ from_contact = msg.talker() text = msg.text() room = msg.room() to = msg.to() if room is None and to.contact_id == self.contact_id: # say msg to the bot if text == '#status': msg = 'busy' if self.busy else 'free' await from_contact.say( f'My status: {msg}') await from_contact.say(self.auto_reply_comment) elif text == '#free': await from_contact.say('auto reply stopped.') elif text == '#busy': self.busy= True await from_contact.say('auto reply enabled') else: await from_contact.say(self.auto_reply_comment)
async def on_message(self, msg: Message): """check the keyword and reply to talker""" # don't listen in room if msg.room(): return talker = msg.talker() for message_matcher, rules in self.rules.items(): is_match = await message_matcher.match(msg) if is_match: # cache the rooms data rooms = [] for rule in rules: # pytype: disable=attribute-error matched_rooms = await rule.find_rooms(self.bot) rooms.extend(matched_rooms) # invite person to the room for room in rooms: self.welcome_ids[room.room_id].append(talker.contact_id) await room.add(talker)
async def on_message(self, msg: Message): if msg.age() > 3 * 60: log.info( 'Bot' + 'on(message) skip age("%d") > 3 * 60 seconds: "%s"', msg.age(), msg) return room = msg.room() talker = msg.talker() text = msg.text() if not talker: return if msg.is_self(): return if re.search('^ding$', text): if room: if re.search('^ding', await room.topic()): await get_out_room(talker, room) else: try: dingRoom = await self.Room.find('^ding') if dingRoom: log.info('Bot' + 'onMessage: got dingRoom: "%s"' % await dingRoom.topic()) if await dingRoom.has(talker): topic = await dingRoom.topic() log.info( 'Bot' + 'onMessage: sender has already in dingRoom') await dingRoom.say( 'I found you have joined in room "{0}"!'. format(topic), talker) await talker.say( 'no need to ding again, because you are already in room: "{}"' .format(topic)) else: log.info( 'Bot' + 'onMessage: add sender("%s") to dingRoom("%s")' % (talker.name, dingRoom.topic())) await talker.say('ok, I will put you in ding room!' ) await put_in_room(talker, dingRoom) else: log.info( 'Bot' + 'onMessage: dingRoom not found, try to create one') newRoom = await create_ding_room(self, talker) print('create_ding_room id:', newRoom.id) await manage_ding_room(self) except Exception as e: log.exception(e)
async def regex_filter(msg: Message, from_contact: Contact): ''' 正则匹配模块: 1. 匹配`淘口令` 2. 匹配`加QQ`类广告 3. 匹配`加微信`类广告 4. 匹配`身份证号码` 5. 匹配`身份证/密码`得敏感词汇 6. 匹配`汇款`等敏感语句 ''' regex = [r'([\p{Sc}])\w{8,12}([\p{Sc}])', r'(?:[加qQ企鹅号码\s]{2,}|[群号]{1,})(?:[\u4e00-\u9eff]*)(?:[:,:]?)([\d\s]{6,})', r'(?:[加+微++➕薇?vV威卫星♥❤姓xX信]{2,}|weixin|weix)(?:[,❤️.\s]?)(?:[\u4e00-\u9eff]?)(?:[:,:]?)([\w\s]{6,})', r'(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)', r'身份证号码|(?i)(银行卡|账号|QQ)密码', r'(微信|支付宝|银行|账户|银行卡|卡)+[\s\S]*([打钱]|[转账]|[汇款])+[\s\S]*[0-9]*' ] # print("enter regex") reply = ['识别为淘口令', '请不要在群内发QQ广告' + f'@{from_contact.name}', '请不要在群内发wx广告' + f'@{from_contact.name}', '请保护好个人敏感信息' + f'@{from_contact.name}', '请保护好个人敏感信息', '⚠️谨防受骗⚠️' ] flag = 0 for i in range(len(regex)): r = re.compile(regex[i]) if re.search(r, msg.text()): await msg.say(reply[i]) flag = 1 print("1") else: continue if flag == 0: print("正则匹配没毛病") return flag
async def dict_filter(msg: Message, from_contact:Contact): file_name = ["./data/政治.txt", "./data/色情.txt", "./data/广告.txt", "./data/敏感词.txt", "./data/暴恐.txt"] warning = ["不当政治言论", "色情信息", "广告", "敏感信息", "暴力恐怖"] words = jieba.cut(msg.text(), cut_all = False) words = list(words) words = np.array(words) tag = 0 #记录有无违规信息 temp = 0 atrocious_list = [] for k in file_name: flag = 0 #针对每一种具体类别记录有无违规信息 with open(k, 'r', encoding='utf-8') as fr: frrd = np.array(fr.readlines()) for i in frrd: i = i.strip() for j in words: if i == j: flag = 1 tag = 1 if flag: print("内容包含" + warning[temp]) atrocious_list.append(warning[temp]) temp = temp + 1 if tag == 0: print("字典检测没毛病") else: await msg.say(f"亲爱的用户@{from_contact.name},即便不在群中也不能违规,你的言语违规,进行一次警告") admolish_sentence = "你触犯了:" for i in atrocious_list: admolish_sentence += i + ',' await msg.say(admolish_sentence) return tag
async def on_message(self, msg: Message): if msg.age() > 3 * 60: log.info( 'Bot' + 'on(message) skip age("%d") > 3 * 60 seconds: "%s"', msg.age(), msg) return room = msg.room() talker = msg.talker() text = msg.text() if not talker: return if msg.is_self(): return if re.search('^market$', text): if room: if re.search(TOPIC_NAME, await room.topic()): await get_out_room(talker, room) else: try: marketRoom = await self.Room.find(TOPIC_NAME) if marketRoom: log.info('Bot' + 'onMessage: got marketRoom: "%s"' % await marketRoom.topic()) if await marketRoom.has(talker): topic = await marketRoom.topic() log.info( 'Bot' + 'onMessage: sender has already in marketRoom') await talker.say("已加入群组{}".format(topic)) else: log.info( 'Bot' + 'onMessage: add sender("%s") to marketRoom("%s")' % (talker.name, marketRoom.topic())) await talker.say("邀请加入群组") await put_in_room(talker, marketRoom) else: log.info( 'Bot' + 'onMessage: marketRoom not found, try to create one' ) await create_market_room(self, talker) await manage_market_room(self) except Exception as e: log.exception(e)
async def savecontent(msg: Message, from_contact: Contact, room: Room, collection): if room == None: return inserted_msg_dict = {"_id": msg.message_id, "wxid": from_contact.contact_id, "content": "", "type": 0, "time": 0} if msg.type() == MessageType.MESSAGE_TYPE_TEXT: # 文字类型的messgae为1 inserted_msg_dict["type"] = 1 inserted_msg_dict["content"] = msg.text() elif msg.type() == MessageType.MESSAGE_TYPE_IMAGE: img = await msg.to_file_box() await img.to_file(f'./img/{img.name}') # 图片类型的messgae为2 inserted_msg_dict["type"] = 2 inserted_msg_dict["content"] = f"./img/{img.name}" elif msg.type() == MessageType.MESSAGE_TYPE_AUDIO: audio = await msg.to_file_box() await audio.to_file(f'./audio/{audio.name}') # 音频类型的messgae为3 inserted_msg_dict["type"] = 3 inserted_msg_dict["content"] = f"./audio/{audio.name}" elif msg.type() == MessageType.MESSAGE_TYPE_VIDEO: video = await msg.to_file_box() await video.to_file(f'./video/{video.name}') # 视频类型的messgae为4 inserted_msg_dict["type"] = 4 inserted_msg_dict["content"] = f"./video/{video.name}" elif msg.type() == MessageType.MESSAGE_TYPE_ATTACHMENT: file = await msg.to_file_box() await file.to_file(f'./file/{file.name}') # 文件类型的messgae为5 inserted_msg_dict["type"] = 5 inserted_msg_dict["content"] = f"./file/{file.name}" elif msg.type() == MessageType.MESSAGE_TYPE_CONTACT: # contact类型的messgae为6 inserted_msg_dict["type"] = 6 inserted_msg_dict["content"] = f"contact" elif msg.type() == MessageType.MESSAGE_TYPE_EMOTICON: # EMOTICON类型的messgae为7 inserted_msg_dict["type"] = 7 inserted_msg_dict["content"] = f"EMOTICON" else: # 其他类型的msg为8 inserted_msg_dict["type"] = 8 inserted_msg_dict["content"] = "OTHER" inserted_msg_dict["time"] = time.time() if insert(collection, msg.message_id, inserted_msg_dict): print(f"完成如下内容的记录保存{str(inserted_msg_dict)}") else: print("记录失败")
async def on_message(self, msg: Message): """ listen for message event """ from_contact: Contact = msg.talker() text: str = msg.text() room: Optional[Room] = msg.room() msg_type: MessageType = msg.type() file_box: Optional[FileBox] = None if text == '#ding': conversation: Union[ Room, Contact] = from_contact if room is None else room await conversation.ready() await conversation.say('dong') file_box = FileBox.from_url( 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/' 'u=1116676390,2305043183&fm=26&gp=0.jpg', name='ding-dong.jpg') await conversation.say(file_box) elif msg_type == MessageType.MESSAGE_TYPE_IMAGE: logger.info('receving image file') # file_box: FileBox = await msg.to_file_box() image: Image = msg.to_image() hd_file_box: FileBox = await image.hd() await hd_file_box.to_file('./hd-image.jpg', overwrite=True) thumbnail_file_box: FileBox = await image.thumbnail() await thumbnail_file_box.to_file('./thumbnail-image.jpg', overwrite=True) artwork_file_box: FileBox = await image.artwork() await artwork_file_box.to_file('./artwork-image.jpg', overwrite=True) # reply the image await msg.say(hd_file_box) # pylint: disable=C0301 elif msg_type in [ MessageType.MESSAGE_TYPE_AUDIO, MessageType.MESSAGE_TYPE_ATTACHMENT, MessageType.MESSAGE_TYPE_VIDEO ]: logger.info('receving file ...') file_box = await msg.to_file_box() if file_box: await file_box.to_file(file_box.name) elif msg_type == MessageType.MESSAGE_TYPE_MINI_PROGRAM: logger.info('receving mini-program ...') mini_program: Optional[MiniProgram] = await msg.to_mini_program() if mini_program: await msg.say(mini_program) elif text == 'get room members' and room: logger.info('get room members ...') room_members: List[Contact] = await room.member_list() names: List[str] = [ room_member.name for room_member in room_members ] await msg.say('\n'.join(names)) elif text.startswith('remove room member:'): logger.info('remove room member:') if not room: await msg.say('this is not room zone') return room_member_name = text[len('remove room member:') + 1:] room_member: Optional[Contact] = await room.member( query=RoomMemberQueryFilter(name=room_member_name)) if room_member: if self.login_user and self.login_user.contact_id in room.payload.admin_ids: await room.delete(room_member) else: await msg.say('登录用户不是该群管理员...') else: await msg.say( f'can not fine room member by name<{room_member_name}>') elif text.startswith('get room topic'): logger.info('get room topic') if room: topic: Optional[str] = await room.topic() if topic: await msg.say(topic) elif text.startswith('rename room topic:'): logger.info('rename room topic ...') if room: new_topic = text[len('rename room topic:') + 1:] await msg.say(new_topic) elif text.startswith('add new friend:'): logger.info('add new friendship ...') identity_info = text[len('add new friend:') + 1:] weixin_contact: Optional[Contact] = await self.Friendship.search( weixin=identity_info) phone_contact: Optional[Contact] = await self.Friendship.search( phone=identity_info) contact: Optional[Contact] = weixin_contact or phone_contact if contact: self.Friendship.add(contact, 'hello world ...') elif text.startswith('at me'): await msg.say(self.login_user) else: pass
async def on_message(msg: Message): if msg.text() == 'ding': await msg.say('dong')
async def on_message(self, msg: Message): """ listen for msg event. :param msg: received msg. :return: none """ # msg # attrs: # message_id(str) '3037907331459016207' # from_id(str) 'wxid_qgho9l2kdha311' # mention_ids(list) # room_id(str) '' # text(str) '1' # timestamp(int) 1620493045 # to_id(str) 'wxid_vj8wsjhms91j22' # busy-bot: 可以输入特定指令使得机器人不会进行自动回答,可以用于进群验证时的维护状态 from_contact = msg.talker() # attrs: # name(str) 'KIERAN.' # contact_id(str) 'wxid_qgho9l2kdha311' # address '' # alias '' # avatar 'https://wx.qlogo.cn/mmhead/ver_1/NFn8dpgY2taGWzz0jOnZFZ2rMsiaoINkFRuLDRtxTKyFREY56tIrWCXmdHMicB7cQxK7bJXqiajadVnicaM9CrAh0z1krDEpMs8AKEdMoHjaXvw/0' # city '' # friend True # gender 1 # signature '短期计划者' # weixin 'kieran00000' text = msg.text() room = msg.room() to = msg.to() # attrs: # name(str) '随便取个名吧' # contact_id(str) 'wxid_vj8wsjhms91j22' # address '' # alias '' # avatar '' # city '' # friend True # gender 0 # signature '' # weixin '' print(msg.type()) if msg.is_self(): return await savecontent(msg, from_contact, room, self.collection2) await calculatespeak(msg, from_contact, room, self.collection3) # if msg.type() == MessageType.MESSAGE_TYPE_AUDIO: # audio = await msg.to_file_box() # # save the image as local file # await audio.to_file(f'./{audio.name}') # if msg.type() == MessageType.MESSAGE_TYPE_ATTACHMENT: # file = await msg.to_file_box() # await file.to_file(f"./{file.name}") # print("保存文件成功") if msg.type() == MessageType.MESSAGE_TYPE_RECALLED: # recalledMessage = await msg.to_recalled() # 方法有错误,下面自己手写debug得到。 msg_text = msg.text() # recalledMessage = self.Message.load(message_id=msg_text) # await recalledMessage.ready() origin_message_id = re.findall(r'<newmsgid>(.*?)</newmsgid>', msg_text)[0] # recalledMessage = self.Message.find_all(message_id=origin_message_id) recalledMessage = self.Message.load(message_id=origin_message_id) await recalledMessage.ready() log.info('Bot' + f'EVENT: Detect Recalled text : {recalledMessage.text()} . FROM {from_contact.contact_id}') print(f"Recalled msg is {recalledMessage.text()}") # 此处的if if room == None and to.contact_id == self.contact_id: # When someone try to contact with the bot if text == '#状态': msg = 'busy' if self.busy else 'free' await from_contact.say( f'My status: {msg}') if self.busy == True: await from_contact.say(self.busy_auto_reply_comment) elif text == '#开启': # Problem: the talker should be an authentic wechat user. self.busy = False await from_contact.say('关闭自动回复') elif text == '#关闭': # Problem: the talker should be an authentic wechat user. self.busy = True await from_contact.say('打开自动回复.') elif self.busy == False: # 添加基本的进群验证功能。 if msg.text() == 'ding': await from_contact.say('dong') # await from_contact.say('目前只能进行ding的回复,请继续等待后续开发😂') if msg.text() == '#帮助': await from_contact.say('1. 发送 \'#加群\' 给bot,bot会发送给用户对应的验证码图片\n' '2. 发送 \'#验证 XXXX\' 给bot,bot会完成验证并给予答复,拉人接口暂时还未完善\n' '3. 发送 \'ding\' 给bot,bot会答复dong') elif msg.text().startswith('#加群'): find_result = find(self.collection3, from_contact.contact_id) if find_result != False and find_result['remove'] != 0: passed_time = time.time() - find_result['time_leave_room'] if passed_time < 300: await from_contact.say(f"你的冷静期还未结束。还剩余{300 - int(passed_time)}秒") return inserted_dict = {"_id": from_contact.contact_id, "quiz_ans": "", "quiz_time": 0} insert(self.collection1, from_contact.contact_id, inserted_dict) await from_contact.say('请稍等验证码生成,并在60s内完成回答') img, code = getVerifyCode() update(self.collection1, from_contact.contact_id, "quiz_ans", code) update(self.collection1, from_contact.contact_id, "quiz_time", time.time()) # 为了防止用户连续两次进行请求 # self.verify_info[from_contact.contact_id] = code img = FileBox.from_file('./temp_verify.jpg') await from_contact.say(img) # print(self.verify_info[from_contact.contact_id]) print(code) # await from_contact.say("目前进群功能仍在开发中") # await from_contact.say('请耐心等待开发') elif msg.text() == '#我是你爹': await from_contact.say("主人sama,马上把您拉上群") try: dingRoom = await self.Room.find('新测试群') if dingRoom: log.info('Bot' + 'onMessage: got dingRoom: "%s"' % await dingRoom.topic()) await checkandinvite(from_contact=from_contact, room = dingRoom, collection_user=self.collection3) # # # if self.boton_quit.__contains__(dingRoom.room_id): # boton_quit_list = self.boton_quit[dingRoom.room_id] # else: # boton_quit_list = [] # # if from_contact.contact_id not in boton_quit_list and await dingRoom.has(from_contact): # topic = await dingRoom.topic() # log.info('Bot' + 'onMessage: sender has already in dingRoom') # # await dingRoom.say('I found you have joined in room "{0}"!'.format(topic), talker) # await dingRoom.say(f'您 @{from_contact.name} 已经在群聊 "{topic}"中!') # await from_contact.say( # '不需要再次申请入群,因为您已经在群"{}"中'.format(topic)) # else: # inserted_dict = {"_id": from_contact.contact_id, "time_in": time.time(), "warning": 0, # "time_last_warning": 0} # insert(collection2, from_contact.contact_id, inserted_dict) # update(collection2, from_contact.contact_id, "warning", 0) # update(collection2, from_contact.contact_id, "time_last_warning", 0) # # # if from_contact.contact_id in boton_quit_list: # self.boton_quit[dingRoom.room_id].remove(from_contact.contact_id) # log.info('Bot' + 'onMessage: add sender("%s") to dingRoom("%s")' % ( # from_contact.name, dingRoom.topic())) # await put_in_room(from_contact, dingRoom) # await from_contact.say('已经您拉入群中') except Exception as e: log.exception(e) elif msg.text().startswith('#验证'): user_verify_code = msg.text()[4:] print(user_verify_code) find_result = find(self.collection1, from_contact.contact_id) # if not self.verify_info.__contains__(from_contact.contact_id): if find_result == False: await from_contact.say('并未进行加群请求!,请先发送 #加群 至机器人获取专属验证码') return if time.time() - find_result['quiz_time'] > 60: # expired_code = self.verify_info.pop(from_contact.contact_id) delete(self.collection1, from_contact.contact_id) print(f'previous code has benn expired') await from_contact.say("超时未回答正确验证码信息,请重新发送 #加群 再进行尝试") elif user_verify_code == find_result['quiz_ans']: # TODO: 需不需要再在roominvite中删除? delete(self.collection1, from_contact.contact_id) print(f"在room_invite中删除一认证用户{from_contact.name}") await from_contact.say("通过测试,后续会将您拉入群中") # put_in_room() # await from_contact.say("目前进群功能仍在开发中") try: dingRoom = await self.Room.find('新测试群') if dingRoom: log.info('Bot' + 'onMessage: got dingRoom: "%s"' % await dingRoom.topic()) await checkandinvite(from_contact=from_contact, room=dingRoom, collection_user=self.collection3) # if self.boton_quit.__contains__(dingRoom.room_id): # boton_quit_list = self.boton_quit[dingRoom.room_id] # else: # boton_quit_list = [] # # if from_contact.contact_id not in boton_quit_list and await dingRoom.has(from_contact): # topic = await dingRoom.topic() # log.info('Bot' + 'onMessage: sender has already in dingRoom') # # await dingRoom.say('I found you have joined in room "{0}"!'.format(topic), talker) # await dingRoom.say(f'您 @{from_contact.name} 已经在群聊 "{topic}"中!') # await from_contact.say( # '不需要再次申请入群,因为您已经在群"{}"中'.format(topic)) # else: # if from_contact.contact_id in boton_quit_list: # self.boton_quit[dingRoom.room_id].remove(from_contact.contact_id) # # inserted_dict = {"_id": from_contact.contact_id, "time_in": time.time(), # "warning": 0, "time_last_warning": 0} # insert(collection2, from_contact.contact_id, inserted_dict) # update(collection2, from_contact.contact_id, "warning", 0) # update(collection2, from_contact.contact_id, "time_last_warning", 0) # print("完成新人信息的插入") # # log.info('Bot' + 'onMessage: add sender("%s") to dingRoom("%s")' % ( # from_contact.name, dingRoom.topic())) # await put_in_room(from_contact, dingRoom) # await from_contact.say('已经您拉入群中') except Exception as e: log.exception(e) else: # 输入失败 await from_contact.say("验证失败,请再次尝试。") # 正常文字信息 else: if await regex_filter(msg, from_contact) != 0: print("正则匹配得到") # print("是这里吗?") return elif await dict_filter(msg, from_contact) != 0: # print("regex passed") print("字典检测得到") # elif # TODO: elif await api_filter(msg, from_contact) != 0: print("api匹配得到") # print("regex passed") # print("dict passed") # else: # print("regex passed") # print("dict passed") # print("api passed") else: await from_contact.say(self.busy_auto_reply_comment) # Room talk elif room.room_id == '23402005339@chatroom': print(1) if msg.text() == 'ding': await msg.say('dong') # await msg.say('目前只能进行ding的回复,请继续等待后续开发😂') else: # 正常的群中对话信息 if await regex_filter(msg, from_contact) != 0: print("正则匹配得到") if from_contact.contact_id in owner_contact_id_list: await room.say("管理员测试中") return await warnandcheck(from_contact, room, self.collection3) return elif await dict_filter(msg, from_contact) != 0: print("字典得到") if from_contact.contact_id in owner_contact_id_list: await room.say("管理员测试中") return await warnandcheck(from_contact, room, self.collection3) return elif await api_filter(msg, from_contact) != 0: print("API完成检测") if from_contact.contact_id in owner_contact_id_list: await room.say("管理员测试中") return await warnandcheck(from_contact, room, self.collection3) return
async def on_message(msg: Message): if msg.text() == 'ding': await msg.say('这是自动回复: dong dong dong') if msg.text() == '小队长': await msg.say('我好想你的!!快点好起来,上班来看我!!') if msg.text() == '小仙女': await msg.say('宇宙超级无敌可爱美丽的人,303之光!') if msg.text() == '小余': await msg.say('一直想要骗我钱的女人!但是我还是很爱她!') if msg.text() == 'hi' or msg.text() == '你好': await msg.say( '这是自动回复: 机器人目前的功能是\n- 收到"ding", 自动回复"dong dong dong"\n- 收到"图片", 自动回复一张图片\n- 还会把图片变成漫画样子,不过这个案例是参考细菌的\n- 收到"藏头诗:我是菜鸟",自动以"我是菜鸟"作藏头诗一首,当然也可以输入其他的4个字作诗' ) if msg.text().startswith('藏头诗'): #await msg.say('请输入4个字作为藏头诗的头') test_texts = [msg.text()[-4:]] results = module.generate(texts=test_texts, use_gpu=True, beam_width=5) #for result in results: await msg.say(results[0][0]) if msg.text() == '图片': url = 'http://qrul2d5a1.hn-bkt.clouddn.com/image/street.jpg' file_box_12 = FileBox.from_url(url=url, name='xx.jpg') await msg.say(file_box_12) if msg.text() == '周深': url = 'https://z3.ax1x.com/2021/04/27/gC0EtA.jpg' file_box_11 = FileBox.from_url(url=url, name='xx.jpg') await msg.say(file_box_11) if msg.text() == '费玉清' or msg.text() == '小哥': url = 'https://z3.ax1x.com/2021/04/27/gCBeUJ.jpg' # 构建一个FileBox file_box_1 = FileBox.from_url(url=url, name='xx.jpg') await msg.say(file_box_1) # 如果收到的message是一张图片 if msg.type() == Message.Type.MESSAGE_TYPE_IMAGE: # 将Message转换为FileBox file_box_2 = await msg.to_file_box() # 获取图片名 img_name = file_box_2.name # 图片保存的路径 img_path = './image/' + img_name # 将图片保存为本地文件 await file_box_2.to_file(file_path=img_path) # 调用图片风格转换的函数 img_new_path = img_transform(img_path, img_name) img_new_path1 = img_transform1(img_path, img_name) # 从新的路径获取图片 file_box_3 = FileBox.from_file(img_new_path) file_box_4 = FileBox.from_file(img_new_path1) await msg.say(file_box_4)
async def handle(self, msg: Message): self._counter += 1 log.error('%s: received %s messages' % (datetime.datetime.now(), self._counter)) me = self._bot.Contact.load('paulhybryant') text = msg.text() mention_self = await msg.mention_self() mention_text = await msg.mention_text() self._db.set(msg.talker().name, msg.talker().get_id()) if msg.room(): topic = await msg.room().topic() log.error('room: %s, topic %s' % (msg.room().room_id, topic)) log.error('Message: %s, Contact: %s, Name: %s' % (msg, msg.talker(), msg.talker().name)) forward = self.handle_room(topic, text, mention_self, mention_text, msg.room().room_id, msg.type(), msg.talker()) self._db.set(topic, msg.room().room_id) if forward: await me.say('来自群: %s,联系人: %s' % (topic, msg.talker().name)) if msg.type() == MessageType.MESSAGE_TYPE_ATTACHMENT: filebox = await msg.to_file_box() await me.say(filebox) else: await msg.forward(me) else: log.error('Message: %s, Contact: %s, Name: %s' % (msg, msg.talker(), msg.talker().name)) result = self.handle_cmd(text) if result: log.error(result) await msg.say(result) if msg.talker().get_id() in [ 'wxid_p7xyfpcx7aoa12', 'wxid_5av5yw0udmgp12', 'wxid_lbvhcdjlgg0a21' ] and msg.type() == MessageType.MESSAGE_TYPE_ATTACHMENT: filebox = await msg.to_file_box() doc_re = re.compile(r'(.*)\.docx?') m = doc_re.match(filebox.name) if m: if self._db.get('doc2pdf'): f = '/tmp/%s' % filebox.name await filebox.to_file(f, True) converted, error = self.doc2pdf(f, m.group(1)) if converted: pdf = filebox.from_file(converted) await me.say(pdf) if msg.type() == MessageType.MESSAGE_TYPE_URL: talker = msg.talker() if talker.name in self._subscriptions: await me.say('来自公众号: %s' % talker.name) await msg.forward(me)
async def on_message(self, msg: Message): # 加载消息发送者 talker = msg.talker() await talker.ready() # 忽略自己发的消息 if talker.contact_id == self.my_contact_id: return # 加载聊天室信息 room = msg.room() room_topic = None if room: await room.ready() room_topic = await room.topic() # 基本信息 msg_text = msg.text() msg_text_inline = msg.text().replace('\n', '') msg_type = msg.message_type() msg_id = msg.message_id if msg_type == 6: log.info('Received text, msg_type = {}, id = {}'.format( msg_type, msg_id)) else: log.info('Received text = {}, msg_type = {}, id = {}'.format( msg_text, msg_type, msg_id)) # 保存聊天记录 insert_data = { 'contact_id': talker.contact_id, 'contact_name': talker.name, 'room_id': room.room_id if room else None, 'room_name': room_topic, 'msg_id': msg_id, 'msg_text': msg_text[:20], 'created_at': datetime.now() } keys = ','.join(['`{}`'.format(str(v)) for v in insert_data.keys()]) values = ','.join( ['\'{}\''.format(str(v)) for v in insert_data.values()]) sql = 'INSERT INTO {table}({keys}) VALUES({values})'.format( table='msg_records', keys=keys, values=values) try: self.db.cursor.execute(sql) self.db.db.commit() except Exception as e: log.error(e) self.db.db.rollback() # 鉴定是否为广告 if room and not re.match(r'.*(kda|kadena|可达).*', msg_text_inline.lower()): is_ad = False if msg_type == 4: pass elif msg_type == 5: # 识别是否有二维码 img = await msg.to_file_box() log.info('get img {}'.format(img.name)) img_path = './images/{}'.format(img.name) img_file = await img.to_file(img_path) log.info('get img stored') img = cv2.imread(img_path) data, bbox, straight_qrcode = self.detector.detectAndDecode( img) log.info('qrcode results: {}, {}, {}'.format( data, bbox, straight_qrcode)) if bbox is not None: log.info('ad detected qr_code') is_ad = True os.remove(img_path) elif msg_type == 6: if len(msg_text) >= 50 and re.match( r'.*(http|空投|撸).*', msg_text) and not re.match(r'.*bihu\.com.*', msg_text): log.info('ad detected text') is_ad = True if is_ad: sql = """SELECT count(*) as msg_cnt FROM {} where contact_id = '{}'""".format( 'msg_records', talker.contact_id) self.db.cursor.execute(sql) if list(self.db.cursor.fetchall())[0]['msg_cnt'] < 10: q_list = list(self.ad_qa_dict.keys()) question = q_list[random.randrange(0, len(q_list))] threading.Thread(target=self.kick_member, args=(talker, room, question)).start() reply = '@{}\n你有打广告的嫌疑哦,请在15秒内回答以下问题,否则给你抱出去~~~\n{}'.format( talker.name, question) await room.say(reply, mention_ids=[talker.contact_id]) return # GOD的指令 if talker.contact_id == self.god_contact_id and 'c/' in msg_text: if 'c/new' in msg_text: if '上一条' in msg_text: sql = """SELECT msg_id FROM {} where contact_id = '{}' order by created_at desc""".format( 'msg_records', self.god_contact_id) self.db.cursor.execute(sql) refer_msg_id = list(self.db.cursor.fetchall())[1]['msg_id'] title = msg_text else: root = ET.fromstring(msg_text) refer_msg_id = root.find('.//refermsg//svrid').text title = root.find('.//title').text keyword = re.findall('#.+#', title)[0].replace('#', '') log.info('title = {}, keyword = {}'.format(title, keyword)) insert_data = { 'keyword': keyword, 'msg_id': refer_msg_id, 'created_at': datetime.now() } keys = ','.join( ['`{}`'.format(str(v)) for v in insert_data.keys()]) values = ','.join( ['\'{}\''.format(str(v)) for v in insert_data.values()]) sql = 'INSERT INTO {table}({keys}) VALUES({values})'.format( table='materials', keys=keys, values=values) try: self.db.cursor.execute(sql) self.db.db.commit() log.info('INSERT succesfully: {}'.format(sql)) except Exception as e: log.error(e) self.db.db.rollback() reply = '指令已储存,关键词:{}'.format(keyword) await msg.say(reply) elif 'c/list' in msg_text: sql = """SELECT keyword FROM {} group by keyword""".format( 'materials') self.db.cursor.execute(sql) reply = '现有指令' for row in self.db.cursor.fetchall(): reply += '\n' + row['keyword'] await msg.say(reply) elif 'c/show' in msg_text: keyword = re.findall('#.+#', msg_text)[0].replace('#', '') await self.send_msg_with_keyword(keyword, contact=talker, room=room) elif 'c/active' in msg_text: today = datetime.now() start_dt = datetime(today.year, today.month, today.day) sql = """SELECT contact_id, count(*) as msg_cnt FROM {} where room_id = '{}' and created_at >= '{}' group by contact_id""".format('msg_records', room.room_id, start_dt) self.db.cursor.execute(sql) records = [ row['contact_id'] for row in self.db.cursor.fetchall() ] member_list = await room.member_list() reply = '今日群内未发言成员:' for member in member_list: if member.contact_id != self.my_contact_id and member.contact_id not in records: reply += '\n' + member.name topic = await room.topic() if '星火' in topic: reply += '\n如果没法保持每天活跃,会被移出此群哦~' await msg.say(reply) elif 'c/fixroomname' in msg_text: log.info('to fix room name') sql = """SELECT * FROM {} WHERE room_id is not null and room_name = ''""".format( 'msg_records') self.db.cursor.execute(sql) for row in self.db.cursor.fetchall(): to_fix_room = self.Room(room_id=row['room_id']) await to_fix_room.ready() to_fix_room_name = await to_fix_room.topic() sql = """UPDATE {} SET room_name = '{}' where id = {}""".format( 'msg_records', to_fix_room_name, row['id']) try: self.db.cursor.execute(sql) self.db.db.commit() log.info('update succesfully: {}'.format(sql)) except Exception as e: log.error(e) self.db.db.rollback() log.info('finished') elif 'c/kdashill_to_tg' in msg_text: log.info('to send telegram') sql = """SELECT * FROM {} WHERE has_sent_tg is null""".format( 'kdashill_records') self.db.cursor.execute(sql) for row in self.db.cursor.fetchall(): url = 'https://m.bihu.com/shortcontent/{}'.format( row['content_id']) data = None with concurrent.futures.ThreadPoolExecutor() as executor: future = executor.submit(self.telegram.send_msg, url) data = future.result() log.info('get res: {}'.format(data)) if data: sql = """UPDATE {} SET has_sent_tg = {} where content_id = '{}'""".format( 'kdashill_records', 1, row['content_id']) try: self.db.cursor.execute(sql) self.db.db.commit() log.info('update succesfully: {}'.format(sql)) except Exception as e: log.error(e) self.db.db.rollback() time.sleep(1) break return # 推荐活动 if room and re.match(r'.*[bihu|chainnode]\.com.*', msg_text_inline): content_id = None match_results = re.search(r'(?<=bihu\.com/s/)[0-9A-Za-z]{1,}', msg_text) if match_results: key = match_results[0] x = 0 for y in key: k = digit62.find(y) if k >= 0: x = x * 62 + k content_id = str(x) platform = 'bihu' log.info('transfer {} to {}'.format(key, content_id)) elif 'bihu' in msg_text: match_results = re.search( r'(?<=bihu\.com/shortcontent/)\d{1,}', msg_text_inline.lower()) content_id = match_results[0] platform = 'bihu' elif 'chainnode' in msg_text: match_results = re.search(r'(?<=chainnode\.com/post/)\d{1,}', msg_text_inline.lower()) content_id = match_results[0] platform = 'chainnode' else: log.info('not find pattern') if content_id: log.info('get content id = {}'.format(content_id)) data = None with concurrent.futures.ThreadPoolExecutor() as executor: if platform == 'bihu': future = executor.submit(self.crawler.fetch_bihu, content_id) else: future = executor.submit(self.crawler.fetch_chainnode, content_id) data = future.result() log.info('fetched data = {}'.format(data)) if data: content_inline = data['content'].replace('\n', '') post_date = data['post_date'] if not re.match(r'.*(kda|kadena|可达).*', content_inline.lower()): reply = '未发现Kadena相关信息哦~' reply = reply + ' @{}'.format(talker.name) await room.say(reply, mention_ids=[talker.contact_id]) return elif post_date < datetime( 2021, 3, 26) or post_date >= datetime(2021, 4, 2): reply = '文章发布时间不在活动范围内,不能算入哦~' reply = reply + ' @{}'.format(talker.name) await room.say(reply, mention_ids=[talker.contact_id]) return # 展示 sql = """SELECT * FROM {} where phase = 1 and platform = '{}' and content_id = '{}'""".format( 'kdashill_records', platform, content_id) self.db.cursor.execute(sql) results = list(self.db.cursor.fetchall()) if len(results): # 处理重复 is_duplicate = True ww_id = results[0]['id'] from_room = self.Room(room_id=results[0]['room_id']) await from_room.ready() from_room_name = await from_room.topic() room_name_str = '「{}」\n'.format( from_room_name.replace('Kadena', '')) from_contact = self.Contact( contact_id=results[0]['contact_id']) await from_contact.ready() from_contact_name = from_contact.name else: is_duplicate = False sql = """SELECT max(id) as max_id FROM {} """.format( 'kdashill_records') self.db.cursor.execute(sql) max_id = list(self.db.cursor.fetchall())[0]['max_id'] ww_id = max_id + 1 room_name_str = '「{}」\n'.format( room_topic.replace('Kadena', '')) from_contact_name = talker.name reply_title = '可达秀.{:02} @ {}'.format( ww_id, from_contact_name) if platform == 'bihu': reply_url = 'https://m.bihu.com/shortcontent/{}'.format( content_id) score = 1 if 'img_url' in data: prefix = 'https://oss-cdn1.bihu-static.com/' reply_thumbnail = prefix + data['img_url'] else: reply_thumbnail = 'https://m.bihu.com/static/img/pic300.jpg' else: score = 2 reply_url = 'https://www.chainnode.com/post/{}'.format( content_id) if 'img_url' in data: reply_thumbnail = data['img_url'] else: reply_thumbnail = 'https://webcdn.chainnode.com/mobile-1.3.15/img/ChainNode.4e5601a.svg' reply_description = room_name_str + data['content'][:60] log.info('to create url_link: {},{},{},{}'.format( reply_url, reply_title, reply_thumbnail, reply_description)) reply_link = UrlLink.create(reply_url, reply_title, reply_thumbnail, reply_description) log.info('url created') # 查重 if is_duplicate: reply = '文章已有录入哦~' reply = reply + ' @{}'.format(talker.name) await room.say(reply, mention_ids=[talker.contact_id]) return # 记分 insert_data = { 'phase': 2, 'platform': platform, 'content_id': content_id, 'contact_id': talker.contact_id, 'contact_name': talker.name, 'room_id': room.room_id, 'created_at': datetime.now(), 'score': score, } keys = ','.join( ['`{}`'.format(str(v)) for v in insert_data.keys()]) values = ','.join([ '\'{}\''.format(str(v)) for v in insert_data.values() ]) sql = 'INSERT INTO {table}({keys}) VALUES({values})'.format( table='kdashill_records', keys=keys, values=values) try: self.db.cursor.execute(sql) self.db.db.commit() log.info('INSERT succesfully: {}'.format(sql)) except Exception as e: log.error(e) self.db.db.rollback() # 报积分 sql = """SELECT contact_id, sum(score) as score FROM {} where phase = 2 group by contact_id order by score desc""".format( 'kdashill_records') self.db.cursor.execute(sql) rank = 0 for row in self.db.cursor.fetchall(): rank += 1 if row['contact_id'] == talker.contact_id: reply = '感谢参加可达秀 [KDA-Show] 活动!🍻\n' reply += '您当前积分为{},排名为{}'.format( row['score'], rank) break reply = reply + ' @{}'.format(talker.name) await room.say(reply, mention_ids=[talker.contact_id]) # 发送至其他群 sql = """SELECT room_id, max(room_name) as room_name FROM {} group by room_id""".format( 'msg_records') self.db.cursor.execute(sql) for row in self.db.cursor.fetchall(): if '可达社区信息流' in row['room_name']: forward_room = self.Room(room_id=row['room_id']) await forward_room.ready() try: await forward_room.say(reply_link) except Exception as e: log.exception(e) # 发送至Telegram #threading.Thread(target=self.telegram.send_msg, args=(reply_url)).start() return else: reply = '未查到相关网页' reply = reply + ' @{}'.format(talker.name) await room.say(reply, mention_ids=[talker.contact_id]) return # 关键词回复 if re.match(r'(资料|学习|学习资料|新人)', msg_text_inline): await self.send_msg_with_keyword('新手指南', contact=talker, room=room) return coin_dict = { 'kda': 'kadena', 'btc': 'bitcoin', 'eth': 'ethereum', 'dot': 'polkadot', 'link': 'chainlink', 'atom': 'cosmos', 'mkr': 'maker', 'luna': 'terra-luna', 'celo': 'celo', } if room and msg_text.lower() in coin_dict: name = msg_text.lower() full_name = coin_dict[name] url = 'https://api.coingecko.com/api/v3/coins/{}/market_chart?vs_currency=usd&days=30&interval=daily'.format( full_name) data = requests.get(url).json() log.info('get chart, response: {}'.format(data)) url = 'http://*****:*****@{}'.format(self.my_contact_name) in msg_text): data = {'msg': msg_text, 'appid': '0', 'key': 'free'} url = 'http://api.qingyunke.com/api.php' res = requests.get(url, params=data) log.info('get AI request: {}, {}, response: {}'.format( url, data, res.text)) data = res.json() reply = data['content'].replace('{br}', '\n') reply = reply + ' @{}'.format(talker.name) if room: await room.say(reply, mention_ids=[talker.contact_id]) else: await msg.say(reply)