[PYTHON] Laden Sie Videos mit der YouTube-API hoch

Überblick

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.

YouTube API-Video hochladen

Umgebung

Als Voraussetzung wird angenommen, dass das Projekt in GCP erstellt wurde.

Vorbereitungen

Google-api-python-client installieren

Installieren Sie die Bibliothek, um die Google-API zu verwenden.

python


$ pip install google-api-python-client

Antragsregistrierung bei GCP

1. Erstellung von Genehmigungsinformationen

Ö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). スクリーンショット 2020-01-21 23.30.36.png

(2) Wählen Sie "Andere". Der Name wird durch Eingabe eines beliebigen Werts erstellt スクリーンショット 2020-01-21 23.31.32.png

(3) Kunden-ID und Kundengeheimnis können erhalten werden スクリーンショット 2020-01-21 23.32.38.png

Wenn der OAuth-Zustimmungsbildschirm nicht erstellt wurde, erstellen Sie ihn. スクリーンショット 2020-01-22 0.13.48.png

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. スクリーンショット 2020-01-22 0.14.13.png

2. Aktiviere die YouTube-API

Ö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

スクリーンショット 2020-01-21 23.43.01.png

Quelle zum Hochladen erstellen

Ordnerstruktur

Arbeitsordner


$ tree
.
├── movies
│   └── sample001.MP4  #Video hochgeladen werden
├── client_secrets.json
└── upload_video.py

Quelle

Es gibt zwei Quellen, JSON und Python für Anmeldeinformationen.

Authentifizierungsinformationen

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))

Ein kleiner Quellenkommentar

Upload durchführen

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. スクリーンショット 2020-01-22 1.06.45.png

Wenn Sie einen Bildschirm wie den folgenden in Chrome sehen, zeigen Sie die Details an und gehen Sie zur unsicheren Seite unten links

スクリーンショット 2020-01-22 1.07.11.png

Videoverwaltung zulassen. (Obwohl es möglicherweise auf einem anderen Bildschirm angezeigt wird, ist es dennoch zulässig.) スクリーンショット 2020-01-22 1.07.22.png

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.

Was mich süchtig machte: API-Nutzungsbeschränkungen

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.

Referenz

(Offizielle) YouTube-Daten-API

Recommended Posts

Laden Sie Videos mit der YouTube-API hoch
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Holen Sie sich Youtube-Daten in Python mithilfe der Youtube-Daten-API
So laden Sie YouTube-Videos mit pytube3 herunter
[Python] Holen Sie sich alle Kommentare mit Youtube Data Api
Transkription von YouTube-Videos mit GCPs Cloud Speech-to-Text
Anonymer Upload von Bildern mit der Imgur-API (mit Python)
Laden Sie eine JPG-Datei mit der Google Drive-API in Python hoch
Testen Sie die CloudStack-API mit Simulator
Alterserkennung mit Peppers API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der PeeringDB 2.0-API
Verwenden Sie configparser, wenn Sie die API verwenden
Spielen Sie mit der YouTube Data API v3 mit dem Google API Python Client
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
Versuchen Sie es mit der Admin-API von Janus Gateway
Abrufen von Salesforce-Daten mithilfe der REST-API
Gegenmaßnahmen gegen Proxy bei Verwendung der WEB-API
Datenerfassung mit Python Googlemap API
Logoerkennung mit der TensorFlow-Objekterkennungs-API
[Python3] Google übersetzt Google Übersetzung ohne Verwendung von API
Versuchen Sie es mit der Pleasant-API (Python / FastAPI).
Abrufen von Amazon-Daten mit Keep API # 1 Abrufen von Daten
Datenerfassungsnotiz mit der Backlog-API
Versuchen Sie es mit der Aktions-API von Python argparse
Erstellen Sie eine API mit hug mit mod_wsgi
Gesichtserkennung mit Peppers API
Erstellen Sie die CRUD-API mit der Fast API
Führen Sie Ansible über Python mithilfe der API aus
Ich habe versucht, die checkio-API zu verwenden
Identifizieren Sie den YouTube-Kanal des Hikakin-Videos anhand von Miniaturbildern mithilfe von CNN