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

教你白嫖 replit 部署 kook 的 ticket 机器人 (已失效)。

注意:2024 年 replit 策略更新,免费用户只能部署静态页面了。本文所述白嫖方案已经失效,而 replit 的付费价格高于自购云服务器价格,并不推荐。如果您还有自部署 ticket 机器人的需求,可以加入我的 kook 服务器联系我。

khl server

1. 前言

最近有不少老哥来找我咨询有关 ticket 机器人的事情,当前 ticket 机器人需要云服务器才能部署,有些不太友好(要钱啊!而且也不是人人都会安装 python 环境)

所以在这里利用 replituptimerobot 两个平台,给大家介绍一个白嫖的方法,实现部署 kook-ticket-bot

该方法理论上支持所有使用 khl.py 框架编写的机器人!

注意!replit 上的免费仓库,默认是公开的,也就是所有人都能访问到你这个仓库里面的文件,包括 bot 的 token 和日志信息!若您的 ticket-bot 对数据私密性要求较高,请自购服务器或找开发者代为部署!

2. 准备

2.1 注册账户

这两个平台国内访问缓慢,如果实在进不去,就下载一个 steam++(又称 watt toolkit)

https://gitee.com/rmbgame/SteamTools/releases/tag/2.8.6

如图,下载 exe 就可以了

image-20230209182251919

安装打开以后,把这一堆无差别勾上,点一键加速,应该就 ok 了,访问会稍微快一点

image-20230209182323805

随后就是注册这两个平台的账户了,应该不需要教吧(doge)

2.2 打开 gitee/github 仓库

https://gitee.com/musnow/Kook-Ticket-Bot/tree/main/code

https://github.com/musnows/Kook-Ticket-Bot

为了方便访问,我将 ticket-bot 在 gitee 也传了一份,大家打开仓库的 code 目录,准备拷贝代码。能使用 github 的,建议用 GitHub(因为 github 的代码更加新)

2.3 申请 kook 开发者

网页: KOOK 开发者中心

到 kook 的开发者平台,加入官方频道申请承为开发者(现在已经不需要申请了),获取创建 bot 的权限;有了权限之后,新建一个应用

image-20230209182839605

image-20230209183206514

随后进入机器人页面,复制这里的 token,先保存起来,后面要用(一会再来复制也行)

image-20230405111851618

进入邀请页面,给予机器人管理员权限(这样是为了方便,不然得钩一大堆)

然后复制上面的邀请链接到浏览器,邀请机器人进入你的服务器

image-20230209183412507

你应该能在频道里面看到欢迎信息,机器人已经加入你的频道了。

image-20230209183507516

3. 开始部署

3.1 创建 repl

来到 replit,创建仓库

image-20230209183604137

选择 python,然后给它取个名字

image-20230209183621372

创建之后进入这个项目

image-20230209183745982

import from github 会显示仓库不可用,所以只能手动操作了。

3.2 添加代码文件

进来之后是这样的页面,只有一个 main.py,其他什么都无

image-20230209183829907

点击右侧 shell,复制后,shift+ins 粘贴如下命令,可一建拉取所有代码,并覆盖已有文件。(创建 repl 的时候一定要选择 python,否则 pip 会无法运行)

plaintext
1
git clone https://github.com/musnows/Kook-Ticket-Bot.git && mv -b Kook-Ticket-Bot/* ./ && mv -b Kook-Ticket-Bot/.[^.]* ./  && rm -rf Kook-Ticket-Bot && pip install -r requirements.txt

如果如上命令不可用,则需要根据我仓库的代码,手动创建同名文件,并将代码复制进去:

有一个简便办法,就是在 github/gitee 的 clone 按钮中选择下载 zip,然后将 zip 解压后,将文件夹上传上去,并把内部文件移动道根目录。

image-20230412213706670

3.3 添加配置文件

如果你直接运行了,会出现如下报错,代表没有找到 config/config.json 文件。即没有找到机器人运行必要的配置文件。

image-20230509171033045

新版本的 ticket 机器人会自动创建 log 目录下的文件,但是 config 下的配置文件依旧需要您手动操作!

接下来就是根据仓库的 README 添加各类配置文件,本文不重复 README 中已有内容。

python
1
2
3
4
5
6
config/config.json # 机器人token配置
config/TicketConf.json # ticket配置
# 下面的文件机器人会自动创建,可以不弄
log/TicketLog.json # ticket日志
log/TicketMsgLog.json # 消息记录
log/ColorID.json # 表情回应上角色

先把如上的几个文件全部建立好,然后根据仓库的 README 往里面添加键值。新版本 log 目录下的文件,机器人会自动创建,可以不手动创建。 主要配置 config 即可

