微信公众平台开发之用Flask+SAE实现简单被动消息回复功能

程序可以实现很多美好的事情,如果有好的Idea,微信开发实现的功能完全可以替代电脑程序或手机APP。

偶然听同事聊天,说关注了某一电影资源微信公众号,只需在对话框回复电影名称,对方公众号便可直接推送这部电影的下载链接。

我便梳理了一下这个流程,这就相当于将电影网站的搜索框的功能,移植到了微信公众平台上面了。具体的实现思路应该是:

  1. 利用微信提供的接口,获取用户发送的消息
  2. 处理用户发来的消息,通过在事先准备好的数据库中匹配到对应的电影资源
  3. 再次通过消息回复接口发送给用户

上面第二部功能部分就不讲了,本文主要介绍对接微信公众平台的消息接口,然后实现简单消息自动回复的功能。

开发前的准备

需要准备两个东西:申请好的微信订阅号和一台云服务器。目前市面上为大家所熟知的云服务器包括:阿里云、新浪SAE和腾讯云。因为本人很早便申请了新浪云的服务器,所以本文是基于在SAE上测试的。

如果你需要申请SAE,可以使用我的专属推荐链接:http://t.cn/R5p4gRu,如果申请成功,对于我们两人都会有奖励。

另外:本文使用Python的Flask来开发。

新浪SAE的配置

因为微信后台配置时,需要验证自己事先设置好的服务器,所以这里先简单介绍一下新浪SAE的配置,和简单的微信验证代码。

进入自己的新浪云后台,选择创建新应用,然后开发语言选择Python,运行环境选择标准环境,填写自己唯一想要的二级域名和自己的应用名称,之后点击右边的创建应用按钮,即可创建成功。

下图为我已经创建好的应用:

之后便可以使用Git在自己电脑上编辑好代码,然后传至自己已经申请好的云应用中。

Git代码部署说明

在你应用的git代码目录里,添加一个新的git远程仓库 sae

$ git remote add sae https://git.sinacloud.com/jikenow

编辑代码并将代码部署到 sae 的版本1。

$ git add .
$ git commit -m 'Init my first app'
$ git push sae master:1

SAE支持Git、SVN、代码打包上传三种提交方式,具体请参考:http://www.sinacloud.com/doc/sae/tutorial/code-deploy.html#git

下面我给出的代码,也是通过以上git方法传到云应用中,如果不是很清楚,可以阅读上面给出的帮助文档。

微信验证代码

当在微信后台配置自己的云服务器时,微信的服务器会发送GET请求至我们提供的URL,这时需要我们通过一些判断来确认其确实是由微信发起的请求,如果确认ok,就返还给微信echostr参数内容。具体Python-Flask代码如下:

#coding:utf-8
from flask import Flask,request,make_response
import time,hashlib,re,requests
import xml.etree.ElementTree as ET

app = Flask(__name__)

@app.route('/weixin',methods = ['GET','POST'])
def weixin():
    # 微信验证
    if request.method == 'GET':
        token = 'weixin'
        query = request.args
        signature = query.get('signature','')
        timestamp = query.get('timestamp','')
        nonce = query.get('nonce','')
        echostr = query.get('echostr','')
        s = [timestamp,nonce,token]
        s.sort()
        s = ''.join(s)
        if hashlib.sha1(s).hexdigest() == signature:
            return make_response(echostr)

注意我上面路由设置的是/weixin后缀,所以我之后向微信后台添加的配置URL就是http://jikenow.applinzi.com/weixin,前面的网址便是我申请的二级域名。

参考网址:微信接入指南

附逻辑流程图:

写好了之后保存为main.py,然后还需要新建一个index.wsgi的文件,是SAE要用到,文件内容如下:

import sae
from main import app

application = sae.create_wsgi_app(app)

保存好之后,将以上两个文件通过Git传至云应用中。

微信公众平台后台开发者配置

  1. 进入微信公众平台后台,选择开发选项下的基本配置
  2. 之后可以看到服务器配置选项,点击修改配置
  3. 填写对应的服务器URLhttp://jikenow.applinzi.com/weixin)和Token参数(本人用的是weixin,你可以设置自己唯一的字符),为了方便开发,加解密方式设置为明文模式,提交
  4. 此时微信便会发送GET请求至我们的服务器URL中,我们之前已设置好,所以应该会通过验证
  5. 点击启用即可成功

下图显示已启用(验证成功):

重头戏:被动回复用户消息

上面说了一大堆,只是一些准备工作而已,如果上面的准备工作有所不明白的,你可以参考我在文章末给出的几个链接文章。

回归正题,现在需要编写一个很简单的小程序,模仿用户说话,也就是用户向你发送什么文本内容,你原样返回给用户此文本内容即可。

流程有下面三点:

  1. 接收用户发送的普通文本消息,微信会通过POST方式将XML数据包发送给我们的URL中
  2. 复制此文本消息且生成回复的XML格式的数据
  3. 被动消息回复给微信服务器,然后即发送给用户

上面三点的逻辑清楚了,代码也就不难理解了,接着上面的微信验证代码来:

def weixin():
    # 微信验证
    # 上面给出
    # 被动回复消息
    else: # 即如果为POST请求执行下面的代码
        xmlData = ET.fromstring(request.stream.read())
        msg_type = xmlData.find('MsgType').text
        if msg_type == 'text':
            ToUserName = xmlData.find('ToUserName').text
            FromUserName = xmlData.find('FromUserName').text
            Content = xmlData.find('Content').text
            reply = '''<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                    </xml>'''
            response = make_response( reply % (FromUserName, ToUserName, str(int(time.time())), Content ) )
            response.content_type = 'application/xml'
            return response

搞好之后,保存main.py文件,上传至服务器。至此,我们的微信模仿用户说话的小功能已经做好了。

功能虽小,但是已经迈出了第一步,之后的所有更强大的功能,都会在此基础上延伸。

参考网址

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 24,865评论 7 249
  • 高效课堂有一个评课五条,有人称之为“评五条”: ◆看状态:是基于常识的判断,主要通过看动作、听声音、察表情来感知课...
    云海2阅读 214评论 0 1
  • 很多人都说异地恋不靠谱,但总有些感动,能够让人鼓起勇气坚定信念。我希望我可以在这条路上好好走下去吧,不会为了贪新鲜...
    旅人未安阅读 148评论 0 0