写过 Bot ,勉强算是有一点经验吧,但是都是通过环境变量的方式将 Bot 的 Token 写好,然后将各种自动回复的逻辑写好,直接跑起来。 不过这次是想写一个 TG Bot 的管理面板,可以在面板中添加、删除 Bot 。我大致能想到,往数据库中插入的数据是啥样的。
const botInfo = {
name: "机器人名称",
token: "机器人的 Token",
commands: [
{
command: "start",
descript: "开始命令",
},
],
hears: [
{
regexp: "正则",
reply: "回复内容",
},
],
};
目前 API 是用 NestJS 来写,用的比较顺手的包是 nestjs-telegraf,但是这个包需要在 module 引入的时候就传入机器人的 token 了。 不知道有没有彦祖可以指导一下,怎么动态的来添加、删除机器人。
import { Body, Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';
import { Pub } from './decorators/pub.decorator';
import * as grammy from 'grammy';
const { Bot } = grammy;
@Controller()
@Pub()
export class AppController {
constructor(private readonly appService: AppService) {}
@Post()
async handle(@Body('token') token: string) {
console.log('token', token);
const bot = new Bot(token);
bot.command('start', (ctx) => ctx.reply('Hello!'));
bot.on('message', (ctx) => {
console.log(ctx.message);
});
bot.start();
return true;
}
}
当前的处理方案大致是按照这样的处理方式来做,也确实能够同时handle多个bot
1
julyclyde 111 天前
你是打算,一个进程支持多个 bot token 么?
那是不是只能用 webhook 模式了? getUpdates 模式好像不合适? |
3
julyclyde 111 天前
@chenzhe webhook 消息好像没有包含“发给哪个 bot”吧?
这样的话你需要设置不同的 webhook URI 了这样才能区分到底是发给哪个 bot 的 然后可以选两种做法:直接返回一个 json 作为应对动作,或者通过 URI 反查 token 然后发出对应的 API call |
4
chenzhe OP @julyclyde 肯定是每个 bot 分别去设置 webhook 的 uri ,例如我在数据库中添加了一个 bot 信息,此时才会用 telegraf 去 new 一个 bot 事例,并且用这个实例去调用 setWebhook 的指令呀。
|
5
Xu3Xan89YsA7oP64 111 天前
|
6
zbinlin 111 天前
文档里不是有个 async configuration 吗? https://github.com/robot-mafia/nestjs-telegraf/blob/main/docs/async-configuration.md
|
7
chenzhe OP @zbinlin 主要就是不太懂该怎么用。 我知道这边可以注入 entityManager 之类的去获取数据库里的 token 然后来注册 bot ,可是它不是在启动的时候就执行了嘛。
|
9
chenzhe OP @julyclyde #8 自己做 IO 是什么意思,有没有例子可以分享一下?
总是得跟接口互动嘛,即使不用 nestjs 这样的,也得配合个 express 之类的呀。 |
11
chenzhe OP @julyclyde #10 那是如何动态的处理 bot 呢? 例如我今天用的是这个 bot 的 token ,然后过几天我需要添加一个新的 bot 也提供这些功能,那么你是如何在不动代码的情况下去添加这个 bot 上去呢?
|