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

專 欄

段晓晨,写过一点爬虫,写过几篇文章。能力虽有限,会尽量把想说的东西讲清楚。

知乎ID:段小草

知乎专栏:小段同学的杂记,

https://zhuanlan.zhihu.com/666666❈——

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 命令更新远程代码后测试效果图如下:

到此我们就完成了第一部分,服务器搭建和一些简单的文本消息操作。 其实对于有一定编程能力的小伙伴来讲,捅破了这层窗户纸以后,其实就能根据自己以前的兴趣和经验做出许多自己喜欢的东西来了。Enjoy coding!

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 为例。

之后编辑 index.wsgi,在顶部添加代码即可。

# 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 提交到远程仓库。

4. 鱼香肉丝盖饭 You share rose get fun. 赠人玫瑰,手有余香。 我把这次的所有代码贴到 Github 了。 GitHub - loveQt/wxpytest 也可以看出来这次的所有文档结构:(Chrome插件 Octotree)

原文发布于微信公众号 - Python中文社区(python-china)

原文发表时间:2016-12-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Linux 新手必会的21条命令合集

23370
来自专栏腾讯Bugly的专栏

Android 内存优化总结&实践

导语 智能手机发展到今天已经有十几个年头,手机的软硬件都已经发生了翻天覆地的变化,特别是Android阵营,从一开始的一两百M到今天动辄4G,6G内存。然而大部...

60670
来自专栏张戈的专栏

实测Nginx服务器开启pagespeed加速效果

上周有一个站长问到我一个问题,问 fastcgi_cache 和 pagespeed 加速有没有冲突。略微想了下,2 个都是比较原生的主,应该不存在兼容问题。 ...

67690
来自专栏漏斗社区

黑客游戏| Owasp juice shop (三)

0x01 前言 继续上一篇的内容,往下闯关。想了解如何搭建的同学可参考第一篇文章。 看第一篇:黑客游戏| Owasp juice shop (一) 0x0...

40760
来自专栏性能与架构

移动端是时候考虑抛弃jQuery了?

jQuery确实非常有用,它的初衷就是为诸多浏览器提供统一的接口,避免书写各种条件语句判断当前环境 移动端已经被类似 Safari 和 Chrome 的 web...

38250
来自专栏NetCore

微信快速开发框架(一)-- 对微信公众平台开发的消息处理

这几天有点空,做了个Android App后,想着对接一下公司的微信平台,以便让客户更方便查询,在研究微信平台中,要注意以下几点: 1、微信验证消息真实性是用...

29770
来自专栏腾讯Bugly的专栏

【Dev Club分享】iOS黑客技术大揭秘

Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。每周都会举行嘉宾分享,话题讨论等活动。 本期,我们邀请了腾...

41460
来自专栏Gaussic

淘宝开放平台API开发(一) 原

       淘宝官方为应用开发者提供了一套很好的API,开发是只要调用它的API接口就可以获取相应的数据。笔者现正从事Java Web开发,因而就淘宝API调...

17520
来自专栏张戈的专栏

小网站最简单实用的动静分离优化方案

很久没写文章了,博客已经长草了,今天挤点时间分享一些小干货,也是回应一下不少站长朋友的留言问题。 有不少站长朋友问张戈博客的静态文件为啥是另外一个域名?有啥好处...

54080
来自专栏Android机动车

Android 8.0 功能和 API(翻译自Google官网)

Android 8.0 为用户和开发者引入多种新功能。本文重点介绍面向开发者的新功能。

19130

扫码关注云+社区

领取腾讯云代金券