СВО ЕБАТЬ #7
2 changed files with 73 additions and 1 deletions
19
main.py
19
main.py
|
|
@ -17,6 +17,7 @@ from aiogram.client.default import DefaultBotProperties
|
|||
from PIL import Image, ImageDraw, ImageFont
|
||||
from datetime import datetime, time, timedelta
|
||||
from zoneinfo import ZoneInfo
|
||||
from zparser import get_military_data
|
||||
|
||||
# Базовые пути/настройки проекта.
|
||||
BASE_DIR = Path(__file__).parent
|
||||
|
|
@ -692,6 +693,20 @@ async def handle_zvetok(message: Message):
|
|||
await message.answer(result)
|
||||
|
||||
|
||||
async def handle_svodka(message: Message):
|
||||
channel = "creamy_caprice"
|
||||
data = get_military_data(channel, depth=5)
|
||||
|
||||
if data["status"] == "success":
|
||||
response = (
|
||||
f"в период с {data['dates']} хохлы в среднем проебывали по {data['pace']} км² в сутки, "
|
||||
f"а за день ВС РФ лишала чубатых в среднем по {data['total']} км²"
|
||||
)
|
||||
await message.answer(response)
|
||||
else:
|
||||
await message.answer(f"Хохлы ответят за это...: {data['message']}")
|
||||
|
||||
|
||||
def main():
|
||||
# Точка входа: создаём бота, регистрируем команды и запускаем polling.
|
||||
token = os.getenv("BOT_TOKEN")
|
||||
|
|
@ -718,6 +733,8 @@ def main():
|
|||
BotCommand(command="fetch", description="цены (новый источник)"),
|
||||
BotCommand(command="zvetok", description="Цветянский бля"),
|
||||
BotCommand(command="talk", description="Побазарить"),
|
||||
BotCommand(command="svodka", description="СВО: итоги"),
|
||||
|
||||
]
|
||||
)
|
||||
except Exception: # noqa: WPS440
|
||||
|
|
@ -737,7 +754,7 @@ def main():
|
|||
dp.message.register(handle_fetch, Command("fetch"))
|
||||
dp.message.register(handle_zvetok, Command("zvetok"))
|
||||
dp.message.register(handle_talk, Command("talk"))
|
||||
|
||||
dp.message.register(handle_svodka, Command("svodka"))
|
||||
|
||||
|
||||
async def handle_gen_mem_cmd(message: Message, bot: Bot):
|
||||
|
|
|
|||
55
zparser.py
Normal file
55
zparser.py
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
import re
|
||||
import time
|
||||
|
||||
def get_military_data(channel_username, depth=5):
|
||||
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'}
|
||||
last_id = None
|
||||
|
||||
for i in range(depth):
|
||||
url = f"https://t.me/s/{channel_username}"
|
||||
if last_id:
|
||||
url += f"?before={last_id}"
|
||||
|
||||
try:
|
||||
response = requests.get(url, headers=headers, timeout=10)
|
||||
soup = BeautifulSoup(response.text, 'html.parser')
|
||||
messages = soup.find_all('div', class_='tgme_widget_message')
|
||||
|
||||
if not messages:
|
||||
break
|
||||
|
||||
first_msg_data = messages[0].get('data-post')
|
||||
if first_msg_data:
|
||||
last_id = first_msg_data.split('/')[-1]
|
||||
|
||||
for msg in reversed(messages):
|
||||
text_elem = msg.find('div', class_='tgme_widget_message_text')
|
||||
if not text_elem:
|
||||
continue
|
||||
|
||||
text = " ".join(text_elem.get_text(separator=' ').split())
|
||||
text_lower = text.lower()
|
||||
|
||||
if "темп" in text_lower and "продвижения" in text_lower:
|
||||
# Улучшенная регулярка для дат (ловит и "с 14 по 17", и "с 14 февраля по 17 февраля")
|
||||
dates_match = re.search(r"с (.*?)(?=\.|\s+темп)", text_lower)
|
||||
# Твои регулярки для цифр — отличные
|
||||
pace_match = re.search(r"темп[^+-]*([+-]\d+[.,]\d+)", text_lower)
|
||||
total_match = re.search(r"общее продвижение\s*(\d+[.,]\d+)", text_lower)
|
||||
|
||||
if pace_match:
|
||||
return {
|
||||
"status": "success",
|
||||
"dates": dates_match.group(1).strip() if dates_match else "не указаны",
|
||||
"pace": pace_match.group(1).replace(',', '.'),
|
||||
"total": total_match.group(1).replace(',', '.') if total_match else "0",
|
||||
"post_id": msg.get('data-post').split('/')[-1]
|
||||
}
|
||||
time.sleep(1)
|
||||
except Exception as e:
|
||||
print(f"Ошибка на итерации {i}: {e}")
|
||||
continue
|
||||
|
||||
return {"status": "error", "message": "Сводка не найдена в последних постах"}
|
||||
Loading…
Reference in a new issue