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

简介:

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

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

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

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

之后编辑 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 提交到远程仓库。

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
4. 鱼香肉丝盖饭
You share rose get fun.
赠人玫瑰,手有余香。
我把这次的所有代码贴到 Github 了。
GitHub - loveQt/wxpytest

也可以看出来这次的所有文档结构:(Chrome插件 Octotree)

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


原文发布时间为: 2016-12-19 

本文作者:段晓晨

本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”微信公众号

相关实践学习
基于小程序Serverless开发个人相册小程序
本场景基于小程序云Serverless+小程序开发者工具(IDE),快速搭建个人相册小程序
SAE的功能与使用入门
欢迎来到《SAE的功能与使用入门》,本课程是“云原生Serverless Clouder认证“系列中的第三阶段。课程将向您介绍阿里云Serverless应用引擎(SAE)服务相关的概念、特性与使用方式。通过课程将带您逐步深入探索Serverless世界,借助SAE服务,即使没有丰富的云计算和IT经验,也能够让开发人员在实际业务场景中便捷的掌握如何构建和部署应用程序,快速拥抱Serverless架构,将精力聚焦在应用代码和业务逻辑的实现上。 学习完本课程后,您将能够: 掌握Serverless应用引擎(SAE)的基本概念与核心优势 了解Serverless应用引擎(SAE)的核心功能 掌握使用Serverless应用引擎(SAE)的开发和部署流程 了解Serverless应用引擎(SAE)的适用场景和最佳实践  
相关文章
|
1天前
|
存储 程序员 API
python web开发示例详解
python web开发示例详解
7 0
|
9天前
|
小程序 前端开发 JavaScript
轻松学会微信小程序开发(一)
轻松学会微信小程序开发(一)
|
10天前
|
JSON 小程序 JavaScript
微信小程序开发1
微信小程序开发1
|
15天前
|
数据采集 存储 人工智能
【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
36 0
|
15天前
|
人工智能 机器人 API
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
20 0
|
15天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
15 0
|
15天前
|
XML 人工智能 数据安全/隐私保护
【Python+微信】【企业微信开发入坑指北】1. 数据链路打通:接收用户消息处理并回复
【Python+微信】【企业微信开发入坑指北】1. 数据链路打通:接收用户消息处理并回复
12 0
|
小程序 API Docker
Python 生成微信头图
Python 生成微信头图
188 0
Python 生成微信头图
|
14天前
|
存储 人工智能 数据处理
Python:编程的艺术与科学的完美交融
Python:编程的艺术与科学的完美交融
19 1
|
3天前
|
存储 Python 容器
Python高级编程
Python集合包括可变的set和不可变的frozenset,用于存储无序、不重复的哈希元素。创建集合可使用{}或set(),如`my_set = {1, 2, 3, 4, 5}`。通过add()添加元素,remove()或discard()删除元素,如`my_set.remove(3)`。

热门文章

最新文章