|
|
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_console() |
|
|
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_info in videos_to_upload: |
|
|
upload_video( |
|
|
youtube, |
|
|
video_info['path'], |
|
|
video_info['title'], |
|
|
video_info['description'], |
|
|
video_info.get('tags'), |
|
|
video_info.get('privacy_status', 'private') |
|
|
) |
|
|
|
|
|
if __name__ == '__main__': |
|
|
main() |
|
|
|