Giter Club home page Giter Club logo

wechat's Introduction

微信公众号Python-SDK

作者: @jeff_kit

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

1. 安装

pip

pip install wechat

源码安装

git clone [email protected]:jeffkit/wechat.git
cd wechat
python setup.py install

2. 用户上行消息处理框架

对于微信用户在公众号内发送的上行消息,本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的子类实例。

WxRequest

req是一个代表用户上行消息的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目前仅支持下列常用接口:

  • 发送消息
  • 用户管理
  • 自定义菜单管理
  • 多媒体上传下载
  • 二维码

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

wechat's People

Contributors

jeffkit avatar lpig avatar terryso avatar tolerious avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wechat's Issues

发送消息有时候会丢?

运行两次,

client = itchat.new_instance()
client.auto_login(hotReload=True, statusStorageDir='newInstance.pkl')
client.send_msg(msg, toUserName=name)

在测试时,发送给同一个人消息,第一次发消息扫描二维码,可以发送成功, 第二次消息会丢。

返回的json

{'LocalID': '1480947357859', 'BaseResponse': {'RawMsg': '请求成功', 'Ret': 0, 'ErrMsg': '请求成功'}, 'MsgID': '3373485233876127949'}

感觉使用web的网页给某个人发消息, 是可以成功的。

文档内容建议+2

结构已经好了很多 ;-)

但是缺少以下关键需求

自定义菜单

  • on_view ~自定义菜单管理
  • OAuth API ~ 自定义菜单管理
  • 以上两个管理 有什么差别?

对于有的土豪 公众号, 已经开通了自制菜单,
如何快速可动态调整的响应 自制菜单的上行,就非常关键了,

这方面能给出具体的思路和 demo 嘛?

  • 关键的是,如何测试? 在本地?
  • 以及,在实际使用过程中,是否有什么限制?
    • 比如? 图文消息个数,限制为10条以内
    • 那么,一次可以返回几个 多图文消息嘛?

用户管理

  • 最常见的,如何自动识别用户?
  • 将用户上次的提问/指令/菜单 ...操作进行记录
  • 可以形成 FSM 样的有序指令响应?

再问个问题,与werobot优势在哪里

已经有werobot,这个wechat做的时候,出发点是什么呢?觉的werobot结构不好太乱?
或者换句话说,在werobot和wechat上,什么时候用哪个比较好呢?

企业号回调模式回复中文消息微信中没有反应

如题,在WxTextResponse(result, req)中如果result是包含中文的话,微信客户端没有反应;如果只是英文和数字没有问题,考虑应该是编码的问题导致微信端解密失败,目前还没发现哪个地方有问题。

增加对公众号第三方平台授权的支持

  1. 增加对公众号第三方平台获取access_token的支持
  2. 增加公众号第三方平台特有接口的支持
开发文档: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318292&lang=zh_CN

invalid request issue

试用demo代码,Wx app并未能如愿返回用户输入,而是遇到invalid request.

**invalid request [22/Feb/2016 20:05:15] "POST /echo?signature=025f1ccce4da17588cd4180504b0d473183a992c×tamp=1456142710&nonce=2123908672 HTTP/1.0" 200 15**

二维码功能还没实现吧?

下面说的二维码的功能,还没实现吧?

  1. OAuth API

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

发送消息
用户管理
自定义菜单管理
多媒体上传下载
二维码
其他接口拟于未来的版本中支持,同时欢迎大家来增补。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.