Python Flask with Telethon

Python Flask with Telethon

我想在我的 Flask Web 应用程序中使用 Telethon Telegram API。但是当我 运行 它时,我收到以下错误:

RuntimeError: 线程 'Thread-1' 中没有当前事件循环。

我认为 asyncio 存在一些问题。但我不确定。

这是我的代码

#!/usr/bin/python3

from flask import Flask
from telethon import TelegramClient
from telethon import sync

app = Flask(__name__)

@app.route('/')
def index():
    api_id = XXXXXX
    api_hash = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    client = TelegramClient('XXXXXX', api_id, api_hash)
    client.start()
    return 'Index Page'

if __name__ == '__main__':
    app.run()

基本上,这是由于 Python 的 GIL。如果您不想深入研究 asyncio 内部结构,只需 pip3 install telethon-sync 就可以了。

以下是我在尝试之后学到的东西。首先,确保你知道什么是 asyncio,它真的超级简单。然后您可以更高效地处理它。

Telethon 使用 asyncio,这意味着当您调用阻塞方法时,您必须等到协程完成。

client.loop ###Doesn't work inside flask, it might have to do with threads.

您可以轻松导入 asyncio 并使用主循环。像这样。

import asyncio
loop = asyncio.get_event_loop()

现在您已准备好等待协程完成。

  1. 创建一个新的异步函数并将 await 添加到阻塞方法中。
  2. 使用主事件循环执行代码。

Here's a code sample.

async def getYou():
    return await client.get_me()

@app.route("/getMe", methods=['GET'])
def getMe():
    return {"MyTelegramAccount": loop.run_until_complete(getYou())}

还有一件事。不要使用 telethon.sync,它没有完全转换为同步,它使用上面的模式等待所有方法。

在你的位置,我会考虑使用 Quart Telethon 自己的文档中建议的,它更容易。