如何用Python批量更新YouTube播放列表中所有视频的描述?
嘿,别慌!你已经搞定了最关键的第一步(拿到client_secrets.json),接下来咱们一步步把代码补全,让它能真正更新你播放列表里所有视频的描述。
首先得说清楚:你之前复制的playlists.update代码是用来修改播放列表本身的信息(比如播放列表标题、描述)的,不是用来改里面视频的描述的!咱们需要换用videos.update接口,还要先把播放列表里的所有视频ID捞出来,再逐个更新。
第一步:安装必要的Python依赖
先确保你装了Google的官方客户端库,打开终端跑这个命令:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
第二步:完整代码实现
我给你写了一套完整的流程代码,你只需要替换几个参数就能用:
import os import google.auth from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError # ---------------------- 替换这里的参数 ---------------------- SCOPES = ["https://www.googleapis.com/auth/youtube.force-ssl"] PLAYLIST_ID = "你的测试播放列表ID" # 从播放列表URL里取,比如list=后面的字符串 NEW_DESCRIPTION = "这是你想要的新描述内容" # ---------------------------------------------------------- def get_authenticated_service(): creds = None # token.json会自动保存你的授权凭据,下次运行不用再登录 if os.path.exists("token.json"): creds = Credentials.from_authorized_user_file("token.json", SCOPES) # 处理凭据过期或未授权的情况 if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: # 弹出浏览器让你登录授权 flow = InstalledAppFlow.from_client_secrets_file( "client_secrets.json", SCOPES ) creds = flow.run_local_server(port=0) # 保存凭据到本地 with open("token.json", "w") as token: token.write(creds.to_json()) return build("youtube", "v3", credentials=creds) def get_playlist_video_ids(youtube, playlist_id): video_ids = [] next_page_token = None # 循环获取所有视频(因为API每次最多返回50条) while True: request = youtube.playlistItems().list( part="contentDetails", playlistId=playlist_id, maxResults=50, pageToken=next_page_token ) response = request.execute() # 提取每个视频的ID for item in response["items"]: video_ids.append(item["contentDetails"]["videoId"]) next_page_token = response.get("nextPageToken") if not next_page_token: break return video_ids def update_video_description(youtube, video_id, new_description): try: # 先获取视频当前的snippet信息(API要求更新时必须传全必填字段,不能只改描述) request = youtube.videos().list( part="snippet", id=video_id ) response = request.execute() snippet = response["items"][0]["snippet"] # 更新描述字段 snippet["description"] = new_description # 发送更新请求 update_request = youtube.videos().update( part="snippet", body={ "id": video_id, "snippet": snippet } ) update_request.execute() print(f✅ 成功更新视频 {video_id} 的描述") except HttpError as e: print(f❌ 更新视频 {video_id} 时出错: {e}") if __name__ == "__main__": # 初始化授权后的YouTube服务 youtube = get_authenticated_service() # 获取播放列表里所有视频的ID video_ids = get_playlist_video_ids(youtube, PLAYLIST_ID) print(f"\n找到 {len(video_ids)} 个视频,开始更新描述...\n") # 逐个更新视频描述 for video_id in video_ids: update_video_description(youtube, video_id, NEW_DESCRIPTION) print("\n🎉 所有视频描述更新完成!")
第三步:运行代码的注意事项
- 一定要把代码里的
PLAYLIST_ID换成你自己的测试播放列表ID(从播放列表URL里的list=后面提取) - 把
NEW_DESCRIPTION改成你想要的新描述内容 - 首次运行时,会自动弹出浏览器让你登录Google账号授权,确保你登录的是拥有这个播放列表和视频的账号
- 如果之后修改了权限范围,需要删除生成的
token.json文件,重新授权
补充说明
为什么不用你之前复制的
playlists.update?
那个接口是用来修改播放列表本身的属性(比如播放列表的标题、封面、描述)的,根本碰不到里面的视频内容。要改视频描述,必须先拿到每个视频的ID,再用videos.update接口逐个修改——这就是咱们代码里做的事儿。
内容的提问来源于stack exchange,提问作者Big_Data




