Django+pyTelegramBotAPI开发的Telegram机器人生产环境webhook无响应问题
问题排查与解决步骤
1. 修复JSONDecodeError报错
报错是因为请求体末尾存在多余不可见字符/换行符,修改webhook视图中的JSON解析逻辑,先对请求体内容做去空白处理即可解决:
@csrf_exempt def webhook(request): body_str = request.body.decode('utf-8').strip() print(body_str) update = telebot.types.Update.de_json(json.loads(body_str)) bot.process_new_updates([update]) return JsonResponse({'message': 'OK'}, status=200)
2. 修复生产环境无响应问题
这是核心故障,原因是你把webhook重置代码放在了全局作用域:
生产环境下Django通常会启动多个worker进程,每个进程启动时都会执行全局的bot.remove_webhook()和bot.set_webhook()代码,频繁重置webhook会导致Telegram清空待处理更新、甚至临时限流。
修改方案:
仅在本地调试模式下自动设置webhook,生产环境把webhook设置逻辑移到单独的手动执行脚本中,不要随进程启动自动执行,调整后的代码参考:
import json from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt import telebot from django.conf import settings bot = telebot.TeleBot('你的bot token') if settings.DEBUG: WEBHOOK_HOST = 'https://zzzz.ngrok.io' else: WEBHOOK_HOST = 'https://example.com' WEBHOOK_URL = '/telegram_webhook/' @bot.message_handler(commands=['start']) def send_welcome(message): bot.reply_to( message, "Привет! Кажется, мы еще незнакомы. Твой номер: "+str(message.chat.id) ) @bot.message_handler(func=lambda message: True, content_types=['text']) def echo_message(message): bot.reply_to(message, message.text) @csrf_exempt def webhook(request): body_str = request.body.decode('utf-8').strip() update = telebot.types.Update.de_json(json.loads(body_str)) bot.process_new_updates([update]) return JsonResponse({'message': 'OK'}, status=200) # 仅本地调试时自动执行webhook设置,生产环境移除这部分代码 if settings.DEBUG: bot.remove_webhook() import time time.sleep(1) bot.set_webhook( url = WEBHOOK_HOST + WEBHOOK_URL, )
3. 额外校验项
如果修改后仍无响应,按以下顺序排查:
- 确认生产环境的Telegram Bot Token和WEBHOOK_HOST配置正确,没有混淆测试和生产参数
- 确认生产服务器的443端口对外开放,且没有WAF/CDN拦截Telegram的请求
- 查看Django生产日志,确认Telegram的请求确实到达了webhook视图,没有被中间件拦截
内容的提问来源于stack exchange,提问作者Boris Paschenko
相关产品推荐
相关产品推荐

