用户手册¶
AioWeRoBot 是一个异步微信公众号开发框架。
入门¶
Hello World¶
最简单的Hello World, 会给收到的每一条信息回复 Hello World
import aiowerobot
robot = aiowerobot.AioWeRoBot(token='tokenhere')
@robot.handler
async def hello(message):
return 'Hello World!'
# 让服务器监听在 0.0.0.0:80
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()
消息处理¶
AioWeRoBot 会解析微信服务器发来的消息, 并将消息转换成成 Message 或者是 Event 。 Message 表示用户发来的消息,如文本消息、图片消息; Event 则表示用户触发的事件, 如关注事件、扫描二维码事件。 在消息解析、转换完成后, AioWeRoBot 会将消息转交给 Handler 进行处理,并将 Handler 的返回值返回给微信服务器。
在刚才的 Hello World 中, 我们编写的
@robot.handler
async def hello(message):
return 'Hello World!'
就是一个简单的 Handler , @robot.handler 意味着 robot 会将所有接收到的消息( 包括 Message 和 Event ) 都转交给这个 Handler 来处理。 当然, 你也可以编写一些只能处理特定消息的 Handler
# @robot.text 修饰的 Handler 只处理文本消息
@robot.text
async def echo(message):
return message.content
# @robot.image 修饰的 Handler 只处理图片消息
@robot.image
async def img(message):
return message.img
使用 Session 记录用户状态¶
AioWeRoBot 提供了 Session 功能, 可以让你方便的记录用户状态。 比如, 这个 Handler 可以判断发消息的用户之前有没有发送过消息
@robot.text
async def first(message, session):
if 'first' in session:
return '你之前给我发过消息'
session['first'] = True
return '你之前没给我发过消息'
Session 功能默认开启, 并使用 SQLite 存储 Session 数据。 详情请参考 Session 文档
创建自定义菜单¶
自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。 aiowerobot.client.Client
封装了微信的部分 API 接口,我们可以使用 aiowerobot.client.Client.create_menu()
来创建自定义菜单。
在使用 Client 之前, 我们需要先提供微信公众平台内的 AppID 和 AppSecret
from aiowerobot import AioWeRoBot
robot = AioWeRoBot()
robot.config["APP_ID"] = "你的 AppID"
robot.config["APP_SECRET"] = "你的 AppSecret"
client = robot.client
然后, 我们就可以创建自定义菜单了
await client.create_menu({
"button":[{
"type": "click",
"name": "今日歌曲",
"key": "music"
}]
})
注意以上代码只需要运行一次就可以了。在创建完自定义菜单之后, 我们还需要写一个 handler 来响应菜单的点击操作
@robot.key_click("music")
async def music(message):
return '你点击了“今日歌曲”按钮'
消息加解密¶
AioWeRoBot 支持对消息的加解密,即微信公众号的安全模式。
在开启消息加解密功能之前,请先阅读微信官方的 消息加解密说明
为 AioWeRoBot 开启消息加密功能,首先需要安装 cryptography
pip install cryptography
之后, 你只需要将开发者 ID(AppID) 和微信公众平台后台设置的 EncodingAESKey 加到 AioWeRoBot 的 Config 里面就可以了
from aiowerobot import AioWeRoBot
robot = AioWeRoBot()
robot.config["APP_ID"] = "Your AppID"
robot.config['ENCODING_AES_KEY'] = 'Your Encoding AES Key'
AioWeRoBot 之后会自动进行消息的加解密工作。
Handler¶
WeRoBot会将合法的请求发送给 handlers 依次执行。
如果某一个 Handler 返回了非空值, AioWeRoBot 就会根据这个值创建回复,后面的 handlers 将不会被执行。
你可以通过修饰符或 add_handler()
添加 handler
import aiowerobot
robot = aiowerobot.AioWeRoBot(token='tokenhere')
# 通过修饰符添加handler
@robot.handler
async def echo(message):
return 'Hello World!'
# 通过`add_handler`添加handler
async def echo(message):
return 'Hello World!'
robot.add_handler(echo)
类型过滤¶
在大多数情况下, 一个 Handler 并不能处理所有类型的消息。幸运的是, AioWeRoBot 可以帮你过滤收到的消息。
只想处理被新用户关注的消息?:
import aiowerobot
robot = aiowerobot.AioWeRoBot(token='tokenhere')
@robot.subscribe
async def subscribe(message):
return 'Hello My Friend!'
robot.run()
或者,你的 handler 只能处理文本?
import aiowerobot
robot = aiowerobot.AioWeRoBot(token='tokenhere')
@robot.text
async def echo(message):
return message.content
robot.run()
在 WeRobot 中我们把请求分成了 Message 和 Event 两种类型,针对两种类型的请求分别有不同的 Handler。
额,这个 handler 想处理文本信息和地理位置信息?
import aiowerobot
robot = aiowerobot.AioWeRoBot(token='tokenhere')
@robot.text
@robot.location
async def handler(message):
# Do what you love to do
pass
robot.run()
当然,你也可以用 add_handler()
函数添加handler,就像这样:
import aiowerobot
robot = aiowerobot.AioWeRoBot(token='tokenhere')
async def handler(message):
# Do what you love to do
pass
robot.add_handler(handler, type='text')
robot.add_handler(handler, type='location')
robot.run()
注解
通过 robot.handler
添加的 handler 将收到所有信息;只有在其他 handler 没有给出返回值的情况下, 通过 robot.handler
添加的 handler 才会被调用。
robot.key_click —— 回应自定义菜单¶
key_click()
是对 click()
修饰符的改进。
如果你在自定义菜单中定义了一个 Key 为 abort
的菜单,响应这个菜单的 handler 可以写成这样
@robot.key_click("abort")
async def abort():
return "I'm a robot"
当然,如果你不喜欢用 key_click()
,也可以写成这样
@robot.click
async def abort(message):
if message.key == "abort":
return "I'm a robot"
两者是等价的。
robot.filter —— 回应有指定文本的消息¶
filter()
是对 text()
修饰符的改进。
现在你可以写这样的代码
@robot.filter("a")
async def a():
return "正文为 a "
import re
@robot.filter(re.compile(".*?bb.*?"))
async def b():
return "正文中含有 bb "
@robot.filter(re.compile(".*?c.*?"), "d")
async def c():
return "正文中含有 c 或正文为 d"
@robot.filter(re.compile("(.*)?e(.*)?"), "f")
async def d(message, session, match):
if match:
return "正文为 " + match.group(1) + "e" + match.group(2)
return "正文为 f"
这段代码等价于
@robot.text
async def a(message):
if message.content == "a":
return "正文为 a "
import re
@robot.text
async def b(message):
if re.compile(".*?bb.*?").match(message.content):
return "正文中含有 b "
@robot.text
def c(message):
if re.compile(".*?c.*?").match(message.content) or message.content == "d":
return "正文中含有 c 或正文为 d"
@robot.text
async def d(message):
match = re.compile("(.*)?e(.*)?").match(message.content)
if match:
return "正文为 " + match.group(1) + "e" + match.group(2)
if message.content == "f":
return "正文为 f"
如果你想通过修饰符以外的方法添加 filter,可以使用 add_filter()
方法
async def say_hello():
return "hello!"
robot.add_filter(func=say_hello, rules=["hello", "hi", re.compile(".*?hello.*?")])
更多内容详见 aiowerobot.robot.BaseRoBot
Session¶
你可以通过 Session 实现用户状态的记录。
一个简单的使用 Session 的 Demo
from aiowerobot import AioWeRoBot
robot = AioWeRoBot(token=aiowerobot.utils.generate_token())
@robot.text
async def first(message, session):
if 'last' in session:
return
session['last'] = message.content
return message.content
robot.run()
开启/关闭 Session¶
Session 在 AioWeRoBot 中默认开启, 并使用 aiowerobot.session.sqlitestorage.SQLiteStorage
作为存储后端。 如果想要更换存储后端, 可以修改 Config 中的 SESSION_STORAGE
from aiowerobot import AioWeRoBot
from aiowerobot.session.filestorage import FileStorage
robot = AioWeRoBot(token="token")
robot.config['SESSION_STORAGE'] = FileStorage()
如果想要关闭 Session 功能, 只需把 SESSION_STORAGE
设为 False 即可
from aiowerobot import AioWeRoBot
robot = AioWeRoBot(token="token")
robot.config['SESSION_STORAGE'] = False
修改 Handler 以使用 Session¶
没有打开 Session 的时候,一个标准的 AioWeRoBot Handler 应该是这样的
@robot.text
async def hello(message):
return "Hello!"
而在打开 Session 之后, 如果你的 handler 不需要使用 Session ,可以保持不变; 如果需要使用 Session ,则这个 Handler 需要修改为接受第二个参数: session
@robot.subscribe_event
async def intro(message):
return "Hello!"
@robot.text
async def hello(message, session):
count = session.get("count", 0) + 1
session["count"] = count
return "Hello! You have sent %s messages to me" % count
传入的 session
参数是一个标准的 Python 字典。
更多可用的 Session Storage 详见 Session 对象。
AioWeRoBot.Client
—— 微信 API 操作类¶
有部分接口暂未实现,可自行调用微信接口。
开始开发¶
获取 access token¶
详细请参考 http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html
注解
Client 的操作都会自动进行 access token 的获取和过期刷新操作,如果有特殊需求(如多进程部署)可重写 get_access_token
。
获取微信服务器IP地址¶
详细请参考 http://mp.weixin.qq.com/wiki/4/41ef0843d6e108cf6b5649480207561c.html
自定义菜单¶
获取自定义菜单配置接口¶
详细请参考 http://mp.weixin.qq.com/wiki/14/293d0cb8de95e916d1216a33fcb81fd6.html
消息管理¶
客服接口¶
详细请参考 http://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html 发送卡券接口暂时未支持。可自行实现。
群发接口¶
用户管理¶
账户管理¶
长链接转短链接接口和微信认证事件推送暂未添加,可自行实现。
用户标签管理¶
详细请参考 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837
创建标签¶
获取公众号已创建的标签¶
编辑标签¶
删除标签¶
获取标签下粉丝列表¶
批量为用户打标签¶
批量为用户取消标签¶
获取用户身上的标签列表¶
模板消息¶
48001 -- API Unauthorized¶
如果你遇到了这个错误,请检查你的微信公众号是否有调用该接口的权限。 参考: https://mp.weixin.qq.com/wiki/13/8d4957b72037e3308a0ca1b21f25ae8d.html
Message¶
Message 公共属性¶
除了 UnknownMessage, 每一种 Message 都包括以下属性:
name | value |
---|---|
message_id | 消息id,64位整型 |
target | 开发者账号( OpenID ) |
source | 发送方账号( OpenID ) |
time | 信息发送的时间,一个UNIX时间戳。 |
raw | 信息的原始 XML 格式 |
LinkMessage¶
name | value |
---|---|
type | 'link' |
title | 消息标题 |
description | 消息描述 |
url | 消息链接 |
LocationMessage¶
LocationMessage 的属性:
name | value |
---|---|
type | 'location' |
location | 一个元组。(纬度, 经度) |
scale | 地图缩放大小 |
label | 地理位置信息 |
VoiceMessage¶
VoiceMessage 的属性:
name | value |
---|---|
type | 'voice' |
media_id | 消息媒体 ID |
format | 声音格式 |
recognition | 语音识别结果 |
UnknownMessage¶
UnknownMessage 的属性:
name | value |
---|---|
type | 'unknown' |
raw | 请求的正文部分。标准的XML格式。 |
注解
如果你不为 AioWeRoBot 贡献代码,你完全可以无视掉 UnknownMessage 。在正常的使用中,WeRoBot应该不会收到 UnknownMessage ——除非 AioWeRoBot 停止开发。
Event¶
Event 公共属性¶
除了 UnknownEvent, 每一种 Event 都包括以下属性:
name | value |
---|---|
message_id | 消息id |
target | 开发者账号( OpenID ) |
source | 发送方账号( OpenID ) |
time | 信息发送的时间,一个UNIX时间戳 |
raw | 信息的原始 XML 格式 |
SubscribeEvent¶
SubscribeEvent 的属性:
name | value |
---|---|
type | 'subscribe_event' |
key | 事件 key 值。 当且仅当未关注公众号扫描二维码时存在 |
ticket | 二维码的 ticket。 当且仅当未关注公众号扫描二维码时存在 |
ScanEvent¶
ScanEvent 的属性:
name | value |
---|---|
type | 'scan_event' |
key | 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码 scene_id |
ticket | 二维码的 ticket,可用来换取二维码图片 |
ScanCodePushEvent¶
ScanCodePushEvent 的属性:
name | value |
---|---|
type | 'scancode_push_event' |
scan_type | 扫描类型,一般是qrcode |
scan_result | 扫描结果,即二维码对应的字符串信息 |
ScanCodeWaitMsgEvent¶
ScanCodeWaitMsgEvent 的属性:
name | value |
---|---|
type | 'scancode_waitmsg_event' |
scan_type | 扫描类型,一般是qrcode |
scan_result | 扫描结果,即二维码对应的字符串信息 |
PicSysphotoEvent¶
弹出系统拍照发图的事件推送的 Event。属性:
name | value |
---|---|
type | 'pic_sysphoto_event' |
key | 事件KEY值,由开发者在创建菜单时设定 |
count | 发送的图片数量 |
pic_list | 图片列表,例如 [{'pic_md5_sum': '123'}] |
PicPhotoOrAlbumEvent¶
弹出拍照或者相册发图的事件推送的 Event。属性:
name | value |
---|---|
type | 'pic_photo_or_album_event' |
key | 事件KEY值,由开发者在创建菜单时设定 |
count | 发送的图片数量 |
pic_list | 图片列表,例如 [{'pic_md5_sum': '123'}] |
PicWeixinEvent¶
弹出微信相册发图器的事件推送的 Event。属性:
name | value |
---|---|
type | 'pic_weixin_event' |
key | 事件KEY值,由开发者在创建菜单时设定 |
count | 发送的图片数量 |
pic_list | 图片列表,例如 [{'pic_md5_sum': '123'}] |
LocationSelectEvent¶
弹出地理位置选择器的事件推送的 Event。属性:
name | value |
---|---|
type | 'location_select_event' |
key | 事件KEY值,由开发者在创建菜单时设定 |
location_x | X坐标信息 |
location_y | Y坐标信息 |
scale | 精度,可理解为精度或者比例尺、越精细的话 scale 越高 |
label | 地理位置的字符串信息 |
poi_name | 朋友圈POI的名字,可能为 None |
LocationEvent¶
LocationEvent 的属性:
name | value |
---|---|
type | 'location_event' |
latitude | 地理位置纬度 |
longitude | 地理位置经度 |
precision | 地理位置精度 |
UserScanProductEvent¶
打开商品主页事件推送的 Event。属性:
name | value |
---|---|
type | 'user_scan_product_event' |
key_standard | 商品编码标准。 |
key_str | 商品编码内容。 |
country | 用户在微信内设置的国家。 |
province | 用户在微信内设置的省份。 |
city | 用户在微信内设置的城市。 |
sex | 用户的性别,1为男性,2为女性,0代表未知。 |
scene | 打开商品主页的场景,1为扫码,2为其他打开场景(如会话、收藏或朋友圈)。 |
ext_info | 调用“获取商品二维码接口”时传入的 extinfo,为标识参数。 |
UserScanProductEnterSessionEvent¶
当用户从商品主页进入公众号会话时推送的 Event。属性:
name | value |
---|---|
type | 'user_scan_product_enter_session_event' |
key_standard | 商品编码标准。 |
key_str | 商品编码内容。 |
ext_info | 调用“获取商品二维码接口”时传入的 extinfo,为标识参数。 |
UserScanProductAsyncEvent¶
当用户打开商品主页,微信会将该用户实时的地理位置信息以异步事件的形式推送的 Event。属性:
name | value |
---|---|
type | 'user_scan_product_async_event' |
key_standard | 商品编码标准。 |
key_str | 商品编码内容。 |
ext_info | 调用“获取商品二维码接口”时传入的 extinfo,为标识参数。 |
region_code | 用户的实时地理位置信息(目前只精确到省一级),可在国家统计局网站查到对应明细: http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201504/t20150415_712722.html |
UserScanProductVerifyActionEvent¶
提交审核的商品,完成审核后,微信会将审核结果以事件的形式推送的 Event。属性:
name | value |
---|---|
type | 'user_scan_product_verify_action_event' |
key_standard | 商品编码标准。 |
key_str | 商品编码内容。 |
result | 审核结果。verify_ok表示审核通过,verify_not_pass表示审核未通过。 |
reason_msg | 审核未通过的原因。 |
CardPassCheckEvent¶
生成的卡券通过审核时,微信推送的 Event。属性:
name | value |
---|---|
type | 'card_pass_check_event' |
card_id | 卡券 ID。 |
refuse_reason | 审核不通过原因。 |
CardNotPassCheckEvent¶
生成的卡券未通过审核时,微信推送的 Event。属性:
name | value |
---|---|
type | 'card_not_pass_check_event' |
card_id | 卡券 ID。 |
refuse_reason | 审核不通过原因。 |
UserGetCardEvent¶
用户在领取卡券时,微信推送的 Event。属性:
name | value |
---|---|
type | 'user_get_card_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
is_give_by_friend | 是否为转赠领取,1 代表是,0 代表否。 |
friend_user_name | 当 is_give_by_friend 为 1 时填入的字段,表示发起转赠用户的 openid。 |
outer_id | 未知。 |
old_user_card_code | 为保证安全,微信会在转赠发生后变更该卡券的 code 号,该字段表示转赠前的 code。 |
outer_str | 领取场景值,用于领取渠道数据统计。可在生成二维码接口及添加 Addcard 接口中自定义该字段的字符串值。 |
is_restore_member_card | 用户删除会员卡后可重新找回,当用户本次操作为找回时,该值为 1,否则为 0。 |
is_recommend_by_friend | 未知。 |
UserGiftingCardEvent¶
用户在转赠卡券时,微信推送的 Event。属性:
name | value |
---|---|
type | 'user_gifting_card_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
friend_user_name | 接收卡券用户的openid。 |
is_return_back | 是否转赠退回,0 代表不是,1 代表是。 |
is_chat_room | 是否是群转赠。 |
UserDelCardEvent¶
用户在删除卡券时,微信推送的 Event。属性:
name | value |
---|---|
type | 'user_del_card_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。自定义 code 及非自定义 code 的卡券被领取后都支持事件推送。 |
UserConsumeCardEvent¶
卡券被核销时,微信推送的 Event。属性:
name | value |
---|---|
type | 'user_consume_card_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
consume_source | 核销来源。 |
location_name | 门店名称,当前卡券核销的门店名称(只有通过自助核销和买单核销时才会出现该字段)。 |
staff_open_id | 核销该卡券核销员的 openid(只有通过卡券商户助手核销时才会出现)。 |
verify_code | 自助核销时,用户输入的验证码。 |
remark_amount | 自助核销时 ,用户输入的备注金额。 |
outer_str | 开发者发起核销时传入的自定义参数,用于进行核销渠道统计。 |
UserPayFromPayCellEvent¶
用户微信买单完成时,微信推送的 Event。属性:
name | value |
---|---|
type | 'user_pay_from_pay_cell_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
trans_id | 微信支付交易订单号(只有使用买单功能核销的卡券才会出现)。 |
location_id | 门店 ID,当前卡券核销的门店 ID(只有通过卡券商户助手和买单核销时才会出现)。 |
fee | 实付金额,单位为分。 |
original_fee | 应付金额,单位为分。 |
UserViewCardEvent¶
用户在进入会员卡时,微信推送的 Event。属性:
name | value |
---|---|
type | 'user_view_card_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
outer_str | 商户自定义二维码渠道参数,用于标识本次扫码打开会员卡来源来自于某个渠道值的二维码。 |
UserEnterSessionFromCardEvent¶
用户在卡券里点击查看公众号进入会话时(需要用户已经关注公众号),微信推送的 Event。属性:
name | value |
---|---|
type | 'user_enter_session_from_card_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
UpdateMemberCardEvent¶
用户的会员卡积分余额发生变动时,微信推送的 Event。属性:
name | value |
---|---|
type | 'update_member_card_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
modify_bonus | 变动的积分值。 |
modify_balance | 变动的余额值。 |
CardSkuRemindEvent¶
当某个card_id的初始库存数大于200且当前库存小于等于100时,用户尝试领券,微信推送的 Event。属性:
name | value |
---|---|
type | 'card_sku_remind_event' |
card_id | 卡券 ID。 |
detail | 报警详细信息。 |
CardPayOrderEvent¶
用户的会员卡积分余额发生变动时,微信推送的 Event。属性:
name | value |
---|---|
type | 'card_pay_order_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
order_id | 本次推送对应的订单号。 |
status | 本次订单号的状态。 |
create_order_time | 购买券点时,支付二维码的生成时间。 |
pay_finish_time | 购买券点时,实际支付成功的时间。 |
desc | 支付方式,一般为微信支付充值。 |
free_coin_count | 剩余免费券点数量。 |
pay_coin_count | 剩余付费券点数量。 |
refund_free_coin_count | 本次变动的免费券点数量。 |
refund_pay_coin_count | 本次变动的付费券点数量 |
order_type | 所要拉取的订单类型。 |
memo | 系统备注,说明此次变动的缘由,如开通账户奖励、门店奖励、核销奖励以及充值、扣减。 |
receipt_info | 所开发票的详情。 |
SubmitMembercardUserInfoEvent¶
用户通过一键激活的方式提交信息并点击激活或者用户修改会员卡信息时,微信推送的 Event。属性:
name | value |
---|---|
type | 'submit_membercard_user_info_event' |
card_id | 卡券 ID。 |
user_card_code | code 序列号。 |
UnknownEvent¶
UnknownEvent 的属性:
name | value |
---|---|
type | 'unknown_event' |
raw | 请求的正文部分。标准的XML格式。 |
注解
如果你不为 AioWeRoBot 贡献代码,你完全可以无视掉 UnknownEvent 。在正常的使用中,WeRoBot应该不会收到 UnknownEvent ——除非 AioWeRoBot 停止开发。
回复¶
你可以在构建Reply时传入一个合法的 Message 对象来自动生成 source 和 target
reply = TextReply(message=message, content='Hello!')
TextReply¶
TextReply 是简单的文本消息,构造函数的参数如下:
name | value |
---|---|
content | 信息正文。 |
target | 信息的目标用户。通常是机器人用户。 |
source | 信息的来源用户。通常是发送信息的用户。 |
time | 信息发送的时间,一个UNIX时间戳。默认情况下会使用当前时间。 |
注解
如果你的handler返回了一个字符串, WeRoBot会自动将其转化为一个文本消息。
ImageReply¶
ImageReply 为回复图片消息,构造函数的参数如下:
name | value |
---|---|
media_id | 通过素材管理接口上传多媒体文件,得到的id。 |
target | 信息的目标用户。通常是机器人用户。 |
source | 信息的来源用户。通常是发送信息的用户。 |
time | 信息发送的时间,一个UNIX时间戳。默认情况下会使用当前时间。 |
VoiceReply¶
VoiceReply 为回复语音消息,构造函数的参数如下:
name | value |
---|---|
media_id | 通过素材管理接口上传多媒体文件,得到的id。 |
target | 信息的目标用户。通常是机器人用户。 |
source | 信息的来源用户。通常是发送信息的用户。 |
time | 信息发送的时间,一个UNIX时间戳。默认情况下会使用当前时间。 |
VideoReply¶
VideoReply 为回复视频消息,构造函数的参数如下:
name | value |
---|---|
media_id | 通过素材管理接口上传多媒体文件,得到的id。 |
title | 视频消息的标题。可为空。 |
description | 视频消息的描述。可为空。 |
target | 信息的目标用户。通常是机器人用户。 |
source | 信息的来源用户。通常是发送信息的用户。 |
time | 信息发送的时间,一个UNIX时间戳。默认情况下会使用当前时间。 |
ArticlesReply¶
ArticlesReply 是图文消息,构造函数的参数如下:
name | value |
---|---|
content | 信息正文。可为空。 |
target | 信息的目标用户。通常是机器人用户。 |
source | 信息的来源用户。通常是发送信息的用户。 |
time | 信息发送的时间,一个UNIX时间戳。默认情况下会使用当前时间。 |
你需要给 ArticlesReply 添加 Article 来增加图文。 Article 类位于 werobot.reply.Article 。
Article 的构造函数的参数如下:
name | value |
---|---|
title | 标题 |
description | 描述 |
img | 图片链接 |
url | 点击图片后跳转链接 |
注意,微信公众平台对图片链接有特殊的要求,详情可以在 消息接口使用指南 里看到。
在构造完一个 Article 后, 你需要通过 ArticlesReply 的 add_article 参数把它添加进去。就像这样:
from werobot.replies import ArticlesReply, Article
reply = ArticlesReply(message=message)
article = Article(
title="AioWeRoBot",
description="WeRoBot是一个微信机器人框架",
img="https://github.com/apple-touch-icon-144.png",
url="https://github.com/whtsky/AioWeRoBot"
)
reply.add_article(article)
注解
根据微信公众平台的 最新公告,每个ArticlesReply中 最多添加1个Article 。
- 你也可以让你的 handler 返回一个列表, 里面每一个元素都是一个长度为四的列表,
AioWeRoBot 会将其自动转为 ArticlesReply 。就像这样:
import werobot robot = werobot.AioWeRoBot(token='tokenhere') @robot.text async def articles(message): return [ [ "title", "description", "img", "url" ], [ "whtsky", "I wrote AioWeRoBot", "https://secure.gravatar.com/avatar/0024710771815ef9b74881ab21ba4173?s=420", "http://whouz.com/" ] ] robot.run()
MusicReply¶
MusicReply 是音乐消息,构造函数的参数如下:
name | value |
---|---|
target | 信息的目标用户。通常是机器人用户。 |
source | 信息的来源用户。通常是发送信息的用户。 |
time | 信息发送的时间,一个UNIX时间戳。默认情况下会使用当前时间。 |
title | 标题 |
description | 描述 |
url | 音乐链接 |
hq_url | 高质量音乐链接,WIFI环境优先使用该链接播放音乐。可为空 [3] |
- 你也可以让你的 handler 返回一个长度为三或四的列表, [3]
AioWeRoBot 会将其自动转为 MusicReply 。就像这样:
import werobot robot = werobot.AioWeRoBot(token='tokenhere') @robot.text async def music(message): return [ "title", "description", "music_url", "hq_music_url" ] @robot.text async def music2(message): return [ "微信你不懂爱", "龚琳娜最新力作", "http://weixin.com/budongai.mp3", ] robot.run()
[3] | (1, 2) 如果你省略了高质量音乐链接的地址, AioWeRoBot 会自动将音乐链接的地址用于高质量音乐链接。 |
TransferCustomerServiceReply¶
将消息转发到多客服,构造函数的参数如下:
name | value |
---|---|
target | 信息的目标用户。通常是机器人用户。 |
source | 信息的来源用户。通常是发送信息的用户。 |
time | 信息发送的时间,一个UNIX时间戳。默认情况下会使用当前时间。 |
account | 指定会话接入的客服账号,可以没有此参数,没有时会自动分配给可用客服。 |
SuccessReply¶
给微信服务器回复 "success"。 假如服务器无法保证在五秒内处理并回复,需要回复 SuccessReply ,这样微信服务器才不会对此作任何处理,并且不会发起重试。
Config¶
AioWeRoBot 使用 AioWeRoBot.Config
类来存储配置信息。 AioWeRoBot
类实例的 config
属性是一个 aiowerobot.config.Config
实例。
Config
继承自 dict 。因此, 你可以像使用普通 dict 一样使用它
from aiowerobot import AioWeRoBot
robot = AioWeRoBot(token='2333')
robot.config.update(
HOST='0.0.0.0',
PORT=80
)
当然, 你也可以先创建一个 Config ,然后在初始化 WeRobot
的时候传入自己的 Config
from aiowerobot.config import Config
config = Config(
TOKEN="token from config!"
)
robot = AioWeRoBot(config=config, token="token from init")
assert robot.token == "token from config!"
注解
如果你在初始化 AioWeRoBot
时传入了 config
参数, AioWeRoBot
会忽略除 logger
外其他所有的初始化参数。 如果你需要对 AioWeRoBot
进行一些配置操作, 请修改 Config 。
与普通 dict 不同的是, 你可以先把配置文件保存在一个对象或是文件中, 然后在 Config
中导入配置
from aiowerobot import AioWeRoBot
robot = AioWeRoBot(token='2333')
class MyConfig(object):
HOST = '0.0.0.0'
PORT = 80
robot.config.from_object(MyConfig)
robot.config.from_pyfile("config.py")
默认配置¶
dict(
TOKEN=None,
SERVER="auto",
HOST="127.0.0.1",
PORT="8888",
SESSION_STORAGE=None,
APP_ID=None,
APP_SECRET=None,
ENCODING_AES_KEY=None
)