教你白嫖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会无法运行)

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中已有内容。

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中输入如下命令

1
pip install -r requirements.txt

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

image-20230509170848097

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

image-20230209190529916

image-20230209190601848

如下提示,安装成功!

image-20230209190657593

3.4.2 时区问题

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

运行还会有这个警告

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文件,在如下位置添加一行(然而这个时区配置没有用)

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

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

3.4.3 运行成功

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

image-20230209190841115

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

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

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如下

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

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

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

image-20230416155822038

image-20230416155631350

我们需要找的文件是

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

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

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

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

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

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粘贴到浏览器,尝试访问

1
replit给的url/khl-wh

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

image-20230416160342496

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

image-20230416160241511

完美解决!

4.下线机器人

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

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

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:请不要误会,我不是卖服务器的,我也没有接广告😂