距离上次更新本文已经过去了 635 天,文章部分内容可能已经过时,请注意甄别

demo 开源地址 https://github.com/musnows/Kook-Afd-Webhook-Bot

1. 简介

本文档主要讲解如何将 kook 机器人与爱发电的 webhook 功能进行对接

商品以 vip 作为示例,提供一个基础的 python-demo

主要流程如下

  • 机器人提供 vip 商城命令,用户执行,机器人发送一张包含不同价位 vip 价格和购买 url 的卡片给用户(临时消息,只有这个用户能看到)
  • 用户购买商品时,爱发电发送 webhook 给机器人
  • 机器人获取 webhook 信息中的 custom_order_id,解析出用户 id 和购买天数,自动给对应用户上 vip

相关文档

开始前,你需要先拥有自己的 kook-bot,并注册 爱发电,申请爱发电开发者权限

如果你想使用 CDK(即兑换码)的方式来分发 vip,可以看看我的 Valorant-Shop-CN/Kook-Valorant-Bot 项目

2.python-demo

2.1 webhook-api

要想和爱发电的 api 对接,首先 bot 自己需要维护一个 webhook 的 api-url。这也要求你的机器人是部署在可公网访问的环境中,否则爱发电的 webhook 无法送达。

同时,为了保证 webhook 中始终有 custom_order_id 字段,您需要告知您的用户,只能通过机器人生成的 url 来购买 vip。否则自动化流程将失效

  • 机器人收到爱发电 webhook
  • 解析 webhook 中的键值,获取到 custom_order_id
  • 解析 custom_order_id,获取到 kook 用户 id 和 vip 天数
  • 给用户添加上 vip 天数
python
1
custom_order_id=kook用户id:vip天数

处理代码详见 api.pyapiHandler.py

2.2 机器人

机器人命令如下

命令说明
/shop 获取购买 vip 的卡片
/vip 看看自己 vip 剩余时长
/vip-l 获取 vip 用户列表(会刷掉过期的 vip 用户)
/vip-test 该命令只有 vip 用户才能执行,用于测试 vip 是否生效
/alive 看看机器人活着不
/kill 机器人下线,并保存文件

代码详见 main.py

2.2.1 vip 物品 url 获取

先创建你的 vip 店铺。爱发电的商品有隐藏功能,隐藏后的商品将不会显示在主页上,这样也能实现用户只能通过 bot 提供的链接来访问购买的操作

image-20230419223059244

image-20230419223112664

这里我拿周 vip 和月 vip 作为示例

643fce843df92

点击商品,进入详情页,点击发电

643fceb15227a

进入付款页面后,复制最上方的 url

image-20230419192145330

plaintext
1
https://afdian.net/order/create?product_type=1&plan_id=9aea871c304911ed8ec452540025c377&sku=%5B%7B%22sku_id%22%3A%229aed6edc304911edbeb552540025c377%22,%22count%22%3A1%7D%5D

我们要做的就是在这个 url 尾部添加上 custom_order_id

plaintext
1
&custom_order_id=kook用户id:vip天数

添加完毕后的链接如下

plaintext
1
https://afdian.net/order/create?product_type=1&plan_id=9aea871c304911ed8ec452540025c377&sku=%5B%7B%22sku_id%22%3A%229aed6edc304911edbeb552540025c377%22,%22count%22%3A1%7D%5D&custom_order_id=kook用户id:vip天数

复制到浏览器,仍可正常访问,代表配置无误

image-20230419192256714

2.2.2 vip 物品 url 配置

找到 main.py 中的如下代码,将里面的 vip_item_link 替换成你自己的 url。如果需要添加更多商品,将两个 ---------- 中间的部分多复制几份即可

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@bot.command(name='shop',case_sensitive=False)
async def shop_cmd(msg:Message,*arg):
logMsg(msg)
try:
cm = CardMessage()
c =Card(Module.Section(Element.Text("欢迎选购机器人Vip",Types.Text.KMD)))
# -------------
# vip商品1,周vip
vip_item_link1 = "https://afdian.net/order/create?product_type=1&plan_id=9aea871c304911ed8ec452540025c377&sku=%5B%7B%22sku_id%22%3A%229aed6edc304911edbeb552540025c377%22,%22count%22%3A1%7D%5D"
# 添加上自定义订单号的字符串
vip_item_link1+= f"&custom_order_id={msg.author_id}:7"
c.append(
Module.Section(
Element.Text("周vip", Types.Text.KMD),
Element.Button("购买", vip_item_link1, Types.Click.LINK)))
# -------------

# vip商品2,月vip
vip_item_link2 = "https://afdian.net/order/create?product_type=1&plan_id=ff2949022e9611ed89d452540025c377&sku=%5B%7B%22sku_id%22%3A%22ff2bb4f82e9611ed83ac52540025c377%22,%22count%22%3A1%7D%5D"
# 添加上自定义订单号的字符串
vip_item_link2+= f"&custom_order_id={msg.author_id}:30"
c.append(
Module.Section(
Element.Text("月vip", Types.Text.KMD),
Element.Button("购买", vip_item_link2, Types.Click.LINK)))

cm.append(c)
await msg.reply(cm,is_temp=True) # 临时消息,所以这个按钮只有当前用户可以点
except:
_log.exception(f"Err in shop")

2.2.3 启动机器人并配置 webhook

先安装依赖项(Python 版本 3.10)

plaintext
1
pip3.10 install -r requierments.txt
  • 配置文件示例 config/config.exp.json
  • 在内部填写正确的机器人 token 字段后,重命名为 config.json
  • 并将 config/log.exp 中的两个文件复制到 log/ 路径下

然后启动机器人

plaintext
1
python3.10 start.py

看到如下输出即为启动成功

image-20230419193628380

我们需要将 api 的地址填写到爱发电的 webhook url 中

记得开放对应端口防火墙,并正确绑定域名和开启 https

image-20230419194646676

填写 url 后点击保存,爱发电会发送一条测试 webhook 给你的机器人。如果在预先定义的 debug_ch 中看到了如下卡片,则代表 webhook 配置成功

image-20230419194631552

plaintext
1
2
[23-04-19 19:46:07] INFO:api.py:aifadian_webhook:31 | request | /afd
[23-04-19 19:46:07] INFO:apiHandler.py:afd_request:71 | trno:202106232138371083454010626 | afd-cm-send

kill 掉机器人后,在 log 文件中也能看到这次测试 webhook 的请求体

image-20230419194914026

2.3 命令截图

2.3.1 基础测试

先测试一下机器人上线没有

image-20230419193407783

刚开始时,没有 vip 用户

image-20230419193337782

image-20230419193356371

使用商城命令,获取购买按钮

image-20230419194053131

点击按钮,会跳转到爱发电的付款页面,能看到 url 最后成功附着上了用户 id 和时间

plaintext
1
&custom_order_id=1961572535%3A7

url 中的 %3A 就是:


2.3.2 购入 vip 测试

如下,我购买了一个周 vip,机器人成功获取到了 webhook 体中的自定义订单 id

image-20230419195247714

此时再次执行 vip 命令,能看到已经正确添加上了 7 天的 vip

image-20230419195407303

image-20230419195631005

日志文件也成功记录

image-20230419195714087

image-20230419195649205

测试完毕!

The end

有任何问题,都可以加入我的帮助服务器与我联系

khl server

本文档已被官方认可,并放置在了 kook开发者频道的常见问题中🎉

image-20230420083418099

image-20230420083301041