Telethon - как настроить простое веб-приложение (например, с помощью Quart)? - PullRequest
0 голосов
/ 17 июня 2020

Я делаю небольшой проект, написанный на PHP (Laravel framework), и часть проекта должна выполнять обмен сообщениями в Telegram. Мне не удалось найти ни одной библиотеки MTProto, написанной на PHP, которая хорошо поддерживается и хорошо документирована. Я знаю, что есть MadelineProto, но в нем отсутствуют многие функции, и он не такой большой и любимый, как Telethon.

Итак, я подумал, может быть, я мог бы просто настроить простой python скрипт (хотя у меня нет опыта с Python), где он предоставляет простой API, к которому я могу подключиться со стороны PHP, вызывать эти методы и использовать их. (Сообщите мне, есть ли какие-нибудь решения получше)

Моей первой мыслью было использовать Flask с Telethon, но, как вы, возможно, знаете, Telethon - это библиотека asyncio, и она не интегрируется с Flask легко. И я нашел об этой полезной ссылке , которая объясняет кое-что и говорит о Quart и предоставляет (предположительно) рабочий пример.

Я пытался следовать за ней вот так (Python 3.8):

from telethon import TelegramClient, connection
import hypercorn.asyncio
from quart import Quart

api_id = x
api_hash = x

client = TelegramClient('telegram', api_id, api_hash)

app = Quart(__name__)

@app.before_serving
async def startup():
    await client.connect()


@app.after_serving
async def cleanup():
    await client.disconnect()

@app.route('/')
async def hello_world():
    await client.send_message('me', 'Hello World')
    return 'Message Sent!'

async def main():
    await hypercorn.asyncio.serve(app, hypercorn.Config())

if __name__ == '__main__':
    client.loop.run_until_complete(main())

Я знаю, что в кварте пример они вручную выполняют вход в систему, но мне это не нужно. В моем случае я работаю только с 1 глобальным клиентом, и я уже вошел в систему с помощью встроенного интерактивного входа в Telethon (запустив python run.app в первый раз, когда он создает файл сеанса) В любом случае сообщение hello world отправляется но проблема в том, что я получаю всевозможные ошибки в выводе консоли.

Например, если я пытаюсь остановить приложение, используя (CTRL + C) после запуска python run.py, я получаю эту ошибку:

RuntimeError: no running event loop Task was destroyed but it is pending

Или, если я попытаюсь запустить код, используя hypercorn run:app, я сразу получаю эти 2 ошибки, и приложение даже не запускается:

got Future <Future pending> attached to a different loop RuntimeWarning: coroutine 'open_connection' was never awaited

(я удалил все трассировки, чтобы вопрос оставался чистым)

Вот мои вопросы:

  1. Я не знаю, m делаю пример неправильно, может я чего-то упускаю?
  2. Следует ли мне использовать другую библиотеку, кроме Quart? или это не имело бы никакого значения?
  3. Возможно, я неправильно подошел к проблеме и мне нужно использовать другое решение, чтобы Telethon работал с PHP?
...