Python整合Youtube API v3创建播放列表、搜索添加视频遇阻求助
解决YouTube API v3整合时获取playlistId与videoId的问题
嘿,我仔细看了你的代码和遇到的问题,发现几个关键的小细节出错了,导致你无法正确获取播放列表ID和视频ID,也没法把视频添加到播放列表里。咱们一步步来修正:
问题分析与修正点
1. 搜索视频时获取videoId的路径错误
你给出的搜索响应示例里,视频ID并不在顶层的response对象里,而是嵌套在items数组的每个元素的id字段下。你之前直接写vid=response['videoId']肯定找不到这个字段,正确的路径应该是:
- 如果只取第一个搜索结果:
response['items'][0]['id']['videoId'] - 如果要处理所有搜索到的视频,需要遍历
response['items']数组
2. 添加播放列表项的参数错误
你在调用playlistItems.insert时,有两个明显错误:
- 把变量
vid写成了字符串"vid",API会把这个当成视频ID,肯定找不到对应的视频 resourceId里多余写了playlistId,这个字段不需要,API会根据你传入的playlistId来关联播放列表
3. 缺失创建播放列表并获取playlistId的逻辑
你提到要整合创建播放列表的功能,但现有代码里没有这部分。调用playlists.insert后,返回的响应里的id字段就是你需要的playlistId,需要保存下来用于后续添加视频。
修改后的完整代码
import os import google_auth_oauthlib.flow import googleapiclient.discovery import googleapiclient.errors scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"] def main(): # 本地运行时禁用HTTPS验证,生产环境一定要关掉! os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1" api_service_name = "youtube" api_version = "v3" client_secrets_file = "client_secrets.json" # 获取凭证并创建API客户端 flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file( client_secrets_file, scopes) credentials = flow.run_console() youtube = googleapiclient.discovery.build( api_service_name, api_version, credentials=credentials) # -------------------------- # 1. 创建新的播放列表并获取playlistId # -------------------------- request_create_playlist = youtube.playlists().insert( part="snippet,status", body={ "snippet": { "title": "我的自定义播放列表", "description": "通过API创建的测试播放列表" }, "status": { "privacyStatus": "private" # 可选:public, private, unlisted } } ) response_playlist = request_create_playlist.execute() playlist_id = response_playlist['id'] # 拿到新创建的播放列表ID print(f"成功创建播放列表,ID:{playlist_id}") # -------------------------- # 2. 搜索自己频道内指定关键词的视频 # -------------------------- request_search = youtube.search().list( part="snippet", forMine=True, maxResults=50, order="date", q="searchcriteria", type="video" ) response_search = request_search.execute() # 遍历搜索到的所有视频 for item in response_search['items']: video_id = item['id']['videoId'] print(f"找到符合条件的视频ID:{video_id}") # -------------------------- # 3. 将视频添加到播放列表 # -------------------------- request_add_video = youtube.playlistItems().insert( part="snippet", body={ "snippet": { "playlistId": playlist_id, "resourceId": { "kind": "youtube#video", "videoId": video_id # 这里用变量,不是字符串! }, "position": 0 } } ) response_add = request_add_video.execute() print(f"视频 {video_id} 已成功添加到播放列表,返回结果:{response_add}") if __name__ == "__main__": main()
关键修改说明
- 创建播放列表:新增了
playlists.insert的调用,从返回的响应中提取id作为播放列表ID,后续添加视频时直接使用这个变量 - 获取videoId:遍历搜索结果的
items数组,每个item的id['videoId']才是正确的视频ID路径 - 添加视频参数修正:把
"videoId": "vid"改成"videoId": video_id,并移除了resourceId里多余的playlistId字段
这样修改后,整个流程就能正常跑通:创建播放列表→搜索视频→批量添加视频到播放列表啦!
内容的提问来源于stack exchange,提问作者Susa
相关产品推荐
相关产品推荐

