This commit is contained in:
harold 2025-04-21 12:33:24 +05:00
parent f481f36574
commit 5b52f55a1a
4 changed files with 123 additions and 20 deletions

View File

@ -270,6 +270,21 @@ files = [
{file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, {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]] [[package]]
name = "colorama" name = "colorama"
version = "0.4.6" version = "0.4.6"
@ -326,6 +341,27 @@ files = [
anyio = ">=3.0.0,<5.0.0" anyio = ">=3.0.0,<5.0.0"
pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.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]] [[package]]
name = "faststream" name = "faststream"
version = "0.5.34" version = "0.5.34"
@ -1476,6 +1512,24 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
pymysql = ["pymysql"] pymysql = ["pymysql"]
sqlcipher = ["sqlcipher3_binary"] 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]] [[package]]
name = "tgcrypto" name = "tgcrypto"
version = "1.2.5" version = "1.2.5"
@ -1606,6 +1660,25 @@ h2 = ["h2 (>=4,<5)"]
socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
zstd = ["zstandard (>=0.18.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]] [[package]]
name = "yarl" name = "yarl"
version = "1.18.3" version = "1.18.3"
@ -1706,4 +1779,4 @@ propcache = ">=0.2.0"
[metadata] [metadata]
lock-version = "2.1" lock-version = "2.1"
python-versions = ">=3.11, <4.0" python-versions = ">=3.11, <4.0"
content-hash = "65b93102052fc6bdc2add0c17d35a9b9d32f43265ea51509de7ef1dc24bd1123" content-hash = "5bab4bdc2e631ffb0f11392a8a17d57db510005d49e23d7b3366138c79f1838d"

View File

@ -19,7 +19,9 @@ dependencies = [
"faststream[rabbitmq] (>=0.5.34,<0.6.0)", "faststream[rabbitmq] (>=0.5.34,<0.6.0)",
"asyncpg (>=0.30.0,<0.31.0)", "asyncpg (>=0.30.0,<0.31.0)",
"aio-pika (>=9.5.4,<10.0.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)"
] ]

View File

@ -1,11 +1,15 @@
from asyncio import FastChildWatcher from fastapi import FastAPI
from faststream.rabbit import RabbitBroker, RabbitExchange, ExchangeType, QueueType, RabbitQueue from faststream.rabbit import RabbitBroker, RabbitExchange, ExchangeType, QueueType, RabbitQueue
from faststream.rabbit.fastapi import RabbitRouter, Logger
from src.core.settings.base import settings from src.core.settings.base import settings
rabbitmq_router = RabbitRouter(
url=settings.RABBIT.URL,
)
broker = RabbitBroker( broker = RabbitBroker(
url=settings.RABBIT.URL url=settings.RABBIT.URL,
) )
@ -34,8 +38,8 @@ success_gemini_subscriber = broker.subscriber(
) )
@rabbitmq_router.after_startup
async def init_queue_and_publisher(): async def init_queue_and_publisher(app: FastAPI):
await broker.declare_exchange(base_exchange) await broker.declare_exchange(base_exchange)
await broker.declare_queue(base_queue) await broker.declare_queue(base_queue)
await broker.declare_queue(success_queue) await broker.declare_queue(success_queue)

View File

@ -1,27 +1,51 @@
from contextlib import asynccontextmanager
from fastapi import FastAPI
from pyrogram import Client, filters, idle from pyrogram import Client, filters, idle
from pyrogram.handlers import MessageHandler from pyrogram.handlers import MessageHandler
from src.core.settings.base import settings from src.core.settings.base import settings
from src.core.tg_service.messages_handler import message_listener 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
# Инициализация Pyrogram клиента
app = Client( tg_client = Client(
name=settings.ACCOUNT.NAME, name=settings.ACCOUNT.NAME,
api_id=settings.ACCOUNT.API_ID, api_id=settings.ACCOUNT.API_ID,
api_hash=settings.ACCOUNT.API_HASH, 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, callback=message_listener,
filters=filters.all filters=filters.all
)) ))
async def main(): if __name__ == "__main__":
await app.start() # Запуск FastAPI и Pyrogram в одном event loop
await broker.start() config = uvicorn.Config(
await init_queue_and_publisher() fastapi_app,
await idle() host="0.0.0.0",
await app.stop() port=8000,
loop="asyncio"
app.run(main()) )
server = uvicorn.Server(config)
asyncio.run(server.serve())