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

Python-telegram-bot v13.13结合Django配置Webhook后,Bot不响应/start命令的问题排查求助

Python-telegram-bot v13.13结合Django配置Webhook后,Bot不响应/start命令的问题排查求助

兄弟,我仔细扒了你的代码,发现几个核心问题导致Bot收不到/start命令的响应,咱们一步步拆解:

1. Updater启动Webhook和Django服务器冲突

你在if __name__ == '__main__':里调用了updater.start_webhook(),但Django本身已经是一个Web服务器在监听8050端口了——这相当于同时启动两个服务抢同一个端口,而且Django的webhook视图才是Telegram发送请求的入口,Updater自带的webhook服务完全没必要,反而会干扰正常的请求流转。

2. Handler根本没被注册到Dispatcher

在Django项目里,if __name__ == '__main__':这个代码块不会被执行——因为Django是通过WSGI/ASGI服务器启动的,不是直接运行这个脚本。所以你在这个块里添加的CommandHandler('start', start)和MessageHandler根本没被注册到Dispatcher里,自然不会处理任何命令和消息。

3. 实例初始化后的关键步骤缺失

你的Bot、Updater、Dispatcher是全局初始化的,但核心的handler注册逻辑被放到了不会执行的代码块里,相当于Dispatcher是空的,哪怕收到了Telegram的请求,也找不到对应的处理函数。

修复后的代码示例

调整handler注册位置,去掉Updater的webhook启动逻辑,直接在全局完成handler注册:

from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from decouple import config
import json

# 全局初始化Bot、Updater和Dispatcher
TOKEN = config('TELEGRAM_TOKEN')
bot = Bot(token=TOKEN)
updater = Updater(token=TOKEN)
dp = updater.dispatcher

# 定义命令处理函数
def start(update: Update, context: CallbackContext) -> None:
    print('this is start')
    update.message.reply_text('Hello World!')

def echo(update: Update, context: CallbackContext) -> None:
    print('this is echo')
    update.message.reply_text(update.message.text)

# 提前注册所有handler,不要放在main块里
dp.add_handler(CommandHandler('start', start))
dp.add_handler(MessageHandler(Filters.text, echo))

@csrf_exempt
def webhook(request):
    print('this is webhook')
    if request.method == 'POST':
        update = Update.de_json(json.loads(request.body), bot)
        dp.process_update(update)
    return HttpResponse('ok')

# 删掉Updater的start_webhook和idle,因为Django已经是Web服务器了
# if __name__ == '__main__':
#     print('this is main')
#     updater.start_webhook(
#         listen="0.0.0.0",
#         port=8050,
#     )
#     updater.idle()

额外需要检查的点

  • 确保你已经通过Telegram API设置了正确的Webhook地址,比如用curl命令:
    curl -F "url=https://你的域名/webhook/" https://api.telegram.org/bot<你的TOKEN>/setWebhook
    
  • 查看Django控制台日志,确认webhook函数里的print('this is webhook')是否被触发,验证Telegram的请求确实到达了Django视图。
  • 如果是本地测试,需要用ngrok之类的工具做内网穿透,确保Telegram能访问到你的Webhook地址。

备注:内容来源于stack exchange,提问作者Oleg Bondar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:27:34