Dieser Artikel lädt Videos über die YouTube-API hoch. Die Sprache ist Python3. Sie können gemäß dem offiziellen Dokument unten fortfahren, aber ich habe einige Punkte hinzugefügt, von denen ich süchtig war.
Als Voraussetzung wird angenommen, dass das Projekt in GCP erstellt wurde.
Installieren Sie die Bibliothek, um die Google-API zu verwenden.
python
$ pip install google-api-python-client
Öffnen Sie den folgenden Link und erstellen Sie Ihre Anmeldeinformationen über die GCP-Konsole. Dieses Mal werden wir OAuth 2.0 verwenden. GCP-Konsolenanmeldeinformationen
(1) Gehen Sie zu Anmeldeinformationen erstellen> OAuth-Client-ID (wählen Sie das Projekt oben links aus).
(2) Wählen Sie "Andere". Der Name wird durch Eingabe eines beliebigen Werts erstellt
(3) Kunden-ID und Kundengeheimnis können erhalten werden
Wenn der OAuth-Zustimmungsbildschirm nicht erstellt wurde, erstellen Sie ihn.
Füllen Sie die Felder für den Anwendungsnamen und die Support-E-Mails aus und klicken Sie auf die Schaltfläche "Erstellen" am unteren Bildschirmrand.
Öffne den unten stehenden Link und suche in der GCP-Konsole nach der YouTube-Daten-API. Ab 2020.1 ist es "YouTube Data API v3". Wenn Sie es öffnen, gibt es eine Schaltfläche zum Aktivieren. Aktivieren Sie es also. GCP Console-API Library
Arbeitsordner
$ tree
.
├── movies
│ └── sample001.MP4 #Video hochgeladen werden
├── client_secrets.json
└── upload_video.py
Es gibt zwei Quellen, JSON und Python für Anmeldeinformationen.
Erstellen Sie client_secrets.json. Legen Sie für "client_id" und "client_secret" die Werte der Client-ID und des Client-Geheimnisses fest, die in "1. Erstellen von Autorisierungsinformationen" erstellt wurden.
client_secrets.json
{
"web": {
"client_id": "[[INSERT CLIENT ID HERE]]",
"client_secret": "[[INSERT CLIENT SECRET HERE]]",
"redirect_uris": [],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token"
}
}
Python
Grundsätzlich können Sie die Quelle von Official verwenden, aber wenn es im Python2-System geschrieben ist und es Python3 ist, wie es ist Es funktioniert nicht. Also werde ich es ein wenig umschreiben, damit es mit Python3 funktioniert. Es gibt zwei Umschreibpunkte wie folgt. ・ Migrieren Sie von httplib zu http.client -Rewriting der print-Anweisung (Nebenbei, ändern Sie den Einzug in 4 Bytes)
upload_video.py(Offizielle Kommentare wurden aus Platzgründen gelöscht)
import http.client #httplib ist Python3 ist http.Zum Client migrieren
import httplib2
import os
import random
import sys
import time
from apiclient.discovery import build
from apiclient.errors import HttpError
from apiclient.http import MediaFileUpload
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow
httplib2.RETRIES = 1
MAX_RETRIES = 10
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error,
IOError,
http.client.NotConnected,
http.client.IncompleteRead,
http.client.ImproperConnectionState,
http.client.CannotSendRequest,
http.client.CannotSendHeader,
http.client.ResponseNotReady,
http.client.BadStatusLine)
RETRIABLE_STATUS_CODES = [500, 502, 503, 504]
CLIENT_SECRETS_FILE = "client_secrets.json"
MISSING_CLIENT_SECRETS_MESSAGE = """
WARNING: Please configure OAuth 2.0
To make this sample run you will need to populate the client_secrets.json file
found at:
%s
with information from the API Console
https://console.developers.google.com/
For more information about the client_secrets.json file format, please visit:
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
""" % os.path.abspath(os.path.join(os.path.dirname(__file__),
CLIENT_SECRETS_FILE))
YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
VALID_PRIVACY_STATUSES = ("public", "private", "unlisted")
def get_authenticated_service(args):
flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
scope=YOUTUBE_UPLOAD_SCOPE,
message=MISSING_CLIENT_SECRETS_MESSAGE)
storage = Storage("%s-oauth2.json" % sys.argv[0])
credentials = storage.get()
if credentials is None or credentials.invalid:
credentials = run_flow(flow, storage, args)
return build(YOUTUBE_API_SERVICE_NAME,
YOUTUBE_API_VERSION,
http=credentials.authorize(httplib2.Http()))
def initialize_upload(youtube, options):
tags = None
if options.keywords:
tags = options.keywords.split(",")
body = dict(
snippet=dict(
title=options.title,
description=options.description,
tags=tags,
categoryId=options.category
),
status=dict(
privacyStatus=options.privacyStatus
)
)
insert_request = youtube.videos().insert(
part=",".join(body.keys()),
body=body,
media_body=MediaFileUpload(options.file, chunksize=-1, resumable=True)
)
resumable_upload(insert_request)
def resumable_upload(insert_request):
response = None
error = None
retry = 0
while response is None:
try:
print("Uploading file...") #Anweisung drucken
status, response = insert_request.next_chunk()
if response is not None:
if 'id' in response:
print("Video id '%s' was successfully uploaded." % response['id'])
else:
exit("The upload failed with an unexpected response: %s" % response)
except HttpError as e:
if e.resp.status in RETRIABLE_STATUS_CODES:
error = "A retriable HTTP error %d occurred:\n%s" % \
(e.resp.status, e.content)
else:
raise
except RETRIABLE_EXCEPTIONS as e:
error = "A retriable error occurred: %s" % e
if error is not None:
print(error)
retry += 1
if retry > MAX_RETRIES:
exit("No longer attempting to retry.")
max_sleep = 2 ** retry
sleep_seconds = random.random() * max_sleep
print("Sleeping %f seconds and then retrying..." % sleep_seconds)
time.sleep(sleep_seconds)
if __name__ == '__main__':
argparser.add_argument("--file", required=True, help="Video file to upload")
argparser.add_argument("--title", help="Video title", default="Test Title")
argparser.add_argument("--description",
help="Video description",
default="Test Description")
argparser.add_argument("--category", default="22",
help="Numeric video category. " +
"See https://developers.google.com/youtube/v3/docs/videoCategories/list")
argparser.add_argument("--keywords", help="Video keywords, comma separated",
default="")
argparser.add_argument("--privacyStatus", choices=VALID_PRIVACY_STATUSES,
default=VALID_PRIVACY_STATUSES[0],
help="Video privacy status.")
args = argparser.parse_args()
if not os.path.exists(args.file):
exit("Please specify a valid file using the --file= parameter.")
youtube = get_authenticated_service(args)
try:
initialize_upload(youtube, args)
except HttpError as e:
print("An HTTP error %d occurred:\n%s" % (e.resp.status, e.content))
initialize_upload
übergeben werden soll.get_authenticated_service
wird das Objekt (?), Das die API verwendet, erstellt und aus dem Ressourcennamen und dem Operationsnamen (Einfügen usw.) der YouTube-Daten-API zurückgegeben. Übergeben Sie in diesem Fall das erstellte Objekt an "initialize_upload" und führen Sie den Upload mit "youtube.videos (). Insert" aus.Führen Sie in der Befehlszeile Folgendes aus. Da es viele Argumente gibt, ist es möglicherweise einfacher, ein Shell-Skript zu verwenden, wenn Sie es mehrmals ausführen möchten.
Video-Upload durchführen
$ python upload_video.py --file="./movies/sample001.MP4" \
--title="Sample Movie" \
--description="This is a sample movie." \
--category="22" \
--privacyStatus="private"
Die Argumente haben folgende Bedeutung.
--file: Pfad des hochzuladenden Videos --title: Videotitel nach dem Hochladen --Beschreibung: Videobeschreibung
Die Elemente und Bedeutungen, die als Snippet angegeben werden können, werden unten beschrieben.
YouTube Data API Videos [YouTube Data API Videos: insert] (https://developers.google.com/youtube/v3/docs/videos/insert?hl=ja)
Wenn Sie es zum ersten Mal ausführen, wechselt der Bildschirm zum Browser und fragt nach der Auswahl des Google-Kontos und der YouTube-Verwaltungsberechtigung. Lassen Sie es daher entsprechend dem Bildschirm zu.
Wenn Sie einen Bildschirm wie den folgenden in Chrome sehen, zeigen Sie die Details an und gehen Sie zur unsicheren Seite unten links
Videoverwaltung zulassen. (Obwohl es möglicherweise auf einem anderen Bildschirm angezeigt wird, ist es dennoch zulässig.)
Abhängig von der Größe des Videos wird der Upload nach einer Weile wie folgt abgeschlossen.
Ausführungsergebnis
Uploading file...
Video id '[video id]' was successfully uploaded.
Sie können auch bestätigen, dass das Video auf dem YouTube-Bildschirm gepostet wurde.
Ursprünglich wollte ich die API verwenden, um eine große Anzahl von Videos in einem Stapel hochzuladen. Als ich jedoch ein Programm schrieb und ausführte, das die API wiederholt ausführt, trat der folgende Fehler auf.
Uploading file...
An HTTP error 403 occurred:
b'{\n "error": {\n "errors": [\n {\n "domain": "youtube.quota",\n "reason": "quotaExceeded",\n "message": "The request cannot be completed because you have exceeded your \\u003ca href=\\"/youtube/v3/getting-started#quota\\"\\u003equota\\u003c/a\\u003e."\n }\n ],\n "code": 403,\n "message": "The request cannot be completed because you have exceeded your \\u003ca href=\\"/youtube/v3/getting-started#quota\\"\\u003equota\\u003c/a\\u003e."\n }\n}\n'
Laut der Untersuchung ist die API auf 10.000 pro Tag begrenzt, und es wird gesagt, dass etwa 1.600 Einheiten zum Hochladen von Videos verwendet werden. Es scheint also, dass Sie Videos über die API auf YouTube hochladen können, ungefähr 6 Videos / Tag ...
YouTube Data API-Fehler Übersicht über die Verwendung der YouTube-Daten-API-Quote
Ein Antrag ist erforderlich, um dies zu erhöhen, aber ich habe es aufgegeben, weil es nur für den persönlichen Gebrauch war. Zumindest hätte ich tun können, was ich tun wollte, wenn es 30 Stück / Tag waren, aber wenn es 6 Stück waren, könnte die manuelle Arbeit schneller sein ...
Dies kann hilfreich sein, wenn Sie Videos in Ihre Anwendung hochladen möchten.
(Offizielle) YouTube-Daten-API
Recommended Posts