3.3.1 开启 kook 开发者模式

很多操作都需要复制 ID,先在设置高级设置中开启开发者模式

image-20230209185627493

3.3.2 配置 config

下面给出一个 TicketConf.json 中需要配置的几项的样例

image-20230209190129489

image-20230209190306382

在这里重申,添加了这两个角色 id 之后,必须要给予用户对应的角色(特别是腐竹)才能操作 bot 的命令,否则提示权限不足

配置为文件添加完毕之后,应该是下面这样的

image-20230209192413122

3.4 开始运行

新版本已经采用 logging 来替换 print,不再需要手动配置 logDup

配置文件修改好后,就可以点击顶部的 run,尝试运行 bot 了,变成下面的样子那就是在运行了

image-20230209190458439

3.4.1 安装包

刚开始打印如果提示这个,代表没有找到对应的包

image-20230209190513475

先尝试在 shell 中输入如下命令

plaintext
1
pip install -r requirements.txt

如果出现了如图所示的安装页面,那就一切 ok,安装好了再点击 run 就可以了

image-20230509170848097

如果不行。那就在工具 tools 里面选择 packges,搜索 khl.py

image-20230209190529916

image-20230209190601848

如下提示,安装成功!

image-20230209190657593

3.4.2 时区问题

新版本自带的.replit 文件已经写入了这个配置

运行还会有这个警告

plaintext
1
2
/home/runner/tk-dev/venv/lib/python3.10/site-packages/tzlocal/unix.py:183: UserWarning: Can not find any timezone configuration, defaulting to UTC.
warnings.warn("Can not find any timezone configuration, defaulting to UTC.")

点击显示隐藏文件

image-20230412212614329

打开.replit 文件,在如下位置添加一行(然而这个时区配置没有用)

bash
1
2
3
[env]
TZ = 'Asia/Shanghai'
# ....

再次运行,就不会有这个报错了

3.4.3 运行成功

在点击运行,出现如图所示的页面,那就是运行成功了!

image-20230209190841115

因为采用了 webhook 的链接,需要去后台填入 callback url,填入后点击重试。如果没有红色字体报错,那就是成功了!

plaintext
1
replit给的url/khl-wh

image-20230420105836117

如果不成功,先尝试在浏览器中访问此 url,看看是否出现了 405 Method Not Allowed,如果出现了,代表程序正常运行,多点击几次重试即可。这点在 README 里面也有说明

image-20230405111314195

现在进 kook 里面,先测试一下我们的 bot 是否在线

image-20230209190918053

测试通过!后台也打印出了日志

image-20230209191007686

3.5 uptimeRobot

别急别急,虽然到这里已经 ok 了,但我们还有一个步骤要做!

进入 uptimeRobot,需要创建一个监控实例,来调用机器人的 url,保证我们的 bot 不会因为 replit 的策略(5 分钟不活跃就休眠)而下线过久。

使用 webhook 连接,也是为了让 kook 发送报文给机器人的时候,让 repl 不休眠。

理论上来说,只要你的服务器用户够多,发言活跃(每次发言,kook 都会发送一条信息给机器人,不管是不是机器人的命令)是可以不用配置 uptimerobot 的。

但是为了避免机器人在服务器不活跃的时候,无法收到 kook 的报文,而进入休眠态,还是建议大家按教程配置一下 uptimerobot 的监控

image-20230209191107440

点击 add new monitor,选择 http

image-20230209191116969

image-20230209191148477

按如下所示填写

  • name 随便填个英文名
  • url 填在 replit 复制的链接,后面加上 /khl-wh
  • intervel 是单次监控的间隔,选择 5 分钟(低于 5 分钟得收费)
  • timeout 默认 30s 不需要修改
  • 两个 ssl 取消勾选

image-20230209191336353

建议勾选上这个,在 bot 下线的时候,会向你的邮箱发送通知

image-20230209191453032

配置完毕,点击右下角的 create

image-20230209191534999

这时候就会开始运行了!下方的 pause 可以暂停运行。

image-20230209191625292

如果你 create 完毕,发现是黑色的,那就点击一下 start 让他开始运行

3.5.1 自建 uptime-kuma

由于免费的 uptimerobot 的监控最低只能选择 5 分钟,正好和 replit 的休眠时间相同,导致即便你设置了 uptimerobot 的 ping,repl 依旧有几率休眠。

您可以选择在 replit 上面部署一个 uptime-kuma,该项目可以自定义监控时间(无限制);缺点就是 这个 repl 也需要用请求来进行保活(不确定能否自己请求自己实现保活)

image-20230509151016479

replit 创建一个新的 repl,在 shell 中输入如下命令,即可一键部署。详细内容参考该项目的 README

plaintext
1
git clone https://github.com/valetzx/uptimekumaonreplit && mv -b uptimekumaonreplit/* ./ && mv -b uptimekumaonreplit/.[^.]* ./ && rm -rf *~ && rm -rf uptimekumaonreplit

温馨提示:replit 的 repl 默认公开,若您部署了 uptime-kuma,请不要把该服务的用户名 / 密码设置成任何和您已有其他平台的用户名 / 密码相同。

建议拿张纸记录下一个随机字符串作为 uptime-kuma 的密码,避免您常用的密码泄露

本人已经部署了该服务,若您有 repl 保活需求,可以加入我的帮助服务器,将您的 replit-url 告知我。

即:使用我部署的 uptime-kuma 来请求您的 replit-url,实现保活!

3.5.2 解决 405 错误导致的 down

在我 replit 部署机器人,使用 uptimerobot 的时候,遇到了下面的问题。我在 uptimerobot 里面填入了 replit 的 url 如下

plaintext
1
replit给的url/khl-wh

但由于免费版本的 uptimerobot 仅支持 head 请求,而 /khl-wh 路径是只支持 post 请求的。由此便引发了这个问题

image-20230416155025770

image-20230416155139283

说来奇怪,我其他三个在 replit 上面用 webhook 部署的机器人并没有出现这个问题(理论上来说应该会出现才对)不管这个,有问题我们就解决问题

image-20230416155200347

解决办法如下,找到 main.py,选中 Bot,右键 jump to definition,转到定义

image-20230416155513114

或者在左侧选择 show hidden files,进入 venv 文件夹

image-20230416160154395

这时候便展开了隐藏的包文件,路径为

plaintext
1
venv/lib/python3.10/site-packages/khl/bot/bot.py

image-20230416155822038

image-20230416155631350

我们需要找的文件是

plaintext
1
venv/lib/python3.10/site-packages/khl/receiver.py

进去之后,找到大概 180 行的位置,有一个

python
1
self.app.router.add_post(self.route, on_recv)

复制如下代码替换原有,这个代码的作用是给 /khl-wh 添加 get 请求的支持,这样 uptimerobot 的 head 请求就不会报错了。

修改的时候,一定要注意代码的缩进,要保证新的代码缩进和旧的代码缩进相同!否则可能导致意想不到的后果。

python
1
2
3
4
5
6
async def on_root(request: web.Request):
return web.Response(body="khl.py get recv!",
content_type='text/html',status=200)

self.app.router.add_post(self.route, on_recv)
self.app.router.add_get(self.route, on_root)

配置了之后,重新启动机器人,将 url 粘贴到浏览器,尝试访问

plaintext
1
replit给的url/khl-wh

这时候显示的就不再是 405,而是 khl.py get recv! 了,表明代码修改正确!

image-20230416160342496

这时候去看看 uptimerobot,它的请求就没有出错了!

image-20230416160241511

完美解决!

4. 下线机器人

bot 有一个特殊的 kill 命令。执行此 kill 命令,可以刷新缓冲区。

避免出现数据在缓冲区中没有写入到文件,导致丢失日志 or 数据文件

plaintext
1
/kill @机器人

image-20230416160545519

如果你想退出 bot,建议使用 kill 命令来操作

大功告成!

现在你可以根据 help 去测试一下各类命令是否能正常工作啦

image-20230209191752878

image-20230209191808588

image-20230209192707010

注意,关闭 ticket 之后可能会出现这个报错,这是因为用户从来没有给 bot 发送过信息,导致 bot 无法用户发送私信,忽略此报错即可(新版本已经取消了这个报错)

image-20230209191834582

因为 replit 是免费的,所以 bot 的反应可能有些迟钝,正常情况!

建议使用 kook 网页版进行测试,如果出现机器人不响应,先刷新一下网页。有很多时候纯粹是 kook 自己的客户端抽风导致命令消息看不到。

再次提醒

再次提醒!replit 上的免费仓库,默认是公开的,也就是所有人都能访问到你这个仓库里面的文件,包括 bot 的 token 和日志信息!

  • 为了规避 token 泄漏造成过大影响,建议每隔一段时间就上后台重置 token

若您的 ticket-bot 对数据私密性要求较高,请自购服务器或找开发者代为部署!

关于自购服务器相关事项,可加入帮助服务器咨询我,我可以帮助你配置服务器的 Python 基本环境

khl server

PS:请不要误会,我不是卖服务器的,我也没有接广告😂