Python开发微信公众号后台(系列三)

简介:

之前有主流的小黄鸡机器人,但是没找到官方的网页版。(小黄鸡提供付费 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 次请求。


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

我们已经搭好了 Python 环境的服务器,所以选择 API 接入。
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中文社区”微信公众号

相关文章
|
4天前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
16天前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
125 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
5天前
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
30天前
|
存储 API 数据库
使用Python开发获取商品销量详情API接口
本文介绍了使用Python开发获取商品销量详情的API接口方法,涵盖API接口概述、技术选型(Flask与FastAPI)、环境准备、API接口创建及调用淘宝开放平台API等内容。通过示例代码,详细说明了如何构建和调用API,以及开发过程中需要注意的事项,如数据库连接、API权限、错误处理、安全性和性能优化等。
94 5
|
2月前
|
机器学习/深度学习 人工智能 关系型数据库
Python开发
Python开发
43 7
|
2月前
|
前端开发 安全 数据库
使用Python开发独立站的全面指南
本文详细介绍了如何使用Python及其Web框架Django和Flask快速搭建功能完善、易于管理的独立站。从Python和Web开发基础讲起,逐步覆盖环境搭建、项目创建、数据库设计、视图与URL路由、模板创建、表单处理、测试调试、部署优化及安全维护等内容,旨在帮助开发者高效构建稳定的Web应用。
85 1
|
2月前
|
缓存 API 数据库
Python哪个框架合适开发速卖通商品详情api?
在跨境电商平台速卖通的商品详情数据获取与整合中,Python 语言及其多种框架(如 Flask、Django、Tornado 和 FastAPI)提供了高效解决方案。Flask 简洁灵活,适合快速开发;Django 功能全面,适用于大型项目;Tornado 性能卓越,擅长处理高并发;FastAPI 结合类型提示和异步编程,开发体验优秀。选择合适的框架需综合考虑项目规模、性能要求和团队技术栈。
32 2
|
2月前
|
存储 API 数据安全/隐私保护
Python开发淘宝详情API的深入探索
通过Python开发淘宝详情API,你可以高效地获取商品信息,为电商运营和市场分析提供强有力的数据支持。本文详细介绍了注册开发者账号、获取API密钥、构建请求、解析响应数据等步骤,并探讨了相关的注意事项和最佳实践。希望这些内容能够帮助你更好地理解和使用淘宝开放平台的API接口,实现你的业务需求。
42 1
|
2月前
|
JSON API 数据格式
如何使用Python开发天猫获得淘宝买家秀API接口?
本文介绍了如何使用Python开发天猫和淘宝买家秀API接口,包括注册开放平台账号、创建应用获取API权限、构建请求URL、发送请求获取响应及解析数据等步骤,帮助开发者高效获取和处理商品信息与用户评价数据。
44 0
|
2月前
|
安全 API 数据库
Python哪个框架合适开发淘宝商品详情api?
在数字化商业时代,开发淘宝商品详情API成为企业拓展业务的重要手段。Python凭借其强大的框架支持,如Flask、Django、Tornado和FastAPI,为API开发提供了多样化的选择。本文探讨了这些框架的特点、优势及应用场景,帮助开发者根据项目需求选择最合适的工具,确保API的高效、稳定与可扩展性。
33 0

热门文章

最新文章