本文面向想通过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.微信 ...
随机推荐
-
Mysql 死锁的详细分析方法
用数据库的时候,偶尔会出现死锁,针对我们的业务系统,出现死锁的直接结果就是系统卡顿.客户找事儿,所以我们也在想尽全力的消除掉数据库的死锁.出现死锁的时候,如果只是想解锁,用show full proc ...
-
poj 2115 Looooops
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23637 Accepted: 6528 Descr ...
-
ORACLE rowid切分大表
通过如下sql获取rowid切分范围 ) || dbms_rowid.rowid_create(, DOI, lo_fno, lo_block, ) ) || ) || dbms_rowid.rowi ...
-
php拦截器(魔术方法)
什么是PHP拦截器? 英文名称 “interceptor”,作用是 拦截 发送未定义的方法和属性的消息. 先看一段代码,定义了一个School类,实例化一个对象$obj,获取一个未定义的属性teach ...
-
Redhat关闭SELinux和防火墙的办法(转)
Redhat使用了SELinux来增强安全,关闭的办法为:1. 永久有效修改 /etc/selinux/config 文件中的 SELINUX="" 为 disabled ,然后重 ...
-
UVA 11582 Colossal Fibonacci Numbers(数学)
Colossal Fibonacci Numbers 想先说下最近的状态吧,已经考完试了,这个暑假也应该是最后刷题的暑假了,打完今年acm就应该会退了,但是还什么都不会呢? +_+ 所以这个暑假,一定 ...
-
2017年要学习的三个CSS新特性
这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东西要学习.尽管CSS有很多新的特性, ...
-
Dom4j下载及使用Dom4j读写XML简介(转)
Dom4j下载及使用Dom4j读写XML简介 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:ht ...
-
简单来看看JavaBean
1.什么是JavaBean? JavaBean是一个遵循特定写法的java类. 用作JavaBean的类必须有一个公共的,无参数的构造方法. JavaBean的属性与普通的Java类的属性的概念一样, ...
-
软工作业-四则运算(java实现)BY叶湖倩,叶钰羽
四则运算生成器 BY-信安1班 叶湖倩(3216005170) 信安1班 叶钰羽(3216005171) 1. 项目介绍 源代码GitHub地址:https://github.com/yeyuyu/s ...