2.3 文本消息操作小例——查快递
上一小节我们已经完成了对文本消息最基础的操作,但是原样返回内容,并没有做任何更多的操作,这一次我们来试试快递接口。
我使用的依然是前文中提到的文章中的 kuaidi100 查快递接口,不过我在本地测试了许多次通过但是 SAE 的服务器依然无法返回正常结果,在网上搜了很久发现时 快递100 封掉了来自 SAE IP 段的请求,也就是说那个接口不能用了,那段代码也废掉了。所以我们只能退而求其次,做一个通过快递单号判断快递公司的功能。
依然是修改weixinInterface.py
def POST(self):
str_xml = web.data() #获得post来的数据
xml = etree.fromstring(str_xml)#进行XML解析
msgType=xml.find("MsgType").text
fromUser=xml.find("FromUserName").text
toUser=xml.find("ToUserName").text
ifmsgType == 'text':
content=xml.find("Content").text
if content[0:2] == u"快递":
post = str(content[2:])
r = urllib2.urlopen('http://www.kuaidi100.com/autonumber/autoComNum?text='+post)
h = r.read()
k = eval(h)
kuaidi = k["auto"][0]['comCode']
returnself.render.reply_text(fromUser,toUser,int(time.time()), kuaidi)
elifmsgType == 'image':
pass
else:
pass
上面的功能很简单,就是判断用户消息如果前两个字为快递,则取出后面的字符串作为快递单号,通过接口查询后返回结果发送给用户。重复 git 命令更新远程代码后测试效果图如下:
3. 曲径通幽处
上面完成对文本消息的一些基础操作后,我们可以尝试做一些更有趣的事情了。这一部分我们会尝试添加第三方的依赖包,尝试通过抽出函数方法来结构化代码,最后尝试对图片消息进行处理。
3.1 添加第三方依赖包
在上面的接口调用中,我们用到了 urllib2 库,但是熟悉 Python 爬虫的都知道,我们最常用到的其实是第三方的 requests 库,那么怎么把第三方库添加到 SAE 空间中呢?参阅了开发文档以后得到答案:https://www.sinacloud.com/doc/sae/python/tools.html#tian-jia-di-san-fang-yi-lai-bao
具体做法不一定拘泥于官方给出的步骤,可以自己在本地仓库新建文件夹 vendor ,然后使用pip -t 选项指定第三方库安装地址,最后添加路径到 index.wsgi文件中。
以安装 requests 为例。
# coding: UTF-8
importos
importsae
import web
sae.add_vendor_dir('vendor')
fromweixinInterface import WeixinInterface
有了这些第三方依赖库,我们就能更加轻松地实现需要的功能了。
3.2 函数的结构化方法
文本消息很多,我们如果不断地添加判断,作出一些操作并返回结果,代码势必变得极其臃肿,既不利于阅读,更不利于调试代码。于是我们尝试将之前已有的通过快递单号查询公司的代码改写为函数。
新建 cxkd.py
import urllib2
defdetect_com(postid):
r = urllib2.urlopen('http://www.kuaidi100.com/autonumber/autoComNum?text='+postid)
h = r.read()
k = eval(h)
kuaiditpye = k["auto"][0]['comCode']
#print kuaiditpye
returnkuaiditpye
修改 weixinInterface.py
,导入 cxkd.py
并修改源代码。
importcxkd
def POST(self):
str_xml = web.data() #获得post来的数据
xml = etree.fromstring(str_xml)#进行XML解析
msgType=xml.find("MsgType").text
fromUser=xml.find("FromUserName").text
toUser=xml.find("ToUserName").text
ifmsgType == 'text':
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)
elifmsgType == 'image':
pass
else:
pass
经过测试这种写法是可行的。显然代码量较大的情况下,这样的写法可以使代码更加简洁易懂,便于修改调试。
3.3 旧瓶装新酒——再谈人脸识别
在我很久一篇的专栏中(Python 爬虫笔记(2):插播——我也来做Facemash! - 小段同学的杂记 - 知乎专栏)曾经提到过微软的 How-old.net 人脸识别的接口,当然那个接口是我自己通过抓包拿到的,那篇文章赞数寥寥,平时好像也没见谁拿那个接口实现过什么功能,这次想起来要处理图片消息,我第一个便又想起来那个接口。
旧瓶装新酒,能饮一杯无。
接口的详情可以到上文的链接中查看,这里直接给出代码好了。
新建 imgtest.py
# -*- coding: utf-8 -*-
import requests
import re
defimgtest(picurl):
s = requests.session()
url = 'http://how-old.net/Home/Analyze?isTest=False&source=&version=001'
header = {
'Accept-Encoding':'gzip, deflate',
'User-Agent': "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0",
'Host': "how-old.net",
'Referer': "http://how-old.net/",
'X-Requested-With': "XMLHttpRequest"
}
data = {'file':s.get(picurl).content}
#data = {'file': open(sid+'.jpg', 'rb')}
#此处打开指定的jpg文件
r = s.post(url, files=data, headers=header)
h = r.content
i = h.replace('\\','')
#j = eval(i)
gender = re.search(r'"gender": "(.*?)"rn', i)
age = re.search(r'"age": (.*?),rn', i)
ifgender.group(1) == 'Male':
gender1 = '男'
else:
gender1 = '女'
#print gender1
#print age.group(1)
datas = [gender1, age.group(1)]
returndatas
修改 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:
returnself.render.reply_text(fromUser,toUser,int(time.time()), content)
然后 git 提交到远程仓库。
You share rose get fun.
赠人玫瑰,手有余香。
我把这次的所有代码贴到 Github 了。
GitHub - loveQt/wxpytest
也可以看出来这次的所有文档结构:(Chrome插件 Octotree)
原文发布时间为: 2016-12-19
本文作者:段晓晨
本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”微信公众号