微信公众号Python-SDK 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
微信公众号Python-SDK 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
微信公众号Python-SDK 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
微信公众号Python-SDK 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
微信公众号Python-SDK 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !
授权协议 GPLv3
开发语言 Python
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
提 交 者 红薯
适用人群 未知
收录时间 2015-11-16

软件简介

本SDK支持微信公众号以及企业号的上行消息及OAuth接口。本文档及SDK假设使用者已经具备微信公众号开发的基础知识,及有能力通过微信公众号、企业号的文档来查找相关的接口详情。

1. 安装

pip install wechat

源码安装

git clone git@github.com:jeffkit/wechat.git
cd wechat
python setup.py install

对于微信用户在公众号内发送的上行消息,本sdk提供了一个微型处理框架,开发者只需继承wechat.official.WxApplication类, 实现各种消息对应的方法,然后把该类与自己熟悉的web框架结合起来使用即可。

WxApplication内部会实现请求的合法性校验以及消息的分发等功能,还对上行消息对行了结构化,开发者把精力放到业务逻辑的编写即可。

WxApplication类核心方法:

WxApplication.process(params, xml, token=None, app_id=None, aes_key=None)

WxApplication的process函数,接受以下参数:

  • params, url参数字典,需要解析自微信回调的url的querystring。格式如:{'nonce': 1232, 'signature': 'xsdfsdfsd'}

  • xml, 微信回调时post的xml内容。

  • token, 公众号的上行token,可选,允许在子类配置。

  • app_id, 公众号应用id,可选,允许在子类配置。

  • aes_key, 公众号加密secret,可选,允许在子类配置。

process最后返回一串文本(xml或echoStr)。

使用场景1:上行URL有效性验证

在微信公众号的后台设置好URL及token等相关信息后,微信会通过GET的方式访问一次该URL,开发者在URL的响应程序里直接调用app.process(params, xml=None)即可返回echStr。

qs = 'nonce=1221&signature=19selKDJF&timestamp=12312'
query = dict([q.split('=') for q in qs.split('&')])
app = YourApplication()
echo_str = app.process(query, xml=None)
# 返回echo_str给微信即可

使用场景2:处理上行消息

用户在微信公众号上发消息给公众号,微信服务器调用上行的URL,开发者需要对每次的的请求进行合法性校验及对消息进行处理,同样的,直接调用app.process方法就好。

qs = 'nonce=1221&signature=19selKDJF&timestamp=12312'
query = dict([q.split('=') for q in qs.split('&')])
body = '<xml> ..... </xml>'
app = YourApplication()
result = app.process(query, xml=body)
# 返回result给微信即可

WxApplication子类示例

下面先看看一个WxApplication的示例代码,用于把用户上行的文本返还给用户:

from wechat.official import WxApplication, WxTextResponse, WxMusic,\
    WxMusicResponse

class WxApp(WxApplication):

    SECRET_TOKEN = 'test_token'
    WECHAT_APPID = 'wx1234556'
    WECHAT_APPSECRET = 'sevcs0j'

    def on_text(self, text):
        return WxTextResponse(text.Content, text)

需要配置几个类参数,几个参数均可在公众号管理后台的开发者相关页面找到,前三个参数如果不配置,则需要在调用process方法时传入。

  • SECRET_TOKEN: 微信公众号回调的TOKEN

  • APP_ID: 微信公众号的应用ID

  • ENCODING_AES_KEY: (可选),加密用的SECRET,如您的公众号未采取加密传输,不需填。

  • UNSUPPORT_TXT:(可选),收到某种不支持类型的消息时自动响应给用户的文本消息。

  • WELCOME_TXT:(可选), 新关注时默认响应的文本消息。

然后,您需要逐一实现WxApplication的各个on_xxxx函数。不同类型的上行消息及事件均有对应的on_xxx函数

on_xxx函数

