Сценарий Python, возвращающий сообщения в реальном времени на YouTube с API YouTube, через некоторое время возвращает странные ошибки KeyError и NoneType - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь создать сценарий python, который отображает чат в реальном времени через командную строку. Я нашел комментарий пользователя: 10914284 в вопросе Не могу получить живой чат из потока, который мне не принадлежит , и я немного изменил его ответ. Эта программа работает немного, но через некоторое время выдает два типа ошибок. Он может отображать чат в прямом эфире в течение некоторого времени, после чего выдает KeyError:

Traceback (most recent call last):
  File "get_chat.py", line 58, in <module>
    print_message()
  File "get_chat.py", line 54, in print_message
    for i in range(len(messages['items'])):
KeyError: 'items'

Странно, если я пытаюсь запустить программу несколько раз, он вызывает ошибку TypeError, даже если пару минут go скрипт работал отлично.

Traceback (most recent call last):
  File "get_chat.py", line 22, in <module>
    vID = r.get('items')[0]['id']['videoId']
TypeError: 'NoneType' object is not subscriptable

Код:

import requests
import json

API_KEY = 'YOUTUBE_API_KEY_HERE'
channelID = 'UC9pYOJPB5UYlMlGKKZWo-Bw' # Random youtube channel that is currently broadcasting a youtube livestream

params = {
        'part': 'id',
        'key': API_KEY,
        'channelId': channelID,
        'eventType': 'live',
        'type': 'video',
        'order': 'viewCount',
        'fields': 'items(id(videoId))'
        }

url = 'https://www.googleapis.com/youtube/v3/search'
r = requests.get(url, headers=None, params=params).json()

vID = r.get('items')[0].get('id').get('videoId')
#vID = r.get('items')[0]['id']['videoId'] returns same KeyError

params = {
        'part': 'liveStreamingDetails,statistics,snippet',
        'key': API_KEY,
        'id': vID,
        'fields': 'items(id,liveStreamingDetails(activeLiveChatId,concurrentViewers,actualStartTime),' + \
                  'snippet(channelId,channelTitle,description,liveBroadcastContent,publishedAt,thumbnails,title),statistics)'
        }

url = 'https://www.googleapis.com/youtube/v3/videos'
r = requests.get(url, headers=None, params=params).json()

streamData = dict(r.get('items')[0])

chatID = streamData['liveStreamingDetails']['activeLiveChatId']

params = {
        'part': 'snippet',
        'key': API_KEY,
        'liveChatId': chatID,
        #'profileImageSize': 720,
        'maxResults': 200
        }

url = 'https://www.googleapis.com/youtube/v3/liveChat/messages'

def print_message():
        while True:
                messages = requests.get(url, headers=None, params=params).json()
                for i in range(len(messages['items'])):
                        print(messages['items'][i]['snippet']['displayMessage'])


print_message()

У меня есть несколько гипотез, почему это может происходить. Для KeyError, возможно, при наличии более 200 сообщений ('maxResults': 200) возникает ошибка. Я попытался изменить значение ''maxResults' на что-то вроде 2000, но ошибка все еще появляется. Ошибка TypeError появляется только в том случае, если вы пытаетесь запустить скрипт несколько раз и через некоторое время выдает эту ошибку. Я думаю, что это может произойти, потому что я запрашиваю, и сообщения перекрываются? И как-то это вне диапазона? Другая возможность состоит в том, что я использовал все свои квоты Google за день, и API не вернет мне ничего.

Любая помощь будет принята с благодарностью. Большое спасибо.

1 Ответ

0 голосов
/ 30 марта 2020

Проще говоря, сначала проверяю ключ

if __name__ == "__main__":

    response = get_liveChatId()
    items = response["items"]
    for item in items:
        if "liveChatId" in item['snippet']:
            print(item['snippet']['liveChatId']) #Get the liveChatId
        else:
            pass
...