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"},
]
[[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"

View File

@ -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)"
]

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.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)

View File

@ -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())
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())