Я делаю небольшой проект, написанный на 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
(я удалил все трассировки, чтобы вопрос оставался чистым)
Вот мои вопросы:
- Я не знаю, m делаю пример неправильно, может я чего-то упускаю?
- Следует ли мне использовать другую библиотеку, кроме Quart? или это не имело бы никакого значения?
- Возможно, я неправильно подошел к проблеме и мне нужно использовать другое решение, чтобы Telethon работал с PHP?