From 5b52f55a1a7b27489afcdfb9d9f4852af820d0a8 Mon Sep 17 00:00:00 2001 From: harold Date: Mon, 21 Apr 2025 12:33:24 +0500 Subject: [PATCH] add fix --- telegram-application/poetry.lock | 75 ++++++++++++++++++- telegram-application/pyproject.toml | 4 +- .../src/core/rabbitmq/connect.py | 14 ++-- telegram-application/src/main.py | 50 +++++++++---- 4 files changed, 123 insertions(+), 20 deletions(-) diff --git a/telegram-application/poetry.lock b/telegram-application/poetry.lock index 23ef93f..c37f1de 100644 --- a/telegram-application/poetry.lock +++ b/telegram-application/poetry.lock @@ -270,6 +270,21 @@ files = [ {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] +[[package]] +name = "click" +version = "8.1.8" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -326,6 +341,27 @@ files = [ anyio = ">=3.0.0,<5.0.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.0.0" +[[package]] +name = "fastapi" +version = "0.115.12" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d"}, + {file = "fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.40.0,<0.47.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] + [[package]] name = "faststream" version = "0.5.34" @@ -1476,6 +1512,24 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] +[[package]] +name = "starlette" +version = "0.46.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, + {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, +] + +[package.dependencies] +anyio = ">=3.6.2,<5" + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + [[package]] name = "tgcrypto" version = "1.2.5" @@ -1606,6 +1660,25 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvicorn" +version = "0.34.2" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403"}, + {file = "uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + [[package]] name = "yarl" version = "1.18.3" @@ -1706,4 +1779,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.1" python-versions = ">=3.11, <4.0" -content-hash = "65b93102052fc6bdc2add0c17d35a9b9d32f43265ea51509de7ef1dc24bd1123" +content-hash = "5bab4bdc2e631ffb0f11392a8a17d57db510005d49e23d7b3366138c79f1838d" diff --git a/telegram-application/pyproject.toml b/telegram-application/pyproject.toml index eccdbf6..aa48375 100644 --- a/telegram-application/pyproject.toml +++ b/telegram-application/pyproject.toml @@ -19,7 +19,9 @@ dependencies = [ "faststream[rabbitmq] (>=0.5.34,<0.6.0)", "asyncpg (>=0.30.0,<0.31.0)", "aio-pika (>=9.5.4,<10.0.0)", - "pyrogram (>=2.0.106,<3.0.0)" + "pyrogram (>=2.0.106,<3.0.0)", + "fastapi (>=0.115.12,<0.116.0)", + "uvicorn (>=0.34.2,<0.35.0)" ] diff --git a/telegram-application/src/core/rabbitmq/connect.py b/telegram-application/src/core/rabbitmq/connect.py index 627c760..ab5c721 100644 --- a/telegram-application/src/core/rabbitmq/connect.py +++ b/telegram-application/src/core/rabbitmq/connect.py @@ -1,11 +1,15 @@ -from asyncio import FastChildWatcher +from fastapi import FastAPI from faststream.rabbit import RabbitBroker, RabbitExchange, ExchangeType, QueueType, RabbitQueue - +from faststream.rabbit.fastapi import RabbitRouter, Logger from src.core.settings.base import settings +rabbitmq_router = RabbitRouter( + url=settings.RABBIT.URL, +) + broker = RabbitBroker( - url=settings.RABBIT.URL + url=settings.RABBIT.URL, ) @@ -34,8 +38,8 @@ success_gemini_subscriber = broker.subscriber( ) - -async def init_queue_and_publisher(): +@rabbitmq_router.after_startup +async def init_queue_and_publisher(app: FastAPI): await broker.declare_exchange(base_exchange) await broker.declare_queue(base_queue) await broker.declare_queue(success_queue) diff --git a/telegram-application/src/main.py b/telegram-application/src/main.py index 5b0edba..3400f1a 100644 --- a/telegram-application/src/main.py +++ b/telegram-application/src/main.py @@ -1,27 +1,51 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI from pyrogram import Client, filters, idle from pyrogram.handlers import MessageHandler - from src.core.settings.base import settings from src.core.tg_service.messages_handler import message_listener -from src.core.rabbitmq.connect import broker, init_queue_and_publisher +from src.core.rabbitmq.connect import broker, init_queue_and_publisher, rabbitmq_router +import uvicorn +import asyncio - -app = Client( +# Инициализация Pyrogram клиента +tg_client = Client( name=settings.ACCOUNT.NAME, api_id=settings.ACCOUNT.API_ID, api_hash=settings.ACCOUNT.API_HASH, ) -app.add_handler(MessageHandler( + +@asynccontextmanager +async def lifespan(app: FastAPI): + await tg_client.start() + await broker.start() + await init_queue_and_publisher(app) + await idle() + + yield + + await tg_client.stop() + await broker.close() + + +# Создание FastAPI приложения с кастомным lifespan +fastapi_app = FastAPI(lifespan=lifespan) +fastapi_app.include_router(rabbitmq_router) + +# Добавление обработчика для Telegram +tg_client.add_handler(MessageHandler( callback=message_listener, filters=filters.all )) -async def main(): - await app.start() - await broker.start() - await init_queue_and_publisher() - await idle() - await app.stop() - -app.run(main()) \ No newline at end of file +if __name__ == "__main__": + # Запуск FastAPI и Pyrogram в одном event loop + config = uvicorn.Config( + fastapi_app, + host="0.0.0.0", + port=8000, + loop="asyncio" + ) + server = uvicorn.Server(config) + asyncio.run(server.serve()) \ No newline at end of file