Как получить полную запись чата трансляции на youtube?

Появилась необходимость получить полную запись ютубовского чата с трансляции. Как это это можно сделать? Как я понял youtube для подгрузки сообщений использует get-запрос следующего формата:

https://www.youtube.com/live_chat_replay/get_live_chat_replay?
commandMetadata=%5Bobject%20Object%5D
&continuation=op2w0wRpGlBDamdhRFFvTFFsVmtabVZSWTJoR1RrRXFKd29ZVlVOM2NsS....
&playerOffsetMs=2155099
&hidden=false
&pbj=1

Но при его выполнении он отдает лишь часть сообщений (~50), а хотелось бы все.
  • Вопрос задан
  • 6157 просмотров
Пригласить эксперта
Ответы на вопрос 1
@slever
Вдруг, кому-то еще пригодится
import yt_dlp, json, os

VIDEO_ID = 'dQw4w9WgXcQ'
VIDEO_URL = f'https://www.youtube.com/watch?v={VIDEO_ID}'

def download_chat(video_url):
    ydl_opts = {
        'skip_download': True,
        'writeinfojson': True,
        'writethumbnail': True,
        'writesubtitles': True,
        'subtitlesformat': 'json',
        'outtmpl': f'{VIDEO_ID}.json',
    }

    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download([video_url])
        return f"{VIDEO_ID}.json.live_chat.json"

def parse_chat_json(chat_filename):
    if not os.path.exists(chat_filename):
        return []

    messages = []

    with open(chat_filename, 'r', encoding='utf-8') as f:
        for line in f:
            data = json.loads(line)

            try:
                print(data['replayChatItemAction']['actions'][0]['addChatItemAction']['item']['liveChatTextMessageRenderer'])
                author_name = data['replayChatItemAction']['actions'][0]['addChatItemAction']['item']['liveChatTextMessageRenderer']['authorName']['simpleText']
                message_parts = data['replayChatItemAction']['actions'][0]['addChatItemAction']['item']['liveChatTextMessageRenderer']['message']['runs']
                message = ''.join(part.get('text', '') for part in message_parts)
                timestamp = data['replayChatItemAction']['actions'][0]['addChatItemAction']['item']['liveChatTextMessageRenderer']['timestampText']['simpleText']
                messages.append(f"{author_name}: {message} ({timestamp})")
            except KeyError:
                continue

    return messages

def save_chat_to_txt(chat_filename, video_id):
    chat_messages = parse_chat_json(chat_filename)

    output_filename = f'output_{video_id}.txt'
    with open(output_filename, 'w', encoding='utf-8') as out_file:
        for message in chat_messages:
            out_file.write(message + '\n')

def clean_up_files(video_id):
    for ext in ['json.webp', 'json.live_chat.json', 'json.info.json']:
        filename = f"{video_id}.{ext}"
        if os.path.exists(filename):
            os.remove(filename)

if __name__ == '__main__':
    chat_file = download_chat(VIDEO_URL)
    if chat_file:
        save_chat_to_txt(chat_file, VIDEO_ID)
        clean_up_files(VIDEO_ID)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы