| import os |
| import pickle |
| from googleapiclient.discovery import build |
| from googleapiclient.http import MediaFileUpload |
| from google_auth_oauthlib.flow import InstalledAppFlow |
| from google.auth.transport.requests import Request |
|
|
| CLIENT_SECRETS_FILE = 'client_secrets.json' |
| CREDENTIALS_FILE = 'youtube_token.pickle' |
| SCOPES = ['https://www.googleapis.com/auth/youtube.upload'] |
|
|
| def authenticate_youtube(): |
| creds = None |
| if os.path.exists(CREDENTIALS_FILE): |
| with open(CREDENTIALS_FILE, 'rb') as token: |
| creds = pickle.load(token) |
| 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_FILE, SCOPES) |
| |
| creds = flow.run_local_server(port=0, open_browser=False) |
| print("请复制以上链接,在浏览器中打开并完成授权,授权成功后程序将继续运行。") |
| with open(CREDENTIALS_FILE, 'wb') as token: |
| pickle.dump(creds, token) |
| youtube = build('youtube', 'v3', credentials=creds) |
| return youtube |
|
|
| def upload_video(youtube, video_path, title, description, tags=None, privacy_status="private"): |
| if not os.path.exists(video_path): |
| print(f"错误:找不到视频文件 {video_path}") |
| return None |
| |
| body = { |
| 'snippet': { |
| 'title': title, |
| 'description': description, |
| 'tags': tags or [], |
| 'categoryId': '22' |
| }, |
| 'status': { |
| 'privacyStatus': privacy_status, |
| 'selfDeclaredMadeForKids': False |
| } |
| } |
| |
| media = MediaFileUpload(video_path, chunksize=-1, resumable=True, mimetype='video/*') |
| request = youtube.videos().insert( |
| part=','.join(body.keys()), |
| body=body, |
| media_body=media |
| ) |
| response = request.execute() |
| |
| print(f"上传成功!视频链接:https://www.youtube.com/watch?v={response['id']}") |
| return response['id'] |
|
|
| def main(): |
| youtube = authenticate_youtube() |
|
|
| |
| videos_to_upload = [ |
| { |
| 'path': 'your_video_1.mp4', |
| 'title': '视频标题1', |
| 'description': '这是视频描述1', |
| 'tags': ['示例', '测试'], |
| 'privacy_status': 'private' |
| }, |
| { |
| 'path': 'your_video_2.mp4', |
| 'title': '视频标题2', |
| 'description': '这是视频描述2', |
| 'tags': ['样例', '上传'], |
| 'privacy_status': 'unlisted' |
| } |
| ] |
|
|
| for video in videos_to_upload: |
| upload_video( |
| youtube, |
| video['path'], |
| video['title'], |
| video['description'], |
| video['tags'], |
| video['privacy_status'] |
| ) |
|
|
| if __name__ == '__main__': |
| main() |
|
|