一小时搭建微信聊天机器人( 四 )

关注后自动返回的文案AUTO_REPLY_CONTENT = """Hi , 朋友!这是我妈四月的公号 , 我是魔魔 , 我可以陪你聊天呦!我还能"记账" , 输入"记账"会有惊喜呦!<a href=https://www.isolves.com/it/cxkf/bk/2019-08-19/""">历史记录"""class ReplyContent(object):_source = 'value'def __init__(self, event, keyword, content=None, momo=True):self.momo = momoself.event = eventself.content = contentself.keyword = keywordif self.event == 'scan':pass@propertydef value(self):if self.momo:answer = get_momo_answer(self.content)return answerreturn ''class WXResponse(_WXResponse):auto_reply_content = AUTO_REPLY_CONTENTdef _subscribe_event_handler(self):# 关注公号后的处理逻辑self.reply_params['content'] = self.auto_reply_contentself.reply = TextReply(**self.reply_params).renderdef _unsubscribe_event_handler(self):# 取关后的处理逻辑 , 取关我估计会哭吧passdef _text_msg_handler(self):# 文字消息处理逻辑 聊天机器人的主要逻辑event_key = 'text'content = self.data.get('Content')reply_content = ReplyContent('text', event_key, content)self.reply_params['content'] = reply_content.valueself.reply = TextReply(**self.reply_params).renderclass WXRequestView(HTTPMethodView):def _get_args(self, request):params = request.raw_argsif not params:raise ServerError("invalid params", status_code=400)args = {'mp_token': Config.WEIXINMP_TOKEN,'signature': params.get('signature'),'timestamp': params.get('timestamp'),'echostr': params.get('echostr'),'nonce': params.get('nonce'),}return argsdef get(self, request):args = self._get_args(request)weixin = WeixinMpAPI(**args)if weixin.validate_signature:return text(args.get('echostr') or 'fail')return text('fail')def _get_xml(self, data):post_str = smart_str(data)# 验证xml 格式是否正确validate_xml(StringIO(post_str))return post_strdef _decrypt_xml(self, params, crypt, xml_str):# 解密消息nonce = params.get('nonce')msg_sign = params.get('msg_signature')timestamp = params.get('timestamp')ret, decryp_xml = crypt.DecryptMsg(xml_str, msg_sign,timestamp, nonce)return decryp_xml, noncedef _encryp_xml(self, crypt, to_xml, nonce):# 加密消息to_xml = smart_str(to_xml)ret, encrypt_xml = crypt.EncryptMsg(to_xml, nonce)return encrypt_xmldef post(self, request):# 获取微信服务器发送的请求参数args = self._get_args(request)weixin = WeixinMpAPI(**args)if not weixin.validate_signature: # 验证参数合法性raise AttributeError("Invalid weixin signature")xml_str = self._get_xml(request.body) # 获取form datacrypt = WXBizMsgCrypt(token, encoding_aeskey, appid)decryp_xml, nonce = self._decrypt_xml(request.raw_args, crypt, xml_str) # 解密xml_dict = xmltodict.parse(decryp_xml)xml = WXResponse(xml_dict) or 'success' # 使用WXResponse 根据消息获取机器人返回值encryp_xml = self._encryp_xml(crypt, xml, nonce) # 加密消息return text(encryp_xml or xml) # 回应微信请求blueprint.add_route(WXRequestView.as_view, '/request')可以看到 , 我处理微信请求返回结果比较简单 , 也是使用的 python-weixin 包封装的接口 , 主要的处理逻辑是 WXResponse 。
这里需要注意的是 , 如果服务器在5秒内没有响应微信服务器会重试 。为了加快响应速度 , 不要在服务器 将 chatterBot 的 storage adapter 设置为使用 jsondb 。
上边这些就是 , 微信聊天机器人的主要处理逻辑 , 我们运行服务 , 示例如下:

一小时搭建微信聊天机器人

文章插图
可以看到这里聊天机器人也可以做简单的数学运算和报时 , 是因为我在上边指定处理逻辑的时候添加了数学模块和时间模块:
momo_chat = ChatBot('Momo',# 指定存储方式 使用mongodb 存储数据storage_adapter='chatterbot.storage.MongoDatabaseAdapter',# 指定 logic adpater 这里我们指定三个logic_adapters=["chatterbot.logic.BestMatch","chatterbot.logic.MathematicalEvaluation", # 数学模块"chatterbot.logic.TimeLogicAdapter", # 时间模块],input_adapter='chatterbot.input.VariableInputTypeAdapter',output_adapter='chatterbot.output.OutputAdapter',database='chatterbot',read_only=True)到这里 , 微信机器人的搭建就完成了 , 详细代码已经长传到了 github: https://github.com/gusibi/momo/tree/chatterbot , 感兴趣的可以参考一下 。
 
参考链接