提要:

这篇文章里我们会写:

1、如何对一个聊天机器人进行抓包分析接口;

2、如何将现成的聊天机器 API 部署到自己的公众号上;

3、如何实现接收语音消息并调用聊天机器人 API 自动回复文字;

4、如何让机器人根据上下文回复消息。

终于来更新了…代码和功能其实已经弄好好几天了,拖延症发作每次打开写专栏的页面就什么都懒得写,不过程序跑在 SAE 上每天都在扣云豆,每天也就@曲小花 还跟机器人聊几句,估计也不太有时间接着弄了,所以还是抓紧时间先整理完这篇文章吧。

上篇文章的结尾,我们实现了如下的功能:1、回复 快递xxxxxx 自动识别快递公司

2、发送图片 识别性别和年龄

3、其他文字信息 原样返回

其实结束在上次的文章就挺好的,因为已经实现了最重要的 token 验证,也尝试了如何处理文字和图片类型的消息,更多的功能和接口可以自己尝试开发,程序员需要的是自己的思考和尝试,而不是别人把所有东西都喂到嘴边。不过我的那群智障朋友能跟一个鹦鹉学舌的公众号玩儿出花来我也是醉了…所以我决定还是再扩展一下公众号的功能吧。

(最低级的调教…)

(然后升级版就出现了…自己跟自己聊天完了再删掉中间两行是一种怎样的体验)

鹦鹉学舌的自动回复显然是不能满足实际需要的,最多也就用来测试消息能不能正常返回。但是自己设置关键字回复需要的规则又太多,所以我们选择对已有的聊天机器人进行抓包。

之前有主流的小黄鸡机器人,但是没找到官方的网页版。(小黄鸡提供付费 API )

尝试使用 http://www.niurenqushi.com/app/simsimi/ (虽然事实证明这个网站用的是图灵机器人的 API 而非小黄鸡 API ,后面我们会再谈 API 怎么用)

很简单的一个请求。

http://www.niurenqushi.com/app/simsimi/ajax.aspx?txt=

网址后面加上内容就可以了。

# -*- coding: utf-8 -*-

import requests

def talk(content):

s = requests.session()

r = s.post('http://www.niurenqushi.com/app/simsimi/ajax.aspx?txt='+content)

recontent = r.text

return recontent

#如果请求失败自己试试加上headers

抓到了自动回复的内容以后,我们将用户输入的文本内容当作 content 传入,获取回复再返回即可。

从小黄鸡的回复我们可以看出来,丫并不是小黄鸡,而是图灵机器人伪装的。与其给人刷请求量还不如自己去申请一个图灵机器人的 API ,可以自己定制很多东西。

http://www.tuling123.com/ 注册以后会分配自己的 key ,免费版每天 5000 次请求。

官方提供了几种接入方式,其中一种是微信公众平台接入,这种方法直接接入图灵机器人提供的链接而不是自己的服务器,所以对于公众号来讲定制功能的限定就很多,但是如果有小伙伴没有自己的服务器的话,可以用这个尝尝鲜。

我们已经搭好了 Python 环境的服务器,所以选择 API 接入。

下面是对 API 调用的 Python 代码:

存储为talk_api.py

(这里的重点是根据返回值中不同的 code 对相应返回的格式进行处理,否则会运行不成功或者返回信息不全)

# -*- coding: utf-8 -*-

import requests

import json

global s

s = requests.session()

def talk(content):

url = 'http://www.tuling123.com/openapi/api'

da = {"key": "your API key", "info": content}

data = json.dumps(da)

r = s.post(url, data=data)

j = eval(r.text)

code = j['code']

if code == 100000:

recontent = j['text']

elif code == 200000:

recontent = j['text']+j['url']

elif code == 302000:

recontent = j['text']+j['list'][0]['info']+j['list'][0]['detailurl']

elif code == 308000:

recontent = j['text']+j['list'][0]['info']+j['list'][0]['detailurl']

else:

recontent = '这货还没学会怎么回复这句话'

return recontent

修改其中的 API key,然后修改之前的 weixinInterface.py

def POST(self):

str_xml = web.data() #获得post来的数据

