如何在cPanel中实现Telethon用户机器人与Flask服务同时持久运行
问题根源
你当前的代码存在两个阻塞调用顺序执行的问题:
client.run_until_complete(main())会一直占用asyncio事件循环持续监听Telegram事件,永远不会执行到后续的app.run()- 就算调整执行顺序,Flask默认的werkzeug开发服务器也是同步阻塞的,启动后同样会占满线程,无法同时运行Telethon的异步逻辑
解决方案
把两个服务都挂载到同一个异步事件循环中并发运行,使用支持ASGI的服务器(如Hypercorn)运行Flask,和Telethon共享事件循环。
依赖安装
执行以下命令安装所需依赖:pip install hypercorn flask>=2.0 telethon
完整修改代码
from telethon import TelegramClient, events from telethon.sessions import StringSession import asyncio from flask import Flask from hypercorn.asyncio import serve from hypercorn.config import Config # 请补充你的api_id实际值 api_id = 你的API_ID api_hash = '你的API_HASH' string = '你的SessionString' # 初始化Telethon客户端 client = TelegramClient(StringSession(string), api_id, api_hash) # 初始化Flask应用 app = Flask(__name__) @app.route('/') async def index(): return 'index page' # Telethon事件处理和启动逻辑 async def run_telethon(): await client.start() await client.send_message('me', 'telethon : I\'m alive ') @client.on(events.NewMessage(chats="me")) async def handler(event): await client.send_message('me', event.message) if event.message.photo: if event.message.message.find('text') != -1: await client.send_message('me', "text") messageId = str(event.message.photo.id) messageDate = event.message.date # messagePhotoPath = await event.message.download_media(file="./media") rawText = event.message.message posText = rawText.find('text') await client.send_message('me', "text"+str(posText)) messageText = event.message.message[posText:posText+6] else: await client.send_message('me', "text") # 持续运行Telethon客户端 await client.run_until_disconnected() # Flask服务启动逻辑 async def run_flask(): config = Config() # 可根据需求修改监听地址和端口 config.bind = ["0.0.0.0:5000"] await serve(app, config) # 主入口,并发运行两个服务 async def main(): await asyncio.gather( run_telethon(), run_flask() ) if __name__ == '__main__': asyncio.run(main())
部署注意事项
- cPanel部署时需要确保你绑定的端口(示例中为5000)已对外开放,且没有被其他服务占用
- 不要使用Flask默认的
app.run()启动,必须使用Hypercorn这类ASGI服务器才能和Telethon的异步逻辑共存 - 如果需要后台常驻运行,可以在cPanel的进程管理器中添加该脚本作为常驻进程,或者使用nohup、systemd等工具托管进程
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