所有的on_xxx函数列举如下:

  • on_text, 响应用户文本

  • on_link,响应用户上行的链接

  • on_image,响应用户上行图片

  • on_voice,响应用户上行语音

  • on_video,响应用户上行视频

  • on_location,响应用户上行地理位置

  • on_subscribe,响应用户关注事件

  • on_unsubscribe,响应用户取消关注事件

  • on_click,响应用户点击自定义菜单事件

  • on_scan,响应用户扫描二维码事件

  • on_location_update,响应用户地理位置变更事件

  • on_view,响应用户点击自定义菜单访问网页事件

  • on_scancode_push

  • on_scancode_waitmsg

  • on_pic_sysphoto

  • on_pic_photo_or_album

  • on_pic_weixin

  • on_location_select

on_xxx函数的定义如下:

def on_xxx(self, req):
    return WxResponse()

on_xxx函数,接受一个WxRequest参数req,返回一个WxResponse的子类实例。

WxRequestreq是一个代表用户上行消息的WxRequest实例。其属性与消息的XML属性一一对应,不同的消息有几个相同的属性:
  • ToUserName

  • FromUserName

  • CreateTime

  • MsgType

  • MsgId

不同的消息类型对应有各自的属性,属性名与消息的xml标签名保一致。如MsgType为�text的的req,有一个Content属怀,而MsgType为image的req,则有PicUrl及MediaId两个属性。更多消息详情请查看微信公众号官方文档

WxResponse

on_xxx函数需要返回一个WxResponse的子类实例。WxResponse的子类及其构造的方式有:

WxTextResponse, 文本消息
WxTextResponse("hello", req)
WxImageResponse, 图片消息
WxImageResponse(WxImage(MediaId='xxyy'),req)
WxVoiceResponse, 语音消息
WxVoiceResponse(WxVoice(MediaId='xxyy'),req)
WxVideoResponse, 视频消息
WxVideoResponse(WxVideo(MediaId='xxyy', Title='video', Description='test'),req)
WxMusicResponse, 音乐消息
WxMusicResponse(WxMusic(Title='hey jude', 
    Description='dont make it bad', 
    PicUrl='http://heyjude.com/logo.png', 
    Url='http://heyjude.com/mucis.mp3'), req)
WxNewsResponse, 图文消息
WxNewsResponse(WxArticle(Title='test news', 
    Description='this is a test', 
    Picurl='http://smpic.com/pic.jpg', 
    Url='http://github.com/jeffkit'), req)
WxEmptyResponse, 无响应
WxEmptyResponse(req)

在Django中使用WxApplication

下面以Django为例说明,实现一个微信回调的功能(view),利用上面示例代码中的WxApp:

from django.http import HttpResponse

def wechat(request):
    app = WxApp()
    result = app.process(request.GET, request.body)
    return HttpResponse(result)

配置 urls.py:

urlpatterns = patterns('',
    url(r'^wechat/', 'myapp.views.wechat'),
)

在Flask中使用WxApplication

from flask import request
from flask import Flask
app = Flask(__name__)

@app.route('/wechat')
def wechat():
    app = WxApp()
    return app.process(request.args, request.data)

OK.就这么多,WxApplication本身与web框架无关,不管你使用哪个Framework都可以享受到它带来的便利。

什么?你不喜欢写WxApplication的子类?!

好吧,其实,你可以在任何地方写on_xxx的响应函数。然后在使用之前,告诉一个WxApplication你要用哪个函数来响应对应的事件就好。以Django为例:

# 在任何地方写你自己的消息处理函数。
# @any_decorator   # 添加任何装饰器。
def my_text_handler(req):
    return WxTextResponse(req.Content, req)

# 在web的程序里这样使用:
def wechat_view(request):
    app = WxApplication()   # 实例化基类就好。
    app.handlers = {'text': my_text_handler}  # 设置你自己的处理器
    result = app.process(request.GET, request.body, 
        token='xxxx', app_id='xxxx', aes_key='xxxx')
    return HttpResponse(result)