xml = etree.fromstring(str_xml)#进行XML解析

#content=xml.find("Content").text#获得用户所输入的内容

msgType=xml.find("MsgType").text

fromUser=xml.find("FromUserName").text

toUser=xml.find("ToUserName").text

if msgType == 'image':

try:

picurl = xml.find('PicUrl').text

datas = imgtest(picurl)

return self.render.reply_text(fromUser, toUser, int(time.time()), '图中人物性别为'+datas[0]+'\n'+'年龄为'+datas[1])

except:

return self.render.reply_text(fromUser, toUser, int(time.time()), '识别失败,换张图片试试吧')

else:

content = xml.find("Content").text # 获得用户所输入的内容

if content[0:2] == u"快递":

post = str(content[2:])

kuaidi = cxkd.detect_com(post)

return self.render.reply_text(fromUser,toUser,int(time.time()), kuaidi)

else:

try:

msg = talk_api.talk(content, userid)

return self.render.reply_text(fromUser,toUser,int(time.time()), msg)

except:

return self.render.reply_text(fromUser,toUser,int(time.time()), '这货还不够聪明,换句话聊天吧')

这样我们就实现了调用图灵机器人 API 微信公众号后台自动回复的功能。你可以在http://www.tuling123.com/web/robot_settings!index.action?cur=l_02 修改机器人设定,机器人后台会根据设定自动修改相应回复。

示例:

实现了文本信息的聊天以后我就在想,我们已经可以处理文本、图片了,能不能处理语音呢?

刚好看到微信官方提供了接口:

这就意味着我们不需要做太多的修改就可以将接收到的语音消息作为文本信息处理了。

修改weixinInterface.py

def POST(self):

str_xml = web.data() #获得post来的数据

xml = etree.fromstring(str_xml)#进行XML解析

#content=xml.find("Content").text#获得用户所输入的内容

msgType=xml.find("MsgType").text

fromUser=xml.find("FromUserName").text

toUser=xml.find("ToUserName").text

#picurl = xml.find('PicUrl').text

#return self.render.reply_text(fromUser,toUser,int(time.time()), content)

if msgType == 'image':

try:

picurl = xml.find('PicUrl').text

datas = imgtest(picurl)

return self.render.reply_text(fromUser, toUser, int(time.time()), '图中人物性别为'+datas[0]+'\n'+'年龄为'+datas[1])

except:

return self.render.reply_text(fromUser, toUser, int(time.time()), '识别失败,换张图片试试吧')

elif msgType == 'voice':

content = xml.find('Recognition').text

try:

msg = takl_api.talk(content, userid)

return self.render.reply_text(fromUser,toUser,int(time.time()), msg)

except:

return self.render.reply_text(fromUser,toUser,int(time.time()), content + '这货还不够聪明,换句话聊天吧')

#return self.render.reply_text(fromUser,toUser,int(time.time()), content)

else:

content = xml.find("Content").text # 获得用户所输入的内容

if content[0:2] == u"快递":

post = str(content[2:])

#result = cxkd.cxkd('PQ00708467161')

r = urllib2.urlopen('http://www.kuaidi100.com/autonumber/autoComNum?text='+post)

h = r.read()

k = eval(h)

kuaidi = k["auto"][0]['comCode']

'''

j = requests.get('http://www.kuaidi100.com/query?type=huitongkuaidi&postid=280472503105')

l = j.text

#l = j.read()

#m = eval(l)

#outcome = ''

#for c in m['data']:

'''

#outcome = outcome + c['time']+' '+c['context']+'\n'

return self.render.reply_text(fromUser,toUser,int(time.time()), kuaidi)

else:

try:

msg = talk_api.talk(content)

return self.render.reply_text(fromUser,toUser,int(time.time()), msg)

except:

return self.render.reply_text(fromUser,toUser,int(time.time()), '这货还不够聪明,换句话聊天吧')

这里重点就是加上了 elif msgType == 'voice':这部分。

示例:

这一步做完以后就已经实现了大部分我想要的功能了,但还是有一点问题,因为机器人并不理解上下文的语义,所以会出现这样的情况:

由于机器人并没有理解上下文语义,前一句话问你要去哪儿,你告诉他北京以后他却不知道你是因为什么回复的北京。所以要告诉机器人是谁在跟他聊天。

查看微信和图灵机器人的开发文档可以看到:

从微信接收到消息是,我们就能够获取到用户的 OpenID 了,只需要将这个 ID 作为 userid 传给图灵机器人 API ,就可以保持上下文对话的语境了。(但是userid只支持0-9和数字,而微信 ID 中带有下划线,所以需要做一些简单处理)

修改talk_api.py (最终):

# -*- coding: utf-8 -*-

import requests

import json

global s

s = requests.session()

def talk(content, userid):

url = 'http://www.tuling123.com/openapi/api'

da = {"key": "your key here", "info": content, "userid": userid}

data = json.dumps(da)

r = s.post(url, data=data)

j = eval(r.text)

code = j['code']

if code == 100000:

recontent = j['text']

elif code == 200000:

recontent = j['text']+j['url']

elif code == 302000:

recontent = j['text']+j['list'][0]['info']+j['list'][0]['detailurl']

elif code == 308000:

recontent = j['text']+j['list'][0]['info']+j['list'][0]['detailurl']

else:

recontent = '这货还没学会怎么回复这句话'

return recontent

可以看到,我们需要两个参数,content 和 userid 。

修改 weixinInterface.py(最终):

def POST(self):

str_xml = web.data() #获得post来的数据

xml = etree.fromstring(str_xml)#进行XML解析

#content=xml.find("Content").text#获得用户所输入的内容

msgType=xml.find("MsgType").text

fromUser=xml.find("FromUserName").text

toUser=xml.find("ToUserName").text

userid = fromUser[0:15]

#picurl = xml.find('PicUrl').text

#return self.render.reply_text(fromUser,toUser,int(time.time()), content)

if msgType == 'image':

try:

picurl = xml.find('PicUrl').text

datas = imgtest(picurl)

return self.render.reply_text(fromUser, toUser, int(time.time()), '图中人物性别为'+datas[0]+'\n'+'年龄为'+datas[1])

except:

return self.render.reply_text(fromUser, toUser, int(time.time()), '识别失败,换张图片试试吧')

elif msgType == 'voice':

content = xml.find('Recognition').text

try:

msg = talk_api.talk(content, userid)

return self.render.reply_text(fromUser,toUser,int(time.time()), msg)

except:

return self.render.reply_text(fromUser,toUser,int(time.time()), content + '这货还不够聪明,换句话聊天吧')

#return self.render.reply_text(fromUser,toUser,int(time.time()), content)

else:

content = xml.find("Content").text # 获得用户所输入的内容

if content[0:2] == u"快递":

post = str(content[2:])

#result = cxkd.cxkd('')

r = urllib2.urlopen('http://www.kuaidi100.com/autonumber/autoComNum?text='+post)

h = r.read()

k = eval(h)

kuaidi = k["auto"][0]['comCode']

'''

j = requests.get('http://www.kuaidi100.com/query?type=huitongkuaidi&postid=280472503105')

l = j.text

#l = j.read()

#m = eval(l)

#outcome = ''

#for c in m['data']:

'''

#outcome = outcome + c['time']+' '+c['context']+'\n'

return self.render.reply_text(fromUser,toUser,int(time.time()), kuaidi)

else:

try:

msg = talk_api.talk(content, userid)

return self.render.reply_text(fromUser,toUser,int(time.time()), msg)

except:

return self.render.reply_text(fromUser,toUser,int(time.time()), '这货还不够聪明,换句话聊天吧')

提交代码即可。

测试:

Over.

这篇写的很仓促,有时间会回头整理一下思路,完善一下语言,加几个框图帮助大家理解。

代码还没整理好,整理好会 commit 到 Github 的。

就这样吧,也算完了任务。我去给手机充电了~

python微信语音转发_Python 微信公众号开发(2)——听得懂语音消息的聊天机器人...相关推荐

  1. 微信公众号开发 [03] 结合UEditor实现图文消息群发功能

    0.写在前面的话 如何实现微信平台后台管理中的,图文消息发送功能? 大概的过程如下: 通过类似表单的形式,将文章各部分内容提交到后台,封装成一个实体类,并持久化到数据库中 需要推送的时候,将不同的文章 ...

  2. 微信公众号开发(二)---验证服务与回复消息

    经过第一个阶段的工作,公众号服务器方面的配置已经完成,接下来就是开发环境的搭建了. 准备工作请看上一篇文章: 0. 消息的传递路径 1. 启动XShell,开启端口转发 按照上一篇文章对XShell进 ...

  3. 【微信公众号开发】【6】图文消息加强

    前言: 1,图文消息参数介绍 2,注意区分图片消息和图文消息,图片消息是不能带链接的 3,一定要给图文消息的Url属性赋值.(柳峰老师说如果Url为空,用户点击后将会打开一个空白页面,待验证,我以前直 ...

  4. 微信公众号开发之关注推送图文消息

    关注/取消关注事件 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL.方便开发者给用户下发欢迎消息或者做帐号的解绑. 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总 ...

  5. 微信公众号开发整理(四)--音乐消息回复

    1.首先,我们先看回复音乐消息数据格式: 2.与回复图片消息一样,首先我们需要先创建音乐消息的实体类 public class Music { private String Title; privat ...

  6. 微信公众号开发——向指定用户发送模板消息

  7. 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索

    本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...

  8. 微信公众号开发《四》调用微信JS-SDK实现上传手机图片到服务器

    在这粘贴上三篇博文链接,方便大家查阅互相学习: 微信公众号开发<一>OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆 微信公众号开发<二>发送模板消息实现消息业务实 ...

  9. 微信公众号开发《四》使用微信JS-SDK实现手机图片上传,支持压缩、预览。并下载图片到自身服务器

    在这粘贴上三篇博文链接,方便大家查阅互相学习: 微信公众号开发<一>OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆 微信公众号开发<二>发送模板消息实现消息业务实 ...

最新文章

  1. Apache Shiro 使用手册(三)Shiro 授权
  2. 计算机论文数据建模怎么写,如何撰写建模论文?
  3. python怎么画条形图-Python 画 直方图/条形图/柱状图
  4. perl unload gbk oracle 数据库
  5. VTK:Utilities之RenderScalarToFloatBuffer
  6. 汉仪尚巍手书有版权吗_为什么“汉仪尚巍手书”会大行天下?
  7. 视图和表的区别和联系
  8. PyTorch | torch.linspace()创建均分数列张量 | torch.linspace()如何使用?| torch.linspace()使用方法 | torch.linspace例子
  9. Java基础学习总结(106)——高级JAVA工程师必需技能
  10. Python 集合 day3
  11. Fiddler抓包7-post请求(json)
  12. Presto 安装与部署
  13. python 有限域函数库_有限域GF(2^8)内乘法代码实现以及原理
  14. 银行自助填表方案介绍
  15. 谷歌地球专业版:Google Earth Pro for Mac中文免费版
  16. 十进制转格雷码 c语言,C语言输出格雷码
  17. LSTM(Long Short Term Memory)和RNN(Recurrent)教程收集 (知乎)
  18. android 蓝牙发送失败怎么办,在Android中通过蓝牙发送文件时出错?
  19. Ubuntu22.04 用 `hwclock` 或 `timedatectl` 来设置RTC硬件时钟为本地时区
  20. 无线网主域名服务器,主域名服务器和网关的关系

热门文章

  1. 【SD2.0大会】毛新生:MVC Is Dead?
  2. linux制作多系统启动盘制作工具,制作U盘多系统(老毛桃WinPE,Ubuntu,MaxDOS,CDlinux,Parted Magic Linux)引导工具...
  3. 电脑重装系统后Win11mmc无法创建管理单元如何解决
  4. EasyMoney 绿色免费 家庭财务软件v1.0 新鲜出炉~~~
  5. c语言int型等长输出,c语言先程序设计15第十四讲第六章下.ppt
  6. Wex5 组件的bind-visible属性控制显隐
  7. 今晚龙哥露面,赶紧观看直播
  8. 机器学习之XGBoost模型学习
  9. literate program: Count Luck
  10. 面试中常被问到的(22)TCP三次握手/四次挥手及问题