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

本文面向想通过Python学习公众号开发的同学。一站式解决新手开发微信公众号遇到的所有问题。

为了防止我的文章被到处转载,贴一下我的公众号【智能制造社区】,欢迎大家关注。

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

本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的AI平台,实现对照片的人脸检测与分析,分析年龄、性别、表情、魅力值等。

准备工作

首先要注册一个公众号,这个很简单,我们到微信公众平台注册就可以了,选择个人订阅号就可以。但是如果可以认证的,我建议选择认证订阅号,因为未认证的号很多功能权限都没有。好了,话不多说进入正题。

1. 配置公众号

  • 打开公众号,在 开发->基本配置 页面填写内容。

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

  • ngrok启动.jpg
  • 然后我们复制红色方框里面的地址到微信的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端口启动我们的程序。启动后如下图,代表启动成功,这时候我们到微信的配置页面点击提交,会弹出提交成功消息框,代表我们成功接入微信
    waitress-serve.png
  • 简单说明以下上面代码,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就可以了。

效果图

  • 效果.png

总结

  • 以上就是第一部分的内容,我们首先做了接口认证,之后通过一个on_post函数处理了用户发送的文本和图片信息,不过目前就是原样返回。

  • 下一篇我们接入腾讯AI平台,对照片进行人脸分析检测之后再返回给用户,不要走开哦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容