
14.04.2024, 15:39
|
|
Новичок
Регистрация: 13.01.2024
Сообщений: 15
С нами:
1229791
Репутация:
1
|
|
Сообщение от nelit.dev
жду код твоего парсера. ты должен не искать в тупую нужный класс на странице, а идти искать родителей и в них дочерние классы, начиная от боди заканчивая классом контейнера с видео. посмотри внимательно на то, что именно тебе возвращается при получении кода страницы.
import asyncio
from aiogram import Bot, types
from aiogram import Dispatcher
from aiogram.types import CallbackQuery
from aiogram.utils import executor
import aiohttp
from bs4 import BeautifulSoup
# Токен вашего бота
TOKEN = 'ТОКЕН
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
# Функция для парсинга информации о видео с канала
async def parse_channel(channel_url):
async with aiohttp.ClientSession() as session:
async with session.get(channel_url) as response:
html = await response.text()
soup = BeautifulSoup(html, 'html.parser')
videos = []
# Находим все сообщения в канале
for post in soup.find_all('div', class_='style-scope ytd-rich-grid-media'):
# Находим текст сообщения (название видео)
text = post.find('a', class_='yt-simple-endpoint style-scope ytd-rich-grid-video-renderer').text.strip()
# Находим дату публикации
date = post.find('span', class_='style-scope ytd-video-meta-block').text.strip()
# Находим количество просмотров
views = post.find('span', class_='style-scope ytd-video-meta-block').text.strip()
# Сохраняем информацию о видео
video_info = {'text': text, 'date': date, 'views': views}
print("Parsed video:", video_info) # Отладочное сообщение
videos.append(video_info)
return videos
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def start_message(message: types.Message):
await message.answer("Привет! Пожалуйста, отправь мне ссылку на канал, чтобы получить видео.")
# Обработчик текстовых сообщений (получаем ссылку на канал и отправляем видео)
@dp.message_handler(content_types=['text'])
async def get_channel_videos(message: types.Message):
channel_url = message.text
try:
videos = await parse_channel(channel_url)
print("Received videos:", videos) # Добавим отладочное сообщение
# Создаем inline клавиатуру с кнопками для каждого видео
keyboard = types.InlineKeyboardMarkup()
for video in videos:
# Добавляем кнопку для каждого видео
keyboard.add(types.InlineKeyboardButton(text=video['text'], callback_data=video['text']))
await message.answer("Выбери видео:", reply_markup=keyboard)
except Exception as e:
await message.answer(f"Произошла ошибка: {str(e)}")
# Обработчик нажатий на inline кнопки
@dp.callback_query_handler()
async def callback_query(call: CallbackQuery):
try:
videos = await parse_channel(call.message.text)
for video in videos:
# Проверяем, на какую кнопку нажал пользователь
if call.data == video['text']:
# Отправляем изображение, название, дату и количество просмотров
await bot.send_photo(call.message.chat.id, photo=video['image'], caption=f"{video['text']}\nДата: {video['date']}\nПросмотры: {video['views']}")
break
except Exception as e:
await call.message.answer(f"Произошла ошибка: {str(e)}")
# Запускаем бота
if name == 'main':
executor.start_polling(dp)
|
|
|