NodeJS 中用来管理 Telegram Bot 的求助。

110 天前
 chenzhe

写过 Bot ,勉强算是有一点经验吧,但是都是通过环境变量的方式将 Bot 的 Token 写好,然后将各种自动回复的逻辑写好,直接跑起来。 不过这次是想写一个 TG Bot 的管理面板,可以在面板中添加、删除 Bot 。我大致能想到,往数据库中插入的数据是啥样的。

const botInfo = {
  name: "机器人名称",
  token: "机器人的 Token",
  commands: [
    {
      command: "start",
      descript: "开始命令",
    },
  ],
  hears: [
    {
      regexp: "正则",
      reply: "回复内容",
    },
  ],
};

目前 API 是用 NestJS 来写,用的比较顺手的包是 nestjs-telegraf,但是这个包需要在 module 引入的时候就传入机器人的 token 了。 不知道有没有彦祖可以指导一下,怎么动态的来添加、删除机器人。

712 次点击
所在节点    Telegram
16 条回复
julyclyde
109 天前
你是打算,一个进程支持多个 bot token 么?
那是不是只能用 webhook 模式了? getUpdates 模式好像不合适?
chenzhe
109 天前
@julyclyde 是的,一个进程多个 Bot ,也是打算用 webhook 模式。
julyclyde
109 天前
@chenzhe webhook 消息好像没有包含“发给哪个 bot”吧?
这样的话你需要设置不同的 webhook URI 了这样才能区分到底是发给哪个 bot 的
然后可以选两种做法:直接返回一个 json 作为应对动作,或者通过 URI 反查 token 然后发出对应的 API call
chenzhe
109 天前
@julyclyde 肯定是每个 bot 分别去设置 webhook 的 uri ,例如我在数据库中添加了一个 bot 信息,此时才会用 telegraf 去 new 一个 bot 事例,并且用这个实例去调用 setWebhook 的指令呀。
shizhibuyu2023
109 天前
用 Dynamic modules 或者手动 import 试试看呗,本质不都是模块吗
zbinlin
109 天前
chenzhe
109 天前
@zbinlin 主要就是不太懂该怎么用。 我知道这边可以注入 entityManager 之类的去获取数据库里的 token 然后来注册 bot ,可是它不是在启动的时候就执行了嘛。
julyclyde
109 天前
@chenzhe 我没用框架,不太能理解你这种做法。呵呵
我都是自己做 IO 的
chenzhe
109 天前
@julyclyde #8 自己做 IO 是什么意思,有没有例子可以分享一下?
总是得跟接口互动嘛,即使不用 nestjs 这样的,也得配合个 express 之类的呀。
julyclyde
108 天前
@chenzhe requests.get getUpdates 或者用 simplehttpserver 来接收 webhook
我是这样做的
chenzhe
108 天前
@julyclyde #10 那是如何动态的处理 bot 呢? 例如我今天用的是这个 bot 的 token ,然后过几天我需要添加一个新的 bot 也提供这些功能,那么你是如何在不动代码的情况下去添加这个 bot 上去呢?
julyclyde
108 天前
@chenzhe webhook 模式,一个 HTTP 端口下面,可以根据 URI 来区分多个 bot 吧?
不过我还没实现这部分,只是有这个想法
chenzhe
108 天前
@julyclyde #12 这个是可以的,param 部分可以学习官方的借口后面的 param 传 bot 的 token ,这样就可以区分不同的 bot 了。
目前我也是这样做的,我原以为有比较好的方案,想来学习学习的。
不过目前没问到什么好的方案。
julyclyde
108 天前
@chenzhe 其实我觉得直接一个 bot 实例单独搞一个进程最简单了……编程的时候甚至都不需要考虑各 bot 之间隔离数据的问题
chenzhe
108 天前
@julyclyde #14 可是目前要做的就是这种功能呀。一个控制面板,然后添加 bot 的 token 进去,然后可以设置几个关键字的自动回复。
julyclyde
108 天前
@chenzhe 添加一个 token 你就另外启动一个进程呗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1063519

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX