Парсер ютуб канала телеграм. Помощь.

вареник с мясом?

Новичок
Автор темы
12
0
Хочу сделать парсер ютуб канала в телеграм, который при отправке ссылки выдает все названия видео в виде inline кгопоа, по нажатию по которой будет отправлена информация о видео: название, жата выхода, количество просмотров. Можно будет скачать видел.

При отправке ссылки бот отправляет кнопку, но без названия видео на кнопках. Кто знает, что сделать?
 
  • Клоун
Реакции: Fott

вареник с мясом?

Новичок
Автор темы
12
0
жду код твоего парсера. ты должен не искать в тупую нужный класс на странице, а идти искать родителей и в них дочерние классы, начиная от боди заканчивая классом контейнера с видео. посмотри внимательно на то, что именно тебе возвращается при получении кода страницы.

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)
 

nelit.dev

Участник
45
20
Как просто текст?
А что не так сейчас?
табуляции
Screenshot_2024-04-15-10-32-05-122_com.android.chrome-edit.jpg
 

вареник с мясом?

Новичок
Автор темы
12
0
Python:
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)
 

Vintik

Мечтатель
Проверенный
1,470
920
Python, да?
Для работы с Youtube-ом можно использовать библиотеки для парсинга/http запросов.
Это может быть requeses, selenium. Загугли.
Основная идея заключается в том, что по ссылке парсер будет заходить на страницу, искать видео (как это делается — посмотри гайды по работе с библиотеками, там на 5-10 видосиков много есть в ютубе, нет смысла заново рассказывать), а дальше чтобы это выводилось в телеграм.
Со второй частью не помогу, TG API никогда вживую не видел.
 

вареник с мясом?

Новичок
Автор темы
12
0
Python, да?
Для работы с Youtube-ом можно использовать библиотеки для парсинга/http запросов.
Это может быть requeses, selenium. Загугли.
Основная идея заключается в том, что по ссылке парсер будет заходить на страницу, искать видео (как это делается — посмотри гайды по работе с библиотеками, там на 5-10 видосиков много есть в ютубе, нет смысла заново рассказывать), а дальше чтобы это выводилось в телеграм.
Со второй частью не помогу, TG API никогда вживую не видел.
bs4 аналогичная библиотека же или лучше селениум?