如何基于python-telegram-bot v20实现无服务器Telegram机器人?
Python-Telegram-Bot v20.2 无服务器架构适配方案
核心逻辑
无服务器架构下无法使用run_polling()的长轮询模式,需将Telegram通过Webhook推送的请求直接转换为机器人可识别的Update对象,交由Application处理。
完整实现代码
import asyncio import json from telegram import Update from telegram.ext import Application, CommandHandler import config # 全局初始化Application,复用实例提升性能 application = Application.builder().token(config.MYTOKEN).build() # 你的命令处理器(和本地运行的逻辑一致) async def send_welcome(update: Update, context): await update.message.reply_text("欢迎使用机器人!") # 注册处理器 application.add_handler(CommandHandler("start", send_welcome)) async def handler(event, context): # 解析Telegram Webhook请求体 request_body = json.loads(event['body']) # 将JSON请求转换为Update对象 update = Update.de_json(request_body, application.bot) # 提交更新到处理队列并启动应用处理 await application.update_queue.put(update) await application.initialize() await application.start() # 等待队列中所有更新处理完成 while not application.update_queue.empty(): await asyncio.sleep(0.1) # 清理应用资源 await application.stop() await application.shutdown() return { 'statusCode': 200, 'body': json.dumps({'status': 'success'}) }
关键说明
- 全局Application实例:避免每次请求重复初始化机器人,大部分无服务器平台会保留函数实例复用,有效提升响应速度。
- Update.de_json方法:这是对接Webhook的核心,将Telegram推送的JSON数据转换为python-telegram-bot内部的
Update对象,替代轮询模式下的自动拉取逻辑。 - 异步流程控制:手动管理
Application的初始化、启动、停止流程,确保所有消息处理任务执行完毕后再返回响应,避免Telegram重复推送请求。
注意事项
- 提前通过
application.bot.set_webhook(url="你的无服务器函数URL")完成Webhook配置(本地运行一次即可)。 - 调整无服务器平台的函数超时时间至10秒左右,确保消息处理流程能完整执行。
- 打包部署时需包含依赖:
python-telegram-bot==20.2,可通过requirements.txt声明。
内容的提问来源于stack exchange,提问作者Mouz
相关产品推荐
相关产品推荐

