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
相关产品推荐
相关产品推荐

