Python微信公众号开发—小白篇(1)
本文面向想通过Python学习公众号开发的同学。一站式解决新手开发微信公众号遇到的所有问题。
为了防止我的文章被到处转载,贴一下我的公众号【智能制造社区】,欢迎大家关注。
github仓库地址https://github.com/injetlee/Python/tree/master/wechat
本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的AI平台,实现对照片的人脸检测与分析,分析年龄、性别、表情、魅力值等。
准备工作
首先要注册一个公众号,这个很简单,我们到微信公众平台注册就可以了,选择个人订阅号就可以。但是如果可以认证的,我建议选择认证订阅号,因为未认证的号很多功能权限都没有。好了,话不多说进入正题。
1. 配置公众号
- 打开公众号,在 开发->基本配置 页面填写内容。

- 下面说下需要填的内容,第一个URL要填的就是我们的服务地址,这个地址必须是外网地址并且是80端口。我们要本地开发时可以用 ngrok 解决。在ngrok.com官网下载。解压后就是一个exe程序。在当前目录下输入
.\ngrok.exe http 80即可启动。启动后如下图所示,图片中网址就是我们需要的

然后我们复制红色方框里面的地址到微信的URL输入框中,比如我的就输入http://c9b15df5.ngrok.io/connect 后面这个connect是我自己的服务的地址。就是我们在程序开发中自己命名的一个请求路径,如果是新手的话建议按照我的来。不要改动,避免程序跑不起来。
- 第二个Token,自己想一个就行了,随便填,你可以当他为一个密码。
- 第三个自己生成就可以了。
最后一个消息加解密方式选择明文模式。配置到这里就结束了,我们先不要关闭这个页面,等我们Python程序验证部分写好以后点击页面下面的提交就可以了。现在点会报错的。
2.接口验证部分代码编写
查看官方文档,当我们点击配置页面的提交按钮时,微信后台会向我们配置的地址发送signature、timestamp、nonce、echostr四个信息,我们拿到这部分信息后通过哈希加密算法计算出(timestamp,nonce,token)的哈希值与微信发送的signature对比,如果相等则说明是微信后台的请求,然后把echostr返回,就表示验证成功。
这一步,我们使用三个库,wechatpy-微信的Python SDK,falcon一个非常微小的Python Web框架,Waitress-一个Python WSGI服务器,当然在Linux上可以使用gunicorn代替waitress。通过pip install wechatpy[pycrypto]和pip install falcon,pip install waitress安装。代码如下,只需要把配置界面的token替换到代码里
import falcon
from falcon import uri
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
class Connect(object):
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_get</span><span class="hljs-params">(self, req, resp)</span>:</span>
query_string = req.query_string
query_list = query_string.split(<span class="hljs-string">'&'</span>)
b = {}
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> query_list:
b[i.split(<span class="hljs-string">'='</span>)[<span class="hljs-number">0</span>]] = i.split(<span class="hljs-string">'='</span>)[<span class="hljs-number">1</span>]
<span class="hljs-keyword">try</span>:
check_signature(token=<span class="hljs-string">'这里填写配置界面你输入的token'</span>, signature=b[<span class="hljs-string">'signature'</span>], timestamp=b[<span class="hljs-string">'timestamp'</span>], nonce=b[<span class="hljs-string">'nonce'</span>])
resp.body = (b[<span class="hljs-string">'echostr'</span>])
<span class="hljs-keyword">except</span> InvalidSignatureException:
<span class="hljs-keyword">pass</span>
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
- 代码写好以后,我们在命令行输入
waitress-serve --port=80 connect:app在80端口启动我们的程序。启动后如下图,代表启动成功,这时候我们到微信的配置页面点击提交,会弹出提交成功消息框,代表我们成功接入微信

- 简单说明以下上面代码,on_get函数接收微信发来的get请求,并且通过query_string拿到微信发送的参数,之后通过wechatpy的check_signature函数来校验。校验成功后把echostr返回给微信。
3. 发送文本信息给用户
- 接入成功后,就可以回复用户的信息了。我们增加一个函数处理用户发送的消息,整体代码如下:
import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
class Connect(object):
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_get</span><span class="hljs-params">(self, req, resp)</span>:</span>
query_string = req.query_string
query_list = query_string.split(<span class="hljs-string">'&'</span>)
b = {}
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> query_list:
b[i.split(<span class="hljs-string">'='</span>)[<span class="hljs-number">0</span>]] = i.split(<span class="hljs-string">'='</span>)[<span class="hljs-number">1</span>]
<span class="hljs-keyword">try</span>:
check_signature(token=<span class="hljs-string">'xxxxx'</span>, signature=b[<span class="hljs-string">'signature'</span>], timestamp=b[<span class="hljs-string">'timestamp'</span>], nonce=b[<span class="hljs-string">'nonce'</span>])
resp.body = (b[<span class="hljs-string">'echostr'</span>])
<span class="hljs-keyword">except</span> InvalidSignatureException:
<span class="hljs-keyword">pass</span>
resp.status = falcon.HTTP_200
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_post</span><span class="hljs-params">(self, req, resp)</span>:</span>
xml = req.stream.read()
msg = parse_message(xml)
<span class="hljs-keyword">if</span> msg.type == <span class="hljs-string">'text'</span>:
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
- 我们导出了parse_message,TextReply,ImageReply函数。当拿到用户消息时,判断是文本消息,就原样返回给用户。现在我们启动脚本后,向公众号发送文本消息就会收到自动回复了。
4. 发送图片信息给用户
- 我们简单修改下on_post函数,使其不仅能处理文本,也能处理图片信息。完整代码如下:
import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
class Connect(object):
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_get</span><span class="hljs-params">(self, req, resp)</span>:</span>
query_string = req.query_string
query_list = query_string.split(<span class="hljs-string">'&'</span>)
b = {}
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> query_list:
b[i.split(<span class="hljs-string">'='</span>)[<span class="hljs-number">0</span>]] = i.split(<span class="hljs-string">'='</span>)[<span class="hljs-number">1</span>]
<span class="hljs-keyword">try</span>:
check_signature(token=<span class="hljs-string">'xxxxxxx'</span>, signature=b[<span class="hljs-string">'signature'</span>], timestamp=b[<span class="hljs-string">'timestamp'</span>], nonce=b[<span class="hljs-string">'nonce'</span>])
resp.body = (b[<span class="hljs-string">'echostr'</span>])
<span class="hljs-keyword">except</span> InvalidSignatureException:
<span class="hljs-keyword">pass</span>
resp.status = falcon.HTTP_200
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_post</span><span class="hljs-params">(self, req, resp)</span>:</span>
xml = req.stream.read()
msg = parse_message(xml)
<span class="hljs-keyword">if</span> msg.type == <span class="hljs-string">'text'</span>:
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
<span class="hljs-keyword">elif</span> msg.type == <span class="hljs-string">'image'</span>:
reply = ImageReply(media_id=msg.media_id, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
- 我们在代码中加入了图片处理逻辑,如果是图片类型的消息,则把图片返回给用户。我们把图片发送给微信后台后,会自动生成一个media_id,我们发送这个media_id就可以了。
效果图

总结
以上就是第一部分的内容,我们首先做了接口认证,之后通过一个on_post函数处理了用户发送的文本和图片信息,不过目前就是原样返回。
下一篇我们接入腾讯AI平台,对照片进行人脸分析检测之后再返回给用户,不要走开哦。
Python微信公众号开发—小白篇(1)的更多相关文章
- Python微信公众号开发—小白篇
本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造专栏],欢迎大家关注. github仓库地址http ...
- Python微信公众号教程基础篇——收发文本消息
1. 概述: 在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果 ...
- nodejs 中koa框架下的微信公众号开发初始篇
最近在搞微信公众号开发,后端采用的是nodejs下的koa框架,初识后端的菜鸟,自己搞难度太大了,网上找了很多文章,采用的中间件大都是express框架下的,不过好在爬了许多坑之后总算看见点曙光了,遂 ...
- Python微信公众号开发
最近老大叫我学习开发微信,试着玩了下.网上查了下文档.有点过时. 简单步骤: 1)申请服务器并完成环境配置 去腾讯云购买云服务器.当然你也可以购买其他产品,比如阿里云.因为我是学生,有优惠110一年. ...
- python微信公众号开发学习记录
网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样.真的无语了.只好自己总结一下开发的一些简单流程. 一先去注册个微信公众号,这个就不详细说了, 二登录后 ...
- [Python] 微信公众号开发 Python3
搭建服务 开通一个阿里云ecs,安装python3及需要的包(参考下方官方文档) 将py文件保存在ecs上,运行 在本地访问阿里云的IP地址 能完成这步说明网络没问题 server.py 1 # -* ...
- python之微信公众号开发(基本配置和校验)
前言 最近有微信公众号开发的业务,以前没有用python做过微信公众号开发,记录一下自己的学习和开发历程,共勉! 公众号类型 订阅号 普通订阅号 认证订阅号 服务号 普通服务号 认证服务号 服务方式 ...
- 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)
微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...
- 微信公众号开发(一)--验证服务器地址的Java实现
现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...
随机推荐
- [C4] Andrew Ng - Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
About this Course This course will teach you the "magic" of getting deep learning to work ...
- coco数据集标注图转为二值图python(附代码)
coco数据集大概有8w张以上的图片,而且每幅图都有精确的边缘mask标注. 后面后分享一个labelme标注的json或xml格式转二值图的源码(以备以后使用) 而我现在在研究显著性目标检测,需要的 ...
- celery 异步发送短信验证码、延迟任务
短信 celery.py import os, django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffy ...
- 日常学习python
一.条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(nu ...
- Python实现网络多人聊天室 - Windows
项目名称:多人聊天室项目结构: client.py server.py settings.py项目思路:服务端接收客户端连接,客户端发送信息给服务端,服务端将信息发送给所有客户端.项目实现:主进程负责 ...
- ST表基础模板
ST表是用来求RMQ问题(求区间最大或最小值问题)的实用数据结构,支持\(O(nlog_n)\)建立,\(O(1)\)查询,是比较高效的结构 其原理实质上是DP(我最讨厌的东西) 题面:屠龙宝刀... ...
- B1013
python语言运行这道题有一个点运行超时,需要对求素数的算法进一步的优化 def isPrime(n): if n <= 1: return False i = 2 while i * i & ...
- orchard 中文文档 中英对照版
ORCHARD CMS a free, open source, community-focused Content Management System built on the ASP.NET MV ...
- Vue 学习记录(一)-创建项目
环境准备 node.js vue-cli 安装配置环境 1.下载node.js,使用默认配置安装 . 2.使用npm命令安装国内下载镜像(可选) cmd: npm install -g cnpm ...
- 解决python 缺少os.fspath
在python3.6下运行pandas会报错缺少os.fspath 升级到python3.7 3.7 安装参考:https://www.cnblogs.com/jifeng/p/11221469.ht ...