FreshPixels commited on
Commit
63c9475
·
verified ·
1 Parent(s): ff004af

Delete bot.py

Browse files
Files changed (1) hide show
  1. bot.py +0 -235
bot.py DELETED
@@ -1,235 +0,0 @@
1
- import asyncio
2
- import logging
3
- import os
4
- import ssl
5
- import sys
6
-
7
- import aiohttp
8
- import certifi
9
- from aiohttp import web
10
- from aiogram import Bot, Dispatcher
11
- from aiogram.enums import ParseMode
12
- from aiogram.client.default import DefaultBotProperties
13
- from aiogram.webhook.aiohttp_server import SimpleRequestHandler, setup_application
14
-
15
- from config import config
16
- from database import db
17
- from handlers import commands_router, chat_router
18
- from middlewares import OwnerMiddleware
19
-
20
-
21
- # ═══════════════════════════════════════════════════════════════════
22
- # BLOCK 0: SSL-патчи для HF Spaces (certifi + proxy)
23
- # ═══════════════════════════════════════════════════════════════════
24
- # HF Spaces не имеет системных CA-сертификатов.
25
- # Патчи применяются как side-effect при импорте.
26
- # ═══════════════════════════════════════════════════════════════════
27
-
28
- custom_ssl = ssl.create_default_context(cafile=certifi.where())
29
- custom_ssl.check_hostname = True
30
- custom_ssl.verify_mode = ssl.CERT_REQUIRED
31
-
32
- _orig_tcp_init = aiohttp.TCPConnector.__init__
33
-
34
-
35
- def _patched_tcp_init(self, *args, **kwargs):
36
- if kwargs.get("ssl") is not False:
37
- kwargs["ssl"] = custom_ssl
38
- _orig_tcp_init(self, *args, **kwargs)
39
-
40
-
41
- aiohttp.TCPConnector.__init__ = _patched_tcp_init
42
-
43
- _orig_session_init = aiohttp.ClientSession.__init__
44
-
45
-
46
- def _patched_session_init(self, *args, **kwargs):
47
- kwargs["trust_env"] = True
48
- _orig_session_init(self, *args, **kwargs)
49
-
50
-
51
- aiohttp.ClientSession.__init__ = _patched_session_init
52
-
53
- _orig_request = aiohttp.ClientSession._request
54
-
55
-
56
- async def _patched_request(self, method, url, *args, **kwargs):
57
- proxy_server = os.getenv("TELEGRAM_API_SERVER")
58
- if proxy_server and "api.telegram.org" in str(url):
59
- proxy_server = proxy_server.strip().rstrip("/")
60
- str_url = str(url).replace("https://api.telegram.org", proxy_server)
61
- logging.info("🔀 Переадресация aiogram через прокси ➡️ %s", str_url)
62
- url = str_url
63
- return await _orig_request(self, method, url, *args, **kwargs)
64
-
65
-
66
- aiohttp.ClientSession._request = _patched_request
67
-
68
-
69
- # ═══════════════════════════════════════════════════════════════════
70
- # BLOCK 1: Логирование
71
- # ═══════════════════════════════════════════════════════════════════
72
-
73
- def setup_logging() -> None:
74
- logging.basicConfig(
75
- level=logging.INFO,
76
- format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
77
- stream=sys.stdout,
78
- )
79
-
80
-
81
- # ═══════════════════════════════════════════════════════════════════
82
- # BLOCK 2: Инициализация бота и диспетчера
83
- # ═══════════════════════════════════════════════════════════════════
84
-
85
- bot = Bot(
86
- token=config.BOT_TOKEN,
87
- default=DefaultBotProperties(parse_mode=ParseMode.HTML)
88
- )
89
- dp = Dispatcher()
90
- dp.message.middleware(OwnerMiddleware())
91
- @dp.update.middleware()
92
- async def log_updates(handler, event, data):
93
- logger = logging.getLogger(__name__)
94
- logger.info("→ Update received: %s", event.update_id if hasattr(event, 'update_id') else 'N/A')
95
- try:
96
- return await handler(event, data)
97
- except Exception as e:
98
- logger.error("Update failed: %s", e, exc_info=True)
99
- raise
100
- dp.include_router(commands_router)
101
- dp.include_router(chat_router)
102
-
103
-
104
- # ═══════════════════════════════════════════════════════════════════
105
- # BLOCK 3: HTTP Handlers
106
- # ═══════════════════════════════════════════════════════════════════
107
-
108
- @web.middleware
109
- async def hf_logging_middleware(request, handler):
110
- return await handler(request)
111
-
112
-
113
- async def health_check(request: web.Request) -> web.Response:
114
- """HF Spaces Health Check — обязательно отвечать 200 на '/'."""
115
- return web.Response(text="🚀 GLM Bot РАБОТАЕТ!")
116
-
117
-
118
- # ═══════════════════════════════════════════════════════════════════
119
- # BLOCK 4: Lifecycle hooks
120
- # ═══════════════════════════════════════════════════════════════════
121
-
122
- async def on_startup(app: web.Application) -> None:
123
- logger = logging.getLogger(__name__)
124
- await db.connect()
125
- logger.info("Database connected")
126
-
127
- space_host = os.getenv("SPACE_HOST", "")
128
- if space_host:
129
- full_webhook_link = f"https://{space_host.strip()}{config.WEBHOOK_PATH}"
130
- for attempt in range(5):
131
- try:
132
- await bot.set_webhook(
133
- url=full_webhook_link,
134
- drop_pending_updates=True,
135
- request_timeout=30,
136
- )
137
- logger.info("✅ Webhook установлен: %s", full_webhook_link)
138
- break
139
- except Exception as e:
140
- logger.warning(
141
- "⚠️ Попытка %d/5 установки webhook: %s", attempt + 1, e
142
- )
143
- await asyncio.sleep(5)
144
- else:
145
- logger.warning("⚠️ SPACE_HOST не задан, webhook не установлен!")
146
-
147
-
148
- async def on_shutdown(app: web.Application) -> None:
149
- logger = logging.getLogger(__name__)
150
- logger.info("🛑 Shutdown начат...")
151
-
152
- try:
153
- await bot.delete_webhook(drop_pending_updates=True)
154
- logger.info("Webhook удалён")
155
- except Exception as e:
156
- logger.warning("Ошибка при удалении webhook: %s", e)
157
-
158
- try:
159
- await dp.storage.close()
160
- await bot.session.close()
161
- logger.info("Bot session закрыт")
162
- except Exception as e:
163
- logger.warning("Ошибка при закрытии сессии бота: %s", e)
164
-
165
- try:
166
- await db.disconnect()
167
- logger.info("Database disconnected")
168
- except Exception as e:
169
- logger.warning("Ошибка при отключении БД: %s", e)
170
-
171
-
172
- # ═══════════════════════════════════════════════════════════════════
173
- # BLOCK 5: Main
174
- # ═══════════════════════════════════════════════════════════════════
175
- async def debug_on_startup(app: web.Application) -> None:
176
- logger = logging.getLogger(__name__)
177
- me = await bot.get_me()
178
-
179
- logger.info(
180
- "🤖 RUNNING BOT: @%s | ID=%s",
181
- me.username,
182
- me.id
183
- )
184
- # Логируем все env vars (без секретов)
185
- logger.info("SPACE_HOST=%s", os.getenv("SPACE_HOST", "NOT SET"))
186
- logger.info("PORT=%s", os.getenv("PORT", "NOT SET"))
187
- logger.info("WEBHOOK_PATH=%s", config.WEBHOOK_PATH)
188
-
189
- await db.connect()
190
-
191
- space_host = os.getenv("SPACE_HOST", "")
192
- if not space_host:
193
- logger.error("CRITICAL: SPACE_HOST is empty! Webhook cannot be set.")
194
- return
195
-
196
- full_webhook_link = f"https://{space_host.strip()}{config.WEBHOOK_PATH}"
197
- logger.info("Setting webhook to: %s", full_webhook_link)
198
-
199
- for attempt in range(5):
200
- try:
201
- result = await bot.set_webhook(
202
- url=full_webhook_link,
203
- drop_pending_updates=True,
204
- request_timeout=30,
205
- )
206
- logger.info("Webhook set result: %s", result)
207
- break
208
- except Exception as e:
209
- logger.error("Webhook attempt %d failed: %s", attempt + 1, e)
210
- await asyncio.sleep(5)
211
-
212
- def main() -> None:
213
- setup_logging()
214
- logger = logging.getLogger(__name__)
215
- logger.info("Starting HF Spaces bot...")
216
-
217
- app = web.Application(middlewares=[hf_logging_middleware])
218
- app.router.add_get("/", health_check)
219
-
220
- webhook_requests_handler = SimpleRequestHandler(dispatcher=dp, bot=bot)
221
- webhook_requests_handler.register(app, path=config.WEBHOOK_PATH)
222
- setup_application(app, dp, bot=bot)
223
-
224
- app.on_startup.append(on_startup)
225
- app.on_shutdown.append(on_shutdown)
226
-
227
- # HF Spaces требует: host='0.0.0.0', port=7860
228
- port = int(os.environ.get("PORT", 7860))
229
- logger.info("🚀 Запуск сервера на %s:%d...", "0.0.0.0", port)
230
- web.run_app(app, host="0.0.0.0", port=port)
231
-
232
-
233
- if __name__ == "__main__":
234
- main()
235
-