使用 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 livechat 消息的 Python 脚本会在一段时间后返回奇怪的 KeyError 和 NoneType 错误
为啥 Youtube/Google API 不返回超过 5 个回复?
YouTube 数据 API 返回“访问未配置”错误,尽管它已启用