Cet article met en ligne des vidéos à l'aide de l'API YouTube. Le langage est Python3. Vous pouvez procéder selon le document officiel ci-dessous, mais j'ai ajouté quelques points auxquels j'étais accro.
En principe, on suppose que le projet a été créé dans GCP.
Installez la bibliothèque pour utiliser l'API de Google.
python
$ pip install google-api-python-client
Ouvrez le lien ci-dessous et créez vos informations d'identification à partir de la console GCP. Cette fois, nous utiliserons OAuth 2.0. Informations d'identification de la console GCP
(1) Accédez à Créer des informations d'identification> ID client OAuth (sélectionnez le projet en haut à gauche)
(2) Sélectionnez "Autre". Le nom est créé en entrant une valeur
(3) L'ID client et le secret client peuvent être obtenus
De plus, si l'écran de consentement OAuth n'a pas été créé, créez-le.
Remplissez le nom de l'application et les champs de courrier de support et appuyez sur le bouton de création en bas de l'écran.
Ouvrez le lien ci-dessous et recherchez l'API de données YouTube dans la console GCP. Depuis 2020.1, il s'agit de "YouTube Data API v3". Lorsque vous l'ouvrez, il y a un bouton d'activation, alors activez-le. Bibliothèque d'API de la console GCP
Dossier de travail
$ tree
.
├── movies
│ └── sample001.MP4 #Vidéo à télécharger
├── client_secrets.json
└── upload_video.py
Il existe deux sources, JSON et Python pour les informations d'identification.
Créez client_secrets.json. Pour client_id
et client_secret
, définissez les valeurs de l'ID client et du secret client créés dans" 1. Création des informations d'autorisation ".
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
Fondamentalement, vous pouvez utiliser la source de Official, mais si elle est écrite dans le système Python2 et que c'est Python3 tel quel Ça ne marche pas. Donc, je vais le réécrire un peu pour qu'il fonctionne avec Python3. Il y a deux points de réécriture comme suit. ・ Migrer de httplib vers http.client -Récriture du relevé d'impression (En passant, changez le retrait à 4 octets)
upload_video.py(Les commentaires officiels ont été supprimés en raison du manque d'espace)
import http.client #httplib est Python3 est http.Migrer vers le client
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...") #déclaration d'impression
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))
--Dans l'API de données YouTube, le contenu défini dans l'extrait de code est transmis à l'API. ʻLe corps de initialize_upload` fait un dict de la valeur à passer comme extrait de code.
. --Dans
get_authenticated_service, l'objet (?) Qui utilise l'API est construit et renvoyé à partir du nom de la ressource et du nom de l'opération (insérer, etc.) de l'API de données YouTube. Dans ce cas, passez l'objet construit à ʻinitialize_upload
et exécutez le téléchargement avec youtube.videos (). Insert
.Depuis la ligne de commande, exécutez comme suit. Puisqu'il existe de nombreux arguments, il peut être plus facile d'utiliser un script shell si vous souhaitez l'exécuter plusieurs fois.
Effectuer le téléchargement vidéo
$ python upload_video.py --file="./movies/sample001.MP4" \
--title="Sample Movie" \
--description="This is a sample movie." \
--category="22" \
--privacyStatus="private"
La signification des arguments est la suivante.
--file: chemin de la vidéo à télécharger --title: titre de la vidéo après le téléchargement --description: Description de la vidéo --catégorie: Catégorie. La valeur par défaut est 22 --privacyStatus: paramètres de publication vidéo. Publier en privé si privé
Les éléments et les significations qui peuvent être spécifiés sous forme d'extrait sont décrits ci-dessous.
YouTube Data API Videos [YouTube Data API Videos: insert] (https://developers.google.com/youtube/v3/docs/videos/insert?hl=ja)
Lorsque vous l'exécutez pour la première fois, l'écran passera au navigateur et demandera la sélection du compte Google et l'autorisation de gestion YouTube, veuillez donc l'autoriser en fonction de l'écran.
Si vous voyez un écran comme celui ci-dessous dans Chrome, affichez les détails et accédez à la page non sécurisée en bas à gauche
Autoriser la gestion vidéo. (Bien qu'il puisse être affiché sur un autre écran, il est toujours autorisé.)
Selon la taille de la vidéo, le téléchargement sera terminé comme suit après un certain temps.
Résultat d'exécution
Uploading file...
Video id '[video id]' was successfully uploaded.
Vous pouvez également confirmer que la vidéo a été publiée à partir de l'écran YouTube.
À l'origine, je voulais utiliser l'API pour télécharger un grand nombre de vidéos dans un lot, mais lorsque j'ai écrit et exécuté un programme qui exécute l'API à plusieurs reprises, l'erreur suivante s'est produite.
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'
Selon l'enquête, l'API est limitée à 10 000 par jour et on dit qu'environ 1 600 unités seront utilisées pour télécharger des vidéos. Donc, il semble que vous puissiez télécharger des vidéos sur YouTube via l'API environ 6 vidéos / jour ...
Erreurs API de données YouTube Présentation de l'utilisation du quota d'API de données YouTube
Une application est nécessaire pour soulever ce problème, mais je l'ai abandonnée parce que c'était juste pour un usage personnel. Au moins j'aurais pu faire ce que je voulais faire si c'était 30 pièces / jour, mais si c'était 6 pièces, le travail manuel serait peut-être plus rapide ...
Cela peut être utile si vous souhaitez télécharger des vidéos dans votre application.
(Officielle) API de données YouTube
Recommended Posts