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

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介:

通过这一系列的文章,我们来介绍一下如何用Python开发微信公众号的后台。

主要工具:SAE+微信公众号+Git+Python本地环境(最好已经安装好了Git并配置好了Python IDE,比如Pycharm)

1. 工欲善其事

首先要简单介绍一下一些准备工作。

1.1 微信公众号

第一步是要注册一个个人微信公众号(个人账号不支持认证),按照https://mp.weixin.qq.com/ 给出的过程依次填写需要的信息就可以完成申请,如果已有账号的话可以直接登录。
登录以后可以看到左边栏中的自动回复功能:


在一般的使用中,我们可以通过设置关键字实现一些基本的自动回复功能,但是这样的关键字回复远远不能满足我们的实际需求,比如我们要实现一个查快递的功能,必然是要通过调用快递接口对不同用户的不同输入给出不同的输出结果,在这样的情况下关键字回复就显得很鸡肋了。于是我们选择了开发者模式。

在基本配置中,我们只需要修改URL、Token和EncodingAESKey三项配置即可,由于我们现在还没有配好自己的服务器,微信公众号这边的设置到这里暂停,等我们有了服务器获取了地址以后回来填写就可以了。

1.2 SAE

这次我们使用新浪云作为我们的服务器,注册登录https://www.sinacloud.com,新用户会有一定的优惠云豆,老用户充个十块也足够我们完成很多学习任务了。
选择云应用,进入控制台后创建新应用。


输入二级域名和应用名称(必填项),在下面的运行环境中选择 Python2.7 - 空应用。

成功创建应用后,会获得相应的一些配置数据和密钥,当然这些内容这次用不到,主要用到的就是登陆账号和安全密码。

SAE平台的代码版本控制分为Git和SVN,两者可以自由选择,这次我们选择使用Git进行代码的上传操作。

1.3 Git

