jab*_*ber 3 node.js telegram-bot telegraf
我有 6 个机器人,我想在同一台服务器上运行它们,但是当我运行第二个机器人时,它会抛出此错误:
address already in use :::8443
我知道我只能使用 4 个端口(80,88,443,8443)进行 webhook,但我有 6 个机器人。实际上,我正在尝试在同一端口上运行所有机器人。
有办法做吗?
我正在使用 telegraf 框架。我为每个机器人创建了一个目录,因为我认为这是做到这一点的方法。也许我错了。
这是每个目录中机器人的代码:
const Telegraf = require('telegraf');
const fs = require('fs');
let token = 'botID:botToken';
const bot = new Telegraf(token);
const tlsOptions = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem'),
ca: []
}
bot.on('message', (ctx) => ctx.reply('Hey'));
bot.telegram.setWebhook('https://myAddress.com:8443/test/botID');
bot.startWebhook('/test/botID', tlsOptions, 8443);
Run Code Online (Sandbox Code Playgroud)
我必须承认我没有编写 Telegram 机器人,所以我接下来可能说的一些内容可能不适用。编辑-我做了一些阅读,并根据我的阅读更新了我的答案。
Telegram Bot 服务提供 Webhook 访问,因此,您只需为每个 Bot 注册不同的 URL,然后使用路由让适当的 Bot 代码应答请求。您可以在单一存储库中完成这一切,或将其设置为微服务。由你决定。
我不会提供代码,但基本上您将拥有一个存储库,该存储库在 Telegram Bot 服务接受的 Webhook 端口之一(80、88、443、8443)上公开 Web 服务。在此 Web 服务中,您将收到针对特定 URL 的请求,该 URL 然后将该请求路由到适当的处理程序,在本例中将是您的机器人代码。
例如在端口 8443 上暴露的 Web 服务
Express、Koa等等...都可以提供这种类型的代码。(Telegraf 甚至在其文档中提供了 Koa集成的示例。)
不管你相信与否,这个选项实际上可能需要你更少的编码,但需要更多的配置和编排。在此配置中,您只需设置一个反向代理(nginx效果很好),它将接收所有入站 Telegram 机器人请求,然后将它们转发到本地基于 Telegraf 的机器人。
因此,您可以在所有单独的端口(例如 3000、3001、3002 等)上构建并运行您的机器人。然后配置反向代理以将入站请求路由到适当的机器人处理程序。
例如反向代理监听端口 8443
对于反向代理,我提到了 nginx,您还可以使用 AWS 或 Azure 的 API 网关等服务。您还可以在 AWS(通过 Lambda)或 Azure(通过 Functions)上将 Telegraf 机器人作为无服务器应用程序运行。
无论哪种方式都会起作用。就我个人而言,我会使用微服务方法来部署它,因为这样您就可以根据需要独立扩展每个机器人。
端口只是 TCP 或 UDP 数据包上的一个“数字”,它告诉 IP 堆栈哪个应用程序应该接收该数据包。每个 IP 地址、每个协议(TCP 或 UDP - HTTPS 使用 TCP)有 65536 个可用端口。因此,从技术上讲,您可以使用哪些端口让应用程序接收其数据包并没有限制。因此,排除任何其他限制(入站防火墙、框架限制等),您可以简单地在端口上启动 6 个机器人:8443、8444、8445 等。
为了回答有关在单个端口上运行六个机器人的问题,我可以再次使用通用服务器技术来解决这个问题。稍微备份一下,当数据包传入计算机时,它们首先使用 IP 地址找到正确的计算机,然后使用本地 MAC 地址,最后使用计算机上的端口将其发送到正确的应用程序。如果您需要多个应用程序在同一端口上接收数据,那么您需要在应用程序协议中自行执行该寻址。因此,如果在 Telegraf 机器人应用程序协议中指示哪个机器人应该接收数据,那么您可以简单地使用路由代码将传入数据定向到正确的机器人。在这种情况下,您不会让每个 BOT 通过侦听端口(例如,在您的情况下为同一端口)来启动,因为正如您所经历的那样,这将生成该端口已在使用中的错误。相反,您可以让路由代码侦听您希望侦听的端口,然后将传入数据路由到正确的机器人代码。
如果您可以接收信息的端口受到限制,并且 Telegraf 机器人协议中无法确定哪个机器人应该接收信息,那么运行六个机器人的唯一方法就是拥有多个 IP 地址,并且将机器人分布在可用端口上,然后在端口用完时分布在多个 IP 地址上。
例如可用端口 80、88、443、8443
需要运行 6 个机器人。