用户手册

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 或者是 EventMessage 表示用户发来的消息,如文本消息、图片消息; Event 则表示用户触发的事件, 如关注事件、扫描二维码事件。 在消息解析、转换完成后, AioWeRoBot 会将消息转交给 Handler 进行处理,并将 Handler 的返回值返回给微信服务器。

在刚才的 Hello World 中, 我们编写的

@robot.handler
async def hello(message):
    return 'Hello World!'

就是一个简单的 Handler@robot.handler 意味着 robot 会将所有接收到的消息( 包括 MessageEvent ) 都转交给这个 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 格式

TextMessage

TextMessage 的属性:

name value
type 'text'
content 信息的内容

ImageMessage

ImageMessage 的属性:

name value
type 'image'
img 图片网址。你可以从这个网址下到图片

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 语音识别结果

VideoMessage

VideoMessage 的属性:

name value
type 'video'
media_id 消息媒体 ID
thumb_media_id 视频缩略图媒体 ID

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。 当且仅当未关注公众号扫描二维码时存在

UnSubscribeEvent

UnSubscribeEvent 的属性:

name value
type 'unsubscribe_event'

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

ClickEvent

ClickEvent 的属性:

name value
type 'click_event'
key 事件 key 值。

ViewEvent

ViewEvent 的属性:

name value
type 'view_event'
key 事件 key 值。

LocationEvent

LocationEvent 的属性:

name value
type 'location_event'
latitude 地理位置纬度
longitude 地理位置经度
precision 地理位置精度

TemplateSendJobFinishEvent

模版消息发送任务完成后的 Event 通知。 属性:

name value
status 发送是否成功。为 'success' 或失败原因

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 对象来自动生成 sourcetarget

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 后, 你需要通过 ArticlesReplyadd_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
)

错误页面

AioWeRoBot 自带了一个错误页面,它将会在 Signature 验证不通过的时候返回错误页面。

定制错误页面

如果你想为 AioWeRoBot 指定 Signature 验证不通过时显示的错误页面,可以这么做:

@robot.error_page
def make_error_page(url):
    return "<h1> %s </h1>" % url

小工具

Token 生成器

WeRoBot帮你准备了一个Token生成器:

import aiowerobot.utils

print(aiowerobot.utils.generate_token())