对于Windows系统,电脑上如果安装了 Github Desktop 的话,应该就自带了 Git Bash 和 Git Shell 这样的工具,如果之前没有安装过 Git 相关的软件,可以自行搜索 Git 以后安装 Git for Windows。
Git 刚接触时可能很复杂,用起来功能很强大但繁琐,初学者可能绕来绕去就绕晕了,但是在这次的搭建过程中我们其实只需要用到四五条极为简单的命令即可,所以完全无需担心 Git ,也不要让 Git 成为你拒绝迈出第一步的障碍。(关于 SAE 的代码管理,详见https://www.sinacloud.com/doc/sae/tutorial/code-deploy.html#git
下面就让我们进入到真正的开发阶段吧!

2. 捅破窗户纸

犹记得我大一的时候公众号刚刚兴起,当时我还兴致冲冲地注册了账号,设置了一大堆的关键字自动回复,坚持了数天的图文消息推送,但是当我真正开始研究开发者模式,真正想去调用一些接口时却发现,好像自己该学的也都学了,该用的也都用过,就是串不到一起去,做不出想要的东西来(当时用的好像还是 PHP ),后面一直搁置了公众号这样的东西,一下子就拖到了现在。这两天试了一下 Python 服务器的配置,发现完全就是一层窗户纸,其实一捅就破,完全没有当初的纠结和复杂了。

2.1 服务器配置和 Token 认证

由于我们之前在 SAE 平台创建的是空应用,所以我们需要做一些基础的配置工作。这次我们选择使用 web.py (Python 2.7)来进行服务器搭建,如果本地没有 web.py 库的话可以通过 pip 命令进行安装(pip install web.py)。
之后我们需要创建一个项目,并编辑如下的基本代码。

config.yaml

name: wxpytest

version: 1



libraries:

- name: webpy

version: "0.36"



- name: lxml

version: "2.3.4"

...

index.wsgi

# coding: UTF-8

importos

importsae

import web



fromweixinInterface import WeixinInterface



urls = (

'/weixin','WeixinInterface'

)



app_root = os.path.dirname(__file__)

templates_root = os.path.join(app_root, 'templates')

render = web.template.render(templates_root)



app = web.application(urls, globals()).wsgifunc()        

application = sae.create_wsgi_app(app)

这两部分是 web.py 的基础配置文件,之后我们需要开始编写实现微信公众平台功能的代码。
新建weixinInterface.py

# -*- coding: utf-8 -*-

importhashlib

import web

importlxml

import time

importos





classWeixinInterface:



def __init__(self):

self.app_root = os.path.dirname(__file__)

self.templates_root = os.path.join(self.app_root, 'templates')

self.render = web.template.render(self.templates_root)



def GET(self):

        #获取输入参数

data = web.input()

signature=data.signature

timestamp=data.timestamp

nonce=data.nonce

echostr = data.echostr

        #自己的token

        token="token" #这里改写你在微信公众平台里输入的token

        #字典序排序

list=[token,timestamp,nonce]

list.sort()

        sha1=hashlib.sha1()

map(sha1.update,list)

hashcode=sha1.hexdigest()

        #sha1加密算法



        #如果是来自微信的请求,则回复echostr

ifhashcode == signature:

returnechostr

编写好这三部分的代码后,我们就实现了最简单的微信平台认证配置,这三部分代码中需要修改的只有 token 字段,需要和你在微信平台中输入的 token 保持一致。(之后有机会再详细写具体的认证过程吧,这次只罗列一下实现过程,需要注意的是认证 token 我们只需要用 GET 方法而之后的发消息需要用 POST 方法。)
这时我们需要把代码上传到 SAE 平台,然后在微信平台进行认证请求。
在文件根目录右键打开 Git Bash,依次输入如下命令,过程中可能会需要输入 SAE 的用户名和安全密码,按照提示操作即可。

gitinit

git remote add sae https://git.sinacloud.com/yourapp

git add .

git commit -m 'your commit message'

git push sae master:1

之后回到公众平台的开发者页面,填写 URL 为http://xxxx.sinaapp.com/weixin 填写 Token 与代码中的 token 一致,EncodingAESKey 随机生成,然后点击提交认证,如果上面步骤没有操作错误,这一步就可以认证成功了。

2.2 最简单的消息回复机制

在微信公众号的认证完成以后,就可以针对用户的消息搞一些事情了。(消息类型开发文档详见https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453&token=&lang=zh_CN

用户与公众号之间的消息交互类型分为文本、图片、语音、视频、小视频、地理位置、链接等,本文中主要会用到文本和图片两种消息类型。

用户消息以 XML形式传至我们搭建好的服务器中,我们需要解析 XML 信息,获取出需要的信息,进行处理后对用户回复结果。
我们先来简单看一下文本消息和图片消息的 XML 结构。
文本:

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1348831860</CreateTime>

<MsgType><![CDATA[text]]></MsgType>

<Content><![CDATA[this is a test]]></Content>

<MsgId>1234567890123456</MsgId>

</xml>

图片:

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1348831860</CreateTime>

<MsgType><![CDATA[image]]></MsgType>

<PicUrl><![CDATA[this is a url]]></PicUrl>

<MediaId><![CDATA[media_id]]></MediaId>

<MsgId>1234567890123456</MsgId>

</xml>

可以看到,两者共有的字段为ToUserName、FromUserName、CreateTime、MsgType和MsgId,对于文本消息,我们可以通过Content字段直接提取出消息文本内容,但是对于图片消息,我们需要通过PicUrl或MediaId获取图片信息后进行处理。

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 == u"天气"):

pass

elifmsgType == 'image':

pass

else:

pass

获取到用户发送的消息后,我们需要考虑如何给用户发消息,其实并不难,我们只需要给定一个消息模板,并在相应的功能最后设置返回值即可

returnself.render.reply_text(fromUser,toUser,int(time.time()), 'you string here') 

在目录下新建 templates/reply_text.xml

$def with (toUser,fromUser,createTime,content)

<xml>

<ToUserName><![CDATA[$toUser]]></ToUserName>

<FromUserName><![CDATA[$fromUser]]></FromUserName>

<CreateTime>$createTime</CreateTime>

<MsgType><![CDATA[text]]></MsgType>

<Content><![CDATA[$content]]></Content>

</xml>

然后编辑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

returnself.render.reply_text(fromUser,toUser,int(time.time()), content)

elifmsgType == 'image':

pass

else:

pass

以上操作的功能为:判断用户消息类型,如果消息类型为文本,则获取其内容content,并原样返回 content 作为消息。
完成以上修改后,重复 git 操作将修改 push 到远程仓库即可。

git add .

git commit -m 'your commit message'

git push sae master:1

测试效果图:




原文发布时间为:2016-12-05 
本文作者:段晓晨
本文来自云栖社区合作伙伴“ Python中文社区”,了解相关信息可以关注“ Python中文社区”微信公众号
相关实践学习
SAE极速部署弹性微服务商城
本实验带您体验在Serverless应用引擎SAE(Serverless App Engine)上快速部署一个弹性的在线商城微服务应用,使得终端用户可以通过公网访问访问该商城,并进行压力测试以验证其性能与稳定性。
相关文章
|
4月前
|
机器人 数据安全/隐私保护 Python
企业微信自动回复软件,企业微信自动回复机器人,python框架分享
企业微信机器人包含完整的消息处理流程,支持文本消息自动回复、事件处理、消息加密解密等功能
|
4月前
|
存储 数据采集 自然语言处理
Python爬取公众号文章并实现关键词分析
Python爬取公众号文章并实现关键词分析
|
4月前
|
数据采集 存储 C++
Python异步爬虫(aiohttp)加速微信公众号图片下载
Python异步爬虫(aiohttp)加速微信公众号图片下载
|
4月前
|
数据安全/隐私保护 Python
微信群成员导出工具, 微信群成员导出软件, 微信群管理工具软件【python】
这个工具提供了完整的微信群成员导出功能,包括登录微信、获取群列表、导出成员信息到Excel等功能
|
2月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
2月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
3月前
|
小程序 JavaScript API
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
这篇文章介绍了使用uni-halo框架进行微信小程序开发的过程,包括选择该框架的原因、开发目标以及项目配置和部署的步骤。
168 0
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
|
3月前
|
数据采集 监控 调度
应对频率限制:设计智能延迟的微信读书Python爬虫
应对频率限制:设计智能延迟的微信读书Python爬虫
|
4月前
|
API 数据安全/隐私保护 开发者
企业微信自动加好友软件,导入手机号批量添加微信好友,python版本源码分享
代码展示了企业微信官方API的合规使用方式,包括获取access_token、查询部门列表和创建用户等功能
|
4月前
|
JSON 机器人 API
微信机器人自动回复插件,vx自动回复机器人脚本助手,python框架分享
这个微信机器人系统包含三个主要模块:主程序基于itchat实现微信消息监听和自动回复功能

热门文章

最新文章

推荐镜像

更多
下一篇
oss云网关配置