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

如何让迁移至Webhook+Flask+PythonAnywhere的Telegram Bot响应消息处理器

Telegram Bot Webhook模式迁移问题解决

问题根源分析

  • 你的webhook_handler函数中,调用bot.process_new_updates([update])后又手动处理消息并发送测试回复,这会干扰TeleBot内置的消息处理器逻辑,导致start_handler和echo_handler无法正常触发。
  • 在PythonAnywhere平台部署Flask应用时,不能使用app.run()启动服务,平台要求通过WSGI配置加载应用,直接调用app.run()会导致服务无法正确运行。
  • 代码未处理update中不存在message的情况(比如回调更新、频道更新等),会引发运行时错误,导致请求处理失败。

修复后的代码

from flask import Flask, request
import telebot

# BOT TOKEN
bot = telebot.TeleBot("6181772972:AAH2ai1yQjJKyNkpsj924tPwOrkXRDWYuu8")

# 初始化Flask实例
app = Flask(__name__)

# Webhook处理路由
@app.route('/hook', methods=['POST'])
def webhook_handler():
    try:
        update = telebot.types.Update.de_json(request.stream.read().decode('utf-8'))
        # 仅让TeleBot处理更新,不要手动重复处理消息
        bot.process_new_updates([update])
        return 'ok'
    except Exception as e:
        # 捕获异常避免请求报错
        print(f"处理更新出错: {e}")
        return 'error', 500

# /start命令处理器
@bot.message_handler(commands=['start'])
def start_handler(message):
    bot.send_message(message.chat.id, "start command")

# 普通文本消息处理器
@bot.message_handler(func=lambda message: True)
def echo_handler(message):
    bot.send_message(message.chat.id, message.text)

# PythonAnywhere部署时无需app.run(),平台会通过WSGI加载app
# 仅本地测试时启用以下代码
if __name__ == '__main__':
    # 本地测试时设置webhook并启动服务
    bot.remove_webhook()
    bot.set_webhook(url='https://manov.pythonanywhere.com/hook')
    app.run(debug=True)

部署额外注意事项

  • 在PythonAnywhere的WSGI配置文件中,需指向你的Flask应用对象。若代码文件名为bot_app.py,则WSGI配置中添加:
    from bot_app import app as application
    
  • 确认webhook URL与PythonAnywhere的域名路径完全匹配,路径/hook需正确对应路由。
  • 部署后可通过Telegram Bot API的getWebhookInfo接口检查webhook状态,确认设置成功且无错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:05:25