You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决Telegram Bot通过ngrok配置Webhook接收消息异常问题?

排查Telegram Bot Webhook+ngrok无法接收消息的问题

我来帮你一步步排查这个问题,这种情况我碰到过好几次,大概率是某个环节的配置没对齐,咱们一个个来检查:

1. 先确认ngrok隧道的基础配置是否正确

  • 首先,确保你启动ngrok时指定的端口和本地VM中Bot服务监听的端口完全一致。比如你的Bot在VM里用8080端口,那启动命令应该是:
    ngrok http 8080
    
  • 启动后,看终端里的Forwarding行,会有一个类似https://abc123.ngrok.io的公网地址——这个地址必须完整用于设置Telegram Webhook,不能自己加后缀或者改域名。
  • 实时查看ngrok的请求日志,确认Telegram有没有发请求过来:
    ngrok http 8080 --log=stdout
    
    如果日志里完全看不到Telegram的请求,那问题出在Webhook设置;如果有请求但返回502 Bad Gateway之类的错误,说明ngrok能连到你的VM,但你的Bot服务没正常响应。

2. 验证Telegram Webhook的设置状态

用Telegram的官方API来检查Webhook的状态,这是最直接的排障方式:

  • 先检查当前Webhook的配置(替换<你的BotToken>):
    curl https://api.telegram.org/bot<你的BotToken>/getWebhookInfo
    
    重点看last_error_message字段,Telegram会明确告诉你哪里出错了——比如URL不可达、证书无效、路径不存在等。
  • 如果Webhook设置有误,重新设置(替换<你的BotToken><ngrok完整地址>,如果你的Bot有特定Webhook路径,比如/webhook,要加上):
    curl -X POST https://api.telegram.org/bot<你的BotToken>/setWebhook -d "url=https://abc123.ngrok.io/webhook"
    

3. 检查本地VM的网络可达性

  • 确保你的Bot服务监听的是0.0.0.0而不是127.0.0.1:如果只绑定127.0.0.1,那只有VM本地能访问,ngrok的请求会被拒绝。比如用Flask的话,启动代码要写:
    app.run(host='0.0.0.0', port=8080)
    
  • 检查VM的防火墙是否放开了监听端口:比如Ubuntu用ufw的话,执行:
    ufw allow 8080
    
  • 从运行ngrok的主机(或者其他外部机器)测试能不能访问VM的服务:
    curl http://<VM的本地IP>:8080/webhook
    
    如果这个请求都失败,说明VM的服务没对外暴露,先解决这个问题。

4. 关于/etc/hosts的设置

其实免费版ngrok的随机公网域名不需要修改/etc/hosts——除非你用了ngrok的自定义域名功能。如果是自定义域名,要确保:

  • ngrok的隧道配置里绑定了这个自定义域名
  • 你的DNS解析(或者hosts映射)指向了ngrok的入口地址
    如果是随便加了个主机名到hosts,反而可能导致请求路由错误,建议先去掉这个设置,用ngrok默认的公网地址测试。

5. 证书相关检查

Telegram要求Webhook必须用HTTPS,ngrok默认提供的HTTPS证书是受信任的,所以一般没问题,但如果是自定义域名的ngrok隧道,要确保证书是有效的(不能用自签名证书,Telegram不接受)。

按照上面的步骤一步步排查,基本能定位到问题所在。

内容的提问来源于stack exchange,提问作者automatix

火山引擎 最新活动