You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Telegram Bot Webhook部署异常:无响应及域名显示问题排查

排查Telegram Bot Webhook无响应问题

1. 确认Webhook配置的域名正确性

先通过Telegram API查询当前Webhook状态,验证配置的URL是否正确:
curl https://api.telegram.org/bot<你的BotToken>/getWebhookInfo
查看返回结果中的url字段,确认是否为https://bot.vpsprovider.com/<你的BotToken>。如果显示的是服务器IP,说明设置Webhook时用错了地址,重新执行设置命令:
curl -F "url=https://bot.vpsprovider.com/<你的BotToken>" https://api.telegram.org/bot<你的BotToken>/setWebhook

2. 检查Nginx是否正确转发POST请求

Telegram Bot发送消息用的是POST请求,若Nginx配置只处理了GET请求,会导致Bot无响应。确保你的域名配置文件(比如/etc/nginx/sites-available/bot.vpsprovider.com)包含以下内容:

server {
    listen 443 ssl;
    server_name bot.vpsprovider.com;

    ssl_certificate /etc/letsencrypt/live/bot.vpsprovider.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bot.vpsprovider.com/privkey.pem;

    location /<你的BotToken> {
        proxy_pass http://127.0.0.1:<你的Bot监听端口>;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
    }

    location / {
        return 200 "OK";
    }
}

server {
    listen 80;
    server_name bot.vpsprovider.com;
    return 301 https://$host$request_uri;
}

配置完成后重启Nginx:sudo systemctl restart nginx,同时查看错误日志排查问题:sudo tail -f /var/log/nginx/error.log

3. 验证证书链完整性

Certbot生成的Let's Encrypt证书本身受信任,但要确保Nginx使用的是包含完整证书链的fullchain.pem,而非单独的cert.pem。执行以下命令检查证书链:
openssl s_client -connect bot.vpsprovider.com:443 -showcerts
若返回结果中证书链完整、无报错,说明证书环节无问题。

4. 检查Python脚本的请求处理逻辑

确保你的Bot脚本正确接收并处理POST请求,以Flask为例,核心代码需包含POST路由:

from flask import Flask, request
import telegram

app = Flask(__name__)
bot = telegram.Bot(token="<你的BotToken>")

@app.route('/<你的BotToken>', methods=['POST'])
def webhook():
    update = telegram.Update.de_json(request.get_json(force=True), bot)
    # 测试/start命令处理
    if update.message and update.message.text == '/start':
        bot.send_message(chat_id=update.message.chat_id, text="已收到/start命令")
    return 'OK'

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=<你的Bot监听端口>)

可以在路由中添加日志,验证是否接收到POST请求:
print(f"收到POST请求:{request.get_json()}")
发送消息后查看控制台输出,确认请求是否到达脚本。

5. 确认服务器端口和防火墙设置

确保DigitalOcean Droplet的防火墙开放了443(HTTPS)和80(HTTP重定向)端口,同时本地UFW防火墙也允许相关端口:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

6. 模拟POST请求测试

用curl模拟Telegram发送的请求,验证链路是否通畅:
curl -X POST -H "Content-Type: application/json" -d '{"message":{"chat":{"id":12345},"text":"/start"}}' https://bot.vpsprovider.com/<你的BotToken>
如果返回OK且脚本控制台有日志输出,说明请求链路正常,问题可能出在消息处理逻辑;若返回错误,继续排查Nginx或脚本配置。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:20:29