本文面向想通过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. [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 ...

  2. coco数据集标注图转为二值图python(附代码)

    coco数据集大概有8w张以上的图片,而且每幅图都有精确的边缘mask标注. 后面后分享一个labelme标注的json或xml格式转二值图的源码(以备以后使用) 而我现在在研究显著性目标检测,需要的 ...

  3. celery 异步发送短信验证码、延迟任务

    短信 celery.py import os, django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffy ...

  4. 日常学习python

    一.条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(nu ...

  5. Python实现网络多人聊天室 - Windows

    项目名称:多人聊天室项目结构: client.py server.py settings.py项目思路:服务端接收客户端连接,客户端发送信息给服务端,服务端将信息发送给所有客户端.项目实现:主进程负责 ...

  6. ST表基础模板

    ST表是用来求RMQ问题(求区间最大或最小值问题)的实用数据结构,支持\(O(nlog_n)\)建立,\(O(1)\)查询,是比较高效的结构 其原理实质上是DP(我最讨厌的东西) 题面:屠龙宝刀... ...

  7. B1013

    python语言运行这道题有一个点运行超时,需要对求素数的算法进一步的优化 def isPrime(n): if n <= 1: return False i = 2 while i * i & ...

  8. orchard 中文文档 中英对照版

    ORCHARD CMS a free, open source, community-focused Content Management System built on the ASP.NET MV ...

  9. Vue 学习记录(一)-创建项目

    环境准备 node.js vue-cli 安装配置环境 1.下载node.js,使用默认配置安装 . 2.使用npm命令安装国内下载镜像(可选) cmd: npm install  -g  cnpm  ...

  10. 解决python 缺少os.fspath

    在python3.6下运行pandas会报错缺少os.fspath 升级到python3.7 3.7 安装参考:https://www.cnblogs.com/jifeng/p/11221469.ht ...