嗯,可以自定义消息的handlers,而如果要针对事件自定义handlers的话,要修改app.event_handlers,数据的格式是一样的。具体的消息和事件类型的key,就直接看看源码得了。卡卡。

3. OAuth API

OAuth API目前仅支持下列常用接口:

  • 发送消息

  • 用户管理

  • 自定义菜单管理

  • 多媒体上传下载

  • 二维码

其他接口拟于未来的版本中支持,同时欢迎大家来增补。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (4)

加载中
不错 留眼
2017/12/15 15:07
回复
举报
这个好
2017/03/10 01:04
回复
举报
这个微信的 Python SDK 不错 #微信公众号Python-SDK#
2015/11/16 11:16
回复
举报
你好,可以开发出不用借助第三方平台,在微信公众平台使用拼团、砍价的插件吗? #微信公众号Python-SDK#
2016/04/30 01:09
回复
举报
更多评论
暂无内容
发表了博客
2019/05/26 22:05

python监控wechat

import os import re import shutil import time import itchat from itchat.content import * # 说明:可以撤回的有文本文字、语音、视频、图片、位置、名片、分享、附件 # {msg_id:(msg_from,msg_to,msg_time,msg_time_rec,msg_type,msg_content,msg_share_url)} msg_dict = {} # 文件存储临时目录 rev_tmp_dir = os.p...

0
0
发表了博客
2020/05/08 11:55

【wechat login】

https://lucent.blog/passages/vue%E5%AE%9E%E7%8E%B0%E5%86%85%E5%B5%8C%E4%BA%8C%E7%BB%B4%E7%A0%81%E5%BE%AE%E4%BF%A1%E7%99%BB%E5%BD%95/ https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html...

0
0
发表于运维专区
2017/07/27 01:24

Wechat robot&shell 搭建

(原文已在本人博客发表,排版带来的阅读不便可点击下方原文链接击转到本人博客阅读,欢迎大家的访问和指正) 初衷 樹莓派自從買回來已經吃灰半年有餘,正巧最近在看python,本著練手的初衷開始對樹莓派進行“廢物...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了问答
2016/08/26 10:07

微信支付统一下单接口的并发调用频率限制是多少?

微信没有说明这个接口有频率限制,但是自己做并发测试调用接口的时候有些会返回频率限制的通信异常

4
0
发表了问答
2016/06/14 10:34

微信公众号SCAN 扫码事件 有返回消息 但是提示该公众号无法提供服务解决方案

开发者模式,已经返回消息但是还是提示无法提供服务,请求只有一次

8
0
发表了问答
2016/04/21 17:02

微信长连接转短链接接口如何使用

使用微信长连接转短链接,把 原url http://www.baidu.com/ 转成了http://w.url.cn/s/Ae8gaWd 但是返回的url无论直接访问还是生成二维码扫 都是进入空白页,并没有进入预期的百度页面, 请问这是怎么回事,接口地址: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433600&token=&lang=zh_CN...

4
0
发表了问答
2017/02/07 17:59

强烈推荐,小程序营销神器!阿拉丁统计工具参数二维码分析功能太给力了!

强烈推荐一款小程序的统计工具——阿拉丁,太好用了! 起初我们只是用微信后台的数据统计,后来我们技术老大给我推荐,不仅功能强大而且嵌入简单,我就抱着试一试的心态用了一版。结果发现确实不错,数据统计和分析维度更广,而且功能更强大,最近出的二维码功能更是牛逼了!!!下个版本好像会出分享功能的来源分析,很期...

1
1
发表了问答
2015/12/11 16:12

微信开发如何获取用户向公众号发送的图片?

