Python微信公众号开发—小白篇(一)

本文面向想经过Python学习公众号开发的同窗。一站式解决新手开发微信公众号遇到的全部问题。python

为了防止个人文章被处处转载,贴一下个人公众号【智能制造社区】,欢迎你们关注。git

github仓库地址https://github.com/injetlee/Python/tree/master/wechatgithub

本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的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):

    def on_get(self, req, resp):
        query_string = req.query_string
        query_list = query_string.split('&')
        b = {}
        for i in query_list:
            b[i.split('=')[0]] = i.split('=')[1]

        try:
            check_signature(token='这里填写配置界面你输入的token', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
            resp.body = (b['echostr'])
        except InvalidSignatureException:
            pass
        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):

    def on_get(self, req, resp):
        query_string = req.query_string
        query_list = query_string.split('&')
        b = {}
        for i in query_list:
            b[i.split('=')[0]] = i.split('=')[1]

        try:
            check_signature(token='xxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
            resp.body = (b['echostr'])
        except InvalidSignatureException:
            pass
        resp.status = falcon.HTTP_200

    def on_post(self, req, resp):
        xml = req.stream.read()
        msg = parse_message(xml)
        if msg.type == 'text':
            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):

    def on_get(self, req, resp):
        query_string = req.query_string
        query_list = query_string.split('&')
        b = {}
        for i in query_list:
            b[i.split('=')[0]] = i.split('=')[1]

        try:
            check_signature(token='xxxxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
            resp.body = (b['echostr'])
        except InvalidSignatureException:
            pass
        resp.status = falcon.HTTP_200

    def on_post(self, req, resp):
        xml = req.stream.read()
        msg = parse_message(xml)
        if msg.type == 'text':
            reply = TextReply(content=msg.content, message=msg)
            xml = reply.render()
            resp.body = (xml)
            resp.status = falcon.HTTP_200
        elif msg.type == 'image':
            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平台,对照片进行人脸分析检测以后再返回给用户,不要走开哦。
相关文章
相关标签/搜索