google-api - 我不明白 playlistItems.list() 的响应
问题描述
所以......我试图在我的 youtube 频道的上传播放列表上执行 playlistItems.list() 。它包含 4 个公开视频和 1 个不公开视频。我将函数的输出发送到终端输出。
它首先向我展示了这一点,
{'totalResults': 4, 'resultsPerPage': 5}
然后它向我展示了这个,(据我了解)是 3 个结果。
[{'kind': 'youtube#playlistItem', 'etag':'"Dn5xIderbhAnUk5TAW0qkFFir0M/kbeAdMJuuMJKybAoShHt15UMefc"', 'id': 'VVV2aFJQcHFQSDBiMmRNT2E5bVp5MlVRLlRJc2QwTHJfN1Fr', 'contentDetails': {'videoId': 'TIsd0Lr_7Qk', 'videoPublishedAt': '2018-11-21T08:43:00.000Z'}},
{'kind': 'youtube#playlistItem', 'etag': '"Dn5xIderbhAnUk5TAW0qkFFir0M/wxIHQJwj6qBP1-axGt0aWmRpo6Y"', 'id': 'VVV2aFJQcHFQSDBiMmRNT2E5bVp5MlVRLjJHSm5ZbGJwZmRB', 'contentDetails': {'videoId': '2GJnYlbpfdA', 'videoPublishedAt': '2017-11-06T11:47:47.000Z'}},
{'kind': 'youtube#playlistItem', 'etag': '"Dn5xIderbhAnUk5TAW0qkFFir0M/pc9Jwgp5y3BrdjT85I6MOdggEpo"', 'id': 'VVV2aFJQcHFQSDBiMmRNT2E5bVp5MlVRLlBvMkhsVXVfNE1n', 'contentDetails': {'videoId': 'Po2HlUu_4Mg', 'videoPublishedAt': '2017-10-01T09:03:53.000Z'}}]
缺少的视频是未列出的(我不知道它是否输出此视频)和最近的公开视频。两个视频都在终端列出的视频之后发布/上传
如果需要,播放列表 ID 是 UUvhRPpqPH0b2dMOa9mZy2UQ。
这是代码
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
import os
import pygame
CLIENT_SECRET_FILE = 'client_secret.json'
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES)
credentials = flow.run_console()
auth = build('youtube', 'v3', credentials=credentials)
api_key = "..."
oldId = "TIsd0Lr_7Qk"
chId = 'UCvhRPpqPH0b2dMOa9mZy2UQ'
youtube = build('youtube', 'v3', developerKey=api_key)
def insert_comment(auth, channel_id, video_id, text):
insert_result = auth.commentThreads().insert(
part="snippet",
body=dict(
snippet=dict(
channelId=channel_id,
videoId=video_id,
topLevelComment=dict(
snippet=dict(
textOriginal=text
)
)
)
)
).execute()
comment = insert_result["snippet"]["topLevelComment"]
author = comment["snippet"]["authorDisplayName"]
text = comment["snippet"]["textDisplay"]
print("Inserted comment for %s: %s" % (author, text))
def get_channel_videos(channel_id):
res = youtube.channels().list(id=channel_id,part='contentDetails').execute()
playlist_id = res['items'][0]['contentDetails']['relatedPlaylists']['uploads']
print(playlist_id)
res = youtube.playlistItems().list(playlistId = playlist_id,part ='contentDetails', maxResults = 5).execute()
for item in res:
print(res[item])
newId = res['items'][0]['contentDetails']['videoId']
return newId
while True:
newId = get_channel_videos(chId)
print(newId)
if newId != oldId:
break
print("exit")
insert_comment(auth, chId, newId, "First!")
解决方案
推荐阅读
- html - 有没有办法防止使用 step 属性验证输入字段?
- makefile - Makefile 非递归方法问题
- javascript - 如果序列中的一个 Promise 抛出错误,则按顺序解析 Promise 并中断该序列
- qt - 我们如何在 Qt 项目中创建子目录?
- c# - 带参数的异步方法崩溃 C#
- r - 是否有一个 R 函数可以为 x 产品和它们的 y 长度组合创建交叉销售矩阵?
- cobol - COBOL 中的 IGZ0201W 和 IGZ0035S 错误
- php - 使用二维数组的清晰度是否值得搜索所需的额外计算时间?
- socket.io - engine.io [RangeError: 超出最大调用堆栈大小]
- ios - iOS:来自 iOS14 EXC_BAD_ACCESS 线程队列的随机错误消息:NSManagedObjectContext NSInternalAdditions forgetObject multiplyToObjectStore