如题 需要把用户向公众号发送的图片保存在自己的server上, 我是这样做的 1 获取用户发送的图片信息, 通过http://mp.weixin.qq.com/wiki/17/fc9a27730e07b9126144d9c96eaf51f9.html#.E5.9B.BE.E7.89.87.E6.B6.88.E6.81.AF 接到用户发送的图片的信息, 此处有问题,得到的 PicUrl 为什么不能访问是空白的? 既然PicUrl ...

1
0
发表了问答
2016/11/07 21:38

关于python在开发新浪sae时遇到定时任务返回404的问题

起因:想玩一下微信公众号,于是到新浪云搭了SAE。根据网上大牛们的博客,实现了根据消息被动回复功能,于是想进一步实现一些其他的功能,比如说每天定时从我们学校的网站爬取一些新闻存到数据库,然后根据用户的信息来推送。 解决思路:现在本地写好了爬虫脚本,没遇到什么大问题。于是决定将它放到新浪云上看能不能定时...

1
0
发表了问答
2016/09/28 14:47

微信多群直播是怎么实现的?

因为要做微信多群直播,我一开始认为是无法实现的。 1.微信并没有提供除公众号外的消息接口 2.转发也并不能转发图片和语音消息。 可是,有个公众号“一起学堂”已经实现了这些,大家讨论下,它是如何实现的。 声称可以实现语音丶文字丶视频图片和链接的同步转播

5
0
发表了问答
2016/08/29 10:57

聊天软件安司密信具有网盘存储功能,为什么qq微信不这么做?

聊天软件多如牛毛,而国内关于聊天社交,基本都是腾讯的天下,但是腾讯的qq似乎放弃了linux用户,而最新的聊天软件安司密信却好像有占据linux市场的愿想; 可能已经有人知道,安司密信linux版本已上线deepin商店,被deepin官方表定位热门推荐软件,其最新版本更具有消息全平台同步和【我的密云】功能,另外安司密信还可以...

10
0
发表了问答
2016/05/21 10:58

微信H5页面支付出现 没有此SDK或暂不支持此SDK模拟

微信H5页面支付出现 没有此SDK或暂不支持此SDK模拟 错误如下 用了官方的两种方法都是这样的 求大神来解决

5
0
发表了问答
2015/12/08 19:51

微信有 历史文章(所有文章)api接口吗?

微信开发遇到一个需求, 要列出所有历史文章(图文消息), 如图: 上面的文章每一个都是独立的,而且页面是host 在微信服务器上的(手机中下拉页面可以看到:“网页由mp.weixin.qq.com 提供”),如何实现? 仔细看了微信开发文档中的 获取素材api相关的api都 无法实现相应功能, 所以怀疑微信是否直接提供有类似的api? ...

14
0
发表了问答
2016/05/18 14:44

求教微信网页授权登录的问题

最近刚接触微信端的看法,看来微信文档有些东西还是很不清楚,求路人指点一二 需要实现的是微信公众号中点击菜单,出现微信授权页面,进行跳转。跪求微信授权页面的demo。

1
0
发表了问答
2016/03/27 21:37

怎么获取微信的signsure值?

wx.config({ debug: false, //调式模式,设置为ture后会直接在网页上弹出调试信息,用于排查问题 appId: '<?php echo $signPackage["appId"];?>', timestamp: <?php echo $signPackage["timestamp"];?>, nonceStr: '<?php echo $signPackage["nonceStr"];?>', signature: '<?php echo $signPackage["signature"];?>', js...

1
0
发表了问答
2015/12/09 11:33

微信如何获取封面url

如题 微信获取素材接口http://mp.weixin.qq.com/wiki/11/5ec27b71532e237cf3dd8451e1a3706b.html 当获取图文消息时候, 返回的封面是thumb_media_id ,需要再次掉api取出封面,但是取回来的不是url, 而直接返回图片,原文“其他类型(非图文消息,包含图片等)的素材消息,则响应的直接为素材的内容” 我不想保存这个文件...

3
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
4 评论
185 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部