forked from zovos/bot_tg
Merge pull request 'СВО ЕБАТЬ' (#7) from jeffrey228/bot_tg:main into main
Reviewed-on: zovos/bot_tg#7
This commit is contained in:
commit
8ea9c50564
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 PIL import Image, ImageDraw, ImageFont
|
||||||
from datetime import datetime, time, timedelta
|
from datetime import datetime, time, timedelta
|
||||||
from zoneinfo import ZoneInfo
|
from zoneinfo import ZoneInfo
|
||||||
|
from zparser import get_military_data
|
||||||
|
|
||||||
# Базовые пути/настройки проекта.
|
# Базовые пути/настройки проекта.
|
||||||
BASE_DIR = Path(__file__).parent
|
BASE_DIR = Path(__file__).parent
|
||||||
|
|
@ -692,6 +693,20 @@ async def handle_zvetok(message: Message):
|
||||||
await message.answer(result)
|
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():
|
def main():
|
||||||
# Точка входа: создаём бота, регистрируем команды и запускаем polling.
|
# Точка входа: создаём бота, регистрируем команды и запускаем polling.
|
||||||
token = os.getenv("BOT_TOKEN")
|
token = os.getenv("BOT_TOKEN")
|
||||||
|
|
@ -718,6 +733,8 @@ def main():
|
||||||
BotCommand(command="fetch", description="цены (новый источник)"),
|
BotCommand(command="fetch", description="цены (новый источник)"),
|
||||||
BotCommand(command="zvetok", description="Цветянский бля"),
|
BotCommand(command="zvetok", description="Цветянский бля"),
|
||||||
BotCommand(command="talk", description="Побазарить"),
|
BotCommand(command="talk", description="Побазарить"),
|
||||||
|
BotCommand(command="svodka", description="СВО: итоги"),
|
||||||
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
except Exception: # noqa: WPS440
|
except Exception: # noqa: WPS440
|
||||||
|
|
@ -737,7 +754,7 @@ def main():
|
||||||
dp.message.register(handle_fetch, Command("fetch"))
|
dp.message.register(handle_fetch, Command("fetch"))
|
||||||
dp.message.register(handle_zvetok, Command("zvetok"))
|
dp.message.register(handle_zvetok, Command("zvetok"))
|
||||||
dp.message.register(handle_talk, Command("talk"))
|
dp.message.register(handle_talk, Command("talk"))
|
||||||
|
dp.message.register(handle_svodka, Command("svodka"))
|
||||||
|
|
||||||
|
|
||||||
async def handle_gen_mem_cmd(message: Message, bot: Bot):
|
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