It's version 0.5
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
def register(dp, state, bot):
|
||||
from . import handlers
|
||||
|
||||
handlers.register_handlers(dp, state, bot)
|
||||
|
||||
|
||||
def unregister(dp):
|
||||
# Здесь можно удалить хендлеры, если нужно
|
||||
dp.message_handlers.handlers.clear()
|
||||
@@ -0,0 +1,73 @@
|
||||
import requests
|
||||
from random import randint, choice
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
BASE_URL = "https://rule34.xxx"
|
||||
HEADERS = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
|
||||
}
|
||||
URL = f"{BASE_URL}/index.php?page=post&s=list"
|
||||
MAXIMUM = 999
|
||||
|
||||
# Хранилище тегов в памяти
|
||||
TAGS = set()
|
||||
|
||||
def add_tags(tags: list[str]):
|
||||
TAGS.update(tags)
|
||||
|
||||
def del_tags(tags: list[str]):
|
||||
for t in tags:
|
||||
TAGS.discard(t)
|
||||
|
||||
def get_tags_str() -> str:
|
||||
return "+".join(TAGS) if TAGS else "(нет тегов)"
|
||||
|
||||
def get_tags() -> str:
|
||||
return "+".join(TAGS) if TAGS else ""
|
||||
|
||||
def get_url():
|
||||
while True:
|
||||
try:
|
||||
tags = get_tags()
|
||||
pid = randint(1, MAXIMUM)
|
||||
|
||||
# Формируем корректный URL с query‑параметрами
|
||||
if tags:
|
||||
url_page = f"{URL}&tags={tags}&pid={pid}"
|
||||
else:
|
||||
url_page = f"{URL}&pid={pid}"
|
||||
|
||||
r = requests.get(url_page, headers=HEADERS, timeout=5)
|
||||
soup = BeautifulSoup(r.text, 'lxml')
|
||||
block = soup.find(class_="image-list")
|
||||
if not block:
|
||||
continue
|
||||
block = block.find_all("span")
|
||||
if not block:
|
||||
continue
|
||||
|
||||
link = choice(block).find("a")
|
||||
if not link:
|
||||
continue
|
||||
|
||||
r2 = requests.get(f"{BASE_URL}{link.get('href')}", headers=HEADERS, timeout=10)
|
||||
soup_two = BeautifulSoup(r2.text, 'lxml')
|
||||
|
||||
flexi = soup_two.find(class_="flexi")
|
||||
if not flexi:
|
||||
continue
|
||||
|
||||
img = flexi.find("img")
|
||||
if not img:
|
||||
continue
|
||||
|
||||
url = img.get("src")
|
||||
if not url:
|
||||
continue
|
||||
|
||||
return url
|
||||
|
||||
except Exception as e:
|
||||
print(f"[get_url ERROR] {e}")
|
||||
continue
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
from aiogram import Dispatcher, Bot
|
||||
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, InputMediaPhoto, Message, CallbackQuery
|
||||
from aiogram.filters import Command
|
||||
from aiogram.exceptions import TelegramBadRequest, TelegramRetryAfter
|
||||
from aiogram import F
|
||||
from logging import getLogger
|
||||
from storage.message_storage import save_message
|
||||
from .get_post import get_url, add_tags, del_tags, get_tags_str
|
||||
import asyncio
|
||||
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
|
||||
def get_keyboard():
|
||||
keyboard = InlineKeyboardMarkup(
|
||||
inline_keyboard=[
|
||||
[InlineKeyboardButton(text="Следующее фото", callback_data="next")]
|
||||
]
|
||||
)
|
||||
return keyboard
|
||||
|
||||
|
||||
def register_handlers(dp: Dispatcher, state, bot: Bot):
|
||||
|
||||
@dp.message(Command("rule34"))
|
||||
async def rule34(message: Message):
|
||||
msg = await message.answer_photo(
|
||||
photo=get_url(),
|
||||
caption="Вот фото 📷",
|
||||
reply_markup=get_keyboard()
|
||||
)
|
||||
|
||||
# сохраняем id сообщения, если нужно
|
||||
save_message(msg.chat.id, msg.message_id)
|
||||
|
||||
@dp.callback_query(F.data == "next")
|
||||
async def next_photo(callback: CallbackQuery):
|
||||
for attempt in range(3): # максимум 3 попытки
|
||||
try:
|
||||
media = InputMediaPhoto(
|
||||
media=get_url(),
|
||||
caption=f"Новое фото 🌄 (попытка {attempt + 1})"
|
||||
)
|
||||
await callback.message.edit_media(
|
||||
media=media,
|
||||
reply_markup=get_keyboard()
|
||||
)
|
||||
break # успех — выходим из цикла
|
||||
|
||||
except TelegramRetryAfter as e:
|
||||
# Telegram сказал подождать e.retry_after секунд
|
||||
logger.warning(f"Flood control: ждем {e.retry_after} сек")
|
||||
await asyncio.sleep(e.retry_after)
|
||||
continue # пробуем снова
|
||||
|
||||
except TelegramBadRequest as e:
|
||||
logger.warning(f"Ошибка при загрузке фото (попытка {attempt + 1}): {e}")
|
||||
continue
|
||||
|
||||
else:
|
||||
# если все попытки неудачные
|
||||
logger.error("Не удалось загрузить фото после 3 попыток")
|
||||
|
||||
# закрываем "часики" в любом случае
|
||||
await callback.answer()
|
||||
|
||||
@dp.message(Command("addteg"))
|
||||
async def cmd_addteg(message: Message):
|
||||
# Разбиваем текст после команды на теги
|
||||
parts = message.text.split()[1:]
|
||||
if not parts:
|
||||
await message.answer("❌ Укажи теги через пробел: /addteg tag1 tag2")
|
||||
return
|
||||
add_tags(parts)
|
||||
await message.answer(f"✅ Добавлены теги: {', '.join(parts)}\nТекущие: {get_tags_str()}")
|
||||
|
||||
@dp.message(Command("delteg"))
|
||||
async def cmd_delteg(message: Message):
|
||||
parts = message.text.split()[1:]
|
||||
if not parts:
|
||||
await message.answer("❌ Укажи теги для удаления: /delteg tag1 tag2")
|
||||
return
|
||||
del_tags(parts)
|
||||
await message.answer(f"🗑 Удалены теги: {', '.join(parts)}\nТекущие: {get_tags_str()}")
|
||||
Reference in New Issue
Block a user