使用 youtube API 返回 youtube livechat 消息的 Python 脚本会在一段时间后返回奇怪的 KeyError 和 NoneType 错误

Posted

技术标签:

【中文标题】使用 youtube API 返回 youtube livechat 消息的 Python 脚本会在一段时间后返回奇怪的 KeyError 和 NoneType 错误【英文标题】:Python script returning youtube livechat messages with youtube API returns weird KeyError and NoneType errors after some time 【发布时间】:2020-05-02 19:35:14 【问题描述】:

我正在尝试制作一个通过命令行显示实时流聊天的 python 脚本。我在问题Can't get live chat from stream I do not own 中找到了用户: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,尽管几分钟前脚本运行良好。

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 仅在您尝试多次运行脚本时才会出现,并且在一段时间后,它会引发此错误。我认为这可能会发生,因为我正在请求并且消息重叠?而且不知何故超出了范围?另一种可能性是我当天使用了所有的谷歌配额,API 不会返回任何东西。

任何帮助将不胜感激。非常感谢。

【问题讨论】:

【参考方案1】:

简单地说,我确实先检查密钥

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

【讨论】:

【参考方案2】:

那是因为你已经用完了所有的每日配额。

【讨论】:

请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker.

以上是关于使用 youtube API 返回 youtube livechat 消息的 Python 脚本会在一段时间后返回奇怪的 KeyError 和 NoneType 错误的主要内容,如果未能解决你的问题,请参考以下文章

YouTube 字幕 API 返回不准确的数据

使用 youtube API 返回 youtube livechat 消息的 Python 脚本会在一段时间后返回奇怪的 KeyError 和 NoneType 错误

为啥 Youtube/Google API 不返回超过 5 个回复?

YouTube 数据 API 返回“访问未配置”错误,尽管它已启用

YouTube 数据 API 不再从 search.list 返回活跃的直播流

Youtube 搜索 API 不返回 sd/max 分辨率缩略图