Golang如何在单服务器上用不同token启动多个Telegram Bot?
问题原因及解决方案
核心原因
两个bot进程出现冲突的根本原因是端口占用,结合你的代码细节具体逻辑如下:
- 你的代码中启动webhook监听时固定占用了
0.0.0.0:8443端口,操作系统同一端口仅允许被一个进程绑定监听 - 你将
http.ListenAndServeTLS调用放在了无错误捕获的goroutine中,第二个bot进程启动时,端口绑定失败的错误不会被输出到日志,你只会看到授权成功、webhook设置成功的日志,误以为服务正常启动,实际上第二个bot根本没有正常监听端口接收Telegram的回调请求 - 你关闭第一个bot后,8443端口被释放,第二个bot的监听(如果还在运行)就可以正常工作,符合你观测到的现象
可行解决方案
你可以根据自己的需求选择以下任意一种方案:
方案1:多进程部署使用不同端口
给每个bot分配独立的监听端口,对应修改两处配置:
- webhook地址的端口,例如第二个bot的webhook地址改为
https://example.com:8444/+ 第二个bot的token - 监听端口改为对应端口,例如第二个bot的监听代码改为
go http.ListenAndServeTLS("0.0.0.0:8444", "cert.pem", "key.pem", nil)
另外建议补充监听错误的捕获逻辑,避免类似问题被隐藏:
go func() { err := http.ListenAndServeTLS("0.0.0.0:8443", "cert.pem", "key.pem", nil) if err != nil { log.Fatalf("webhook服务启动失败: %v", err) } }()
方案2:用反向代理统一端口转发
在服务器上部署Nginx等反向代理服务,统一监听443/8443端口,根据请求路径匹配转发到本地不同端口的bot服务:
- 两个bot分别监听本地不同的非加密端口,例如
127.0.0.1:8081、127.0.0.1:8082,不需要再配置TLS证书 - Nginx配置不同路径转发规则,例如
/bot1token前缀的请求转发到127.0.0.1:8081,/bot2token前缀的请求转发到127.0.0.1:8082 - 两个bot的webhook地址统一填写Nginx对外的域名+对应路径即可
方案3:单进程部署多bot
将多个bot的逻辑合并到同一个服务进程中,只启动一个HTTP服务监听端口,给每个bot注册独立的webhook回调路径即可,资源开销更低。
内容的提问来源于stack exchange,提问作者codices
相关产品推荐
相关产品推荐

