本文面向想通过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">'&amp;'</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">'&amp;'</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">'&amp;'</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)的更多相关文章

  1. Python微信公众号开发—小白篇

    本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造专栏],欢迎大家关注. github仓库地址http ...

  2. Python微信公众号教程基础篇——收发文本消息

    1. 概述: 在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果 ...

  3. nodejs 中koa框架下的微信公众号开发初始篇

    最近在搞微信公众号开发,后端采用的是nodejs下的koa框架,初识后端的菜鸟,自己搞难度太大了,网上找了很多文章,采用的中间件大都是express框架下的,不过好在爬了许多坑之后总算看见点曙光了,遂 ...

  4. Python微信公众号开发

    最近老大叫我学习开发微信,试着玩了下.网上查了下文档.有点过时. 简单步骤: 1)申请服务器并完成环境配置 去腾讯云购买云服务器.当然你也可以购买其他产品,比如阿里云.因为我是学生,有优惠110一年. ...

  5. python微信公众号开发学习记录

    网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样.真的无语了.只好自己总结一下开发的一些简单流程. 一先去注册个微信公众号,这个就不详细说了, 二登录后 ...

  6. [Python] 微信公众号开发 Python3

    搭建服务 开通一个阿里云ecs,安装python3及需要的包(参考下方官方文档) 将py文件保存在ecs上,运行 在本地访问阿里云的IP地址 能完成这步说明网络没问题 server.py 1 # -* ...

  7. python之微信公众号开发(基本配置和校验)

    前言 最近有微信公众号开发的业务,以前没有用python做过微信公众号开发,记录一下自己的学习和开发历程,共勉! 公众号类型 订阅号 普通订阅号 认证订阅号 服务号 普通服务号 认证服务号 服务方式 ...

  8. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  9. 微信公众号开发(一)--验证服务器地址的Java实现

    现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...

随机推荐

  1. Node.js Koa2开发微信小程序服务端

    1.promise.async.await const Koa = require('koa') const app = new Koa() // 应用程序对象 有很多中间件 // 发送HTTP KO ...

  2. JPA简介

    JPA的学习 JPA是Java Persistence API的简称,中文名Java持久层API.是Java EE5.0平台中Sun为了统一持久层ORM框架而制定的一套标准,注意是一套标准,而不是具体 ...

  3. python进阶之命名空间与作用域

    命名空间 Namespace Namespace命名空间,命名空间是一个字典(dictionary),它的键就是变量名,它的值就是那些变量的值.命名空间的一大作用是避免名字冲突. python使用命名 ...

  4. Cntlm 配置上网代理

    下载安装Cntlm之后.仅仅须要改动cntlm.ini文件,提供身份认证必要的信息,然后以服务的方式启动cntlm就能够了. 在cntlm.ini中有例如以下几个重要的配置是可能须要改动的: User ...

  5. 解决静态方法调用注入的service

    在使用jpa的复杂查询时,声明了specification时声明为静态方法,导致注入的service无法使用,故想到俩种方式,一种手动注入,一种注解注入,此文使用的时注解注入: 解决静态方法调用注入的 ...

  6. servlet中的IllegalStateException

    IllegalStateException在java web开发中比较常见,IllegalStateException的根本原因是java servlet在提交响应后,还尝试写内容. 所以避免Ille ...

  7. Shell基本运算符之字符串运算符

    Shell基本运算符 1.字符串运算符 常用的字符串运算符 运算符 说明 例子 = 检测两字符串是否相等,相等返回true [ $a = $b ] != 检测两个字符串是否部相等,不相等返回true ...

  8. mysql百万级数据分页查询缓慢优化-实战

    作为后端攻城狮,在接到分页list需求的时候,内心是这样的 画面是这样的 代码大概是这样的 select count(id) from …       查出总数 select * from …. li ...

  9. 『公交线路 状压dp 矩阵乘法加速』

    公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...

  10. 通过Filebeat把日志传入到Elasticsearch

    学习的地方:配置文件中预先处理字段数据的用法 通过Filebeat把日志传入到Elasticsearch Elastic Stack被称之为ELK (Elasticsearch,Logstash an ...