之前有主流的小黄鸡机器人,但是没找到官方的网页版。(小黄鸡提供付费 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
returnrecontent
#如果请求失败自己试试加上headers
抓到了自动回复的内容以后,我们将用户输入的文本内容当作 content 传入,获取回复再返回即可。
从小黄鸡的回复我们可以看出来,丫并不是小黄鸡,而是图灵机器人伪装的。与其给人刷请求量还不如自己去申请一个图灵机器人的 API ,可以自己定制很多东西。 http://www.tuling123.com/
注册以后会分配自己的 key ,免费版每天 5000 次请求。
http://www.tuling123.com/html/doc/api.html
(推荐自己详细阅读文档) 下面是对 API 调用的 Python 代码:
存储为
talk_api.py
(这里的重点是根据返回值中不同的 code 对相应返回的格式进行处理,否则会运行不成功或者返回信息不全)
# -*- coding: utf-8 -*-
import requests
importjson
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 = '这货还没学会怎么回复这句话'
returnrecontent
修改其中的 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
ifmsgType == '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)
returnself.render.reply_text(fromUser,toUser,int(time.time()), kuaidi)
else:
try:
msg = talk_api.talk(content, userid)
returnself.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)
ifmsgType == '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()), '识别失败,换张图片试试吧')
elifmsgType == 'voice':
content = xml.find('Recognition').text
try:
msg = takl_api.talk(content, userid)
returnself.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'
returnself.render.reply_text(fromUser,toUser,int(time.time()), kuaidi)
else:
try:
msg = talk_api.talk(content)
returnself.render.reply_text(fromUser,toUser,int(time.time()), msg)
except:
return self.render.reply_text(fromUser,toUser,int(t
这里重点就是加上了 elifmsgType == 'voice'
这部分。
示例:
由于机器人并没有理解上下文语义,前一句话问你要去哪儿,你告诉他北京以后他却不知道你是因为什么回复的北京。所以要告诉机器人是谁在跟他聊天。
查看微信和图灵机器人的开发文档可以看到:
OpenID
了,只需要将这个 ID 作为 userid
传给图灵机器人 API ,就可以保持上下文对话的语境了。(但是userid
只支持0-9和数字,而微信 ID 中带有下划线,所以需要做一些简单处理)
修改talk_api.py
(最终):
# -*- coding: utf-8 -*-
import requests
importjson
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 = '这货还没学会怎么回复这句话'
returnrecontent
可以看到,我们需要两个参数,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)
ifmsgType == '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()), '识别失败,换张图片试试吧')
elifmsgType == 'voice':
content = xml.find('Recognition').text
try:
msg = talk_api.talk(content, userid)
returnself.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'
returnself.render.reply_text(fromUser,toUser,int(time.time()), kuaidi)
else:
try:
msg = talk_api.talk(content, userid)
returnself.render.reply_text(fromUser,toUser,int(time.time()), msg)
except:
return self.render.reply_text(fromUser,toUser,int
提交代码即可。
测试:
原文发布时间为:2017-01-14
本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”微信公众号