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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 10:45:04