【コード例を更新しました。】google-api-python-clientとPython3でちょっと遊んでみる。

By | 2017年8月16日 , Last update: 2020年12月31日

はじめに

google-api-python-clientがVersion 1.6.2以降でPython3に対応したようなので、こいつを使ってFedora 26上でYouTube Data API v3のプログラムを動かしてみることにしました。

その顛末を書いていきます。

[2018/9/23追記] 続編のようなものを書きました。詳しくは「まとめ」の節を参照していただけると幸いです。

スポンサーリンク

事前準備

APIキーなどの取得

APIキーやOAuth2.0認証のために必要な情報を作成します。この記事のサンプルプログラムではOAuth2.0認証のみを使用しますので、OAuth2.0認証のための手順のみを示します。

OAuth2.0認証のための情報は以下の手順で作成します。

  1. https://console.developer.google.com/ にアクセスして「OAuth同意画面」で必要事項を入力して認証情報を作成します。
  2. OAuthクライアントIDを作成します。今回はPython3からのアクセスですので、その他のクライアント用のものを作成しました。
  3. OAuthクライアントIDを作成したら、下図の赤矢印のリンク(「JSONをダウンロード」)をクリックし、サンプルプログラムで使用するためのJSONファイルをダウンロードします。なお、ダウンロードした後にサンプルプログラムから読み込みやすくするため、ファイル名をclient_secrets.jsonに変更しておきます。

google-api-python-clientのインストール

root権限で、シェルプロンプトから以下のコマンドを実行し、google-api-python-clientをインストールします。

$ pip3 install google-api-python-client

 

すると、google-api-python-clientパッケージ及び前提のパッケージ(httplib2, oauth2client, rsa及びuritemplate)がインストールされて、利用できるようになります。

※WindowsのPython3でhttplib2のインストール時にエラーが発生する場合には、セットアップ用のコードの修正が必要になる場合があります。

サンプルプログラムを動かしてみる。

動作確認の手順

以下の手順でサンプルプログラムを動かしてみます。

  1. Google先生の公式のページからYouTube Data API v3へアクセスするためのサンプルプログラムをダウンロードします。
  2. サンプルプログラムに取得したAPIキーやOAuth2.0認証用の情報を追加します。
  3. サンプルプログラムを実行します…といいたいところですが、上記のリンクからダウンロードしたプログラムはPython2用のコードなので、print文の構文をPython3のものに修正します。修正後はmovielist.pyというファイル名で保存します(movielist.pyのプログラムの内容はこの記事の「動作の確認に使ったサンプルプログラム」の節参照)。
  4. movielist.pyを以下のように実行すると、YouTubeのpandanote.infoチャンネルにアップロードした動画のタイトルと動画のIDの一覧を表示させることができます。OAuth2のアクセストークンが作成されていない場合には、コマンドの実行直後に作成されますが、以下のコマンドを実行する端末でブラウザを表示できない場合には、OAuth2のアクセストークンを作成することができませんので、”--noauth-local-webserver”というコマンドラインオプションをつけて実行します(詳細は次節参照。なお、長いオプション名に”-“を含む場合には、そのオプションの解析後の属性名は”-“を”_”に置き換えたものになります[2]。例: --noauth-local-webserver → noauth_local_webserver)。
    $ python3 movielist.py

     

コマンドラインオプション

スポンサーリンク

movielist.pyの主要なコマンドラインオプションは以下の通りです。

  • --all-fileオプション: 公開状態が「非公開」または「限定公開」の動画についての情報も取得及び表示します。本オプションを使用しない場合には、公開状態が「公開」の動画のみを処理の対象とします。
  • --noauth-local-webserverオプション: OAuthの認証コードを本プログラムを実行するコンピュータとは別のコンピュータを用いて取得する場合に指定します。

実行結果

movielist.pyの実行結果は以下の通りとなります。

Videos in list UU2CV_cEjBd81csrHy24Kytg
SikuliX-1.1.4: Taking a screenshot with GIMP-2.10 automatically / SikuliX-1.1.4を使ってGIMP-2.10を起動してみた。 (oQax4_2sq-M)
--> タグ: SikuliX,Sikuli,OpenCV,GUI,automated,automation,GIMP,GUI自動操作,pandanote.info,panda大学習帳,RPA,Robotics Process Automation
The scenery from the limited express "Wakashio no.3" (From Tokyo to Kaihimmakuhari, October, 2018) (zPtuUIIM2MM)
--> タグ: わかしお,わかしお3号,京葉線,海浜幕張,Tokyo Disney Resort,Tokyo,Chiba,railway video,Kaihimmakuhari,scenery,IKEA,IKEA Tokyo-bay,Amazon,Maihama,Japan,express,Zenfone,スマホ動画
【説明用動画】Eclipse 2018-09 (4.9.0, on Fedora 28)にEclipse photon対応のScala IDEをインストールしてみた。 (_gWkKN0Rc5I)
--> タグ: Eclipse,Eclipse photon,Scala,Scala IDE,pandanote.info,panda大学習帳,Fedora,Linux,Fedora 28,Hello world,panda大学習帳外伝
Unboxing Ferragamo's crocodile shoes / フェラガモのクロコダイルの靴を購入したので、開封してみた。 (T1gBLpuDYkc)
--> タグ: 開封の儀,サルヴァトーレ,Tramezza,サルヴァトーレ・フェラガモ,Ferragamo,Salvatore Ferragamo,トラメッザ,銀座,横浜,Yokohama,Ginza,クロコダイル,Crocodile,cross,unboxing,MTO,Made to order,Japan
Fedora 28がインストールされているIntel NUC(NUC7i5BNH)の電源ボタンとリングのLEDの色及び点灯パターンをソフトウェア的な方法で変えてみた。 (FxaY41r8JYU)
--> タグ: NUC7i5BNH,Intel NUC,NUC,panda大学習帳,pandanote.info,intel_nuc_led,Fedora,Fedora 28,LED,電源ボタン,リング,kernel,kernel module
VirtualdubとDeshakerを使って動画の手ブレを補正する手順を動画にしてみた。 (rO6kG8srpIg)
--> タグ: 動画の手ブレ補正,手ブレ補正,湘南新宿ライン,大崎行,横浜駅,E231系,E233系,Virtualdub,Deshaker,pandanote.info,panda大学習帳
湘南新宿ライン大崎行@横浜駅 (2018/5/26) 【Deshakerで手ブレ補正してみた。】 (jieHFYlwz9Q)
--> タグ: 湘南新宿ライン,大崎,大崎行,横浜駅,渋谷駅工事,E231系,E233系,Japan,JR東日本,鉄道動画,Yokohama,pandanote.info,panda大学習帳,手ブレ補正,手ブレ,VirtualDub,Deshaker
Google AdSenseの住所確認のはがきを開封してみた。 (thDqT0czxJ0)
--> タグ: Google,Google AdSense,AdSense,PIN,住所確認,開封,開封の儀,pandanote.info,panda大学習帳
Unboxing Intel NUC (NUC7i5BNH) / Intel NUC (NUC7i5BNH) をAmazonでポチったので、開封してみた。 (Hnn_B29MLx4)
--> タグ: Intel NUC,Intel,NUC,NUC7i5BNH,Core i5,第7世代,Kaby Lake,Amazon,ポチった,開封,開封動画,unboxing,unboxing movie
稲毛駅で撮ってみた。(2018/02/27) (r1UO0ZJA8cQ)
--> タグ: 稲毛駅,EF65,E231系,E231系500番台,八ミツ,三鷹車両センター,JR,コンテナ貨物,中央・総武緩行線,総武快速線,新鶴見機関区
pandanote.infoのロゴ動画(take3)の制作記 (d51PHG9MXNQ)
--> タグ: panda大学習帳,AviUtl,Blender,ロゴ動画,Logo movie,pandanote.info,Logo
【Blender,再編集版】 カメラ・ランプ・オブジェクトの位置関係です。 (jLO2y9f2sak)
--> タグ: Blender,panda大学習帳,Gaussian integral,ガウス積分
Installation of SikuliX-1.1.1 / SikuliX-1.1.1のインストールと動作例 (WnIzbwXqFZI)
--> タグ: SikuliX,Sikuli,OpenCV,GUI,automated,automation,GIMP,GUI自動操作,pandanote.info,panda大学習帳,RPA
拝啓バフェット先生、今日もひかり号を見送りました。 (sOgq2y5tmK0)
--> タグ: 新横浜駅,ウォーレン・バフェット,拝啓,ひかり号,panda大学習帳,pandanote.info,東海道新幹線,新幹線,Yokohama,Shin-yokohama
「ときわ」と「サンライズ」@Tokyo station (fDkfjQ-Y7gI)
--> タグ: 285系,E657系,ときわ,サンライズ,東京駅,寝台特急,サンライズ出雲,サンライズ瀬戸,サンライズ出雲・瀬戸,Tokyo station,Tokyo,Japan
Python3+AviUtl=お手軽まとめ動画 (vg8__rUrIyo)
--> タグ: Python3,AviUtl,まとめ動画,2017年,お手軽まとめ動画,pandanote.info,パンダ大学習帳
【説明用動画】YouTube Data API v3を使ってみた。 (dFVJq2zVmqc)
--> タグ: YouTube Data API v3,Linux,Fedora27,Fedora,認証情報,Credential,pandanote.info,パンダ大学習帳,Python,Python3,pip
Zenfone 4 (ZE554KL)を買ってきたので、開封してみた。/ Zenfone 4 (ZE554KL) unboxing (ERJE4nbhPLY)
--> タグ: Zenfone4,Zenfone,ZE554KL,スマートフォン,unboxing,開封動画,ASUS,開封してみた。,UQ,UQモバイル
Fedora26 update live! on December 3, 2017 【おまけつき】 (5deXMQxhLBw)
--> タグ: Fedora,Fedora 26,Fedora 27,Linux,update,Update video log,pandanote.info,Panda大学習帳
【説明用動画】WP-QuickLaTeXで書いた数式を横スクロールさせてみた。 (tGczpP8qJXU)
--> タグ: Wordpress,WP-QuickLaTeX,CSS,横スクロール,pandanote.info,パンダ大学習帳,LaTeX,フーリエ変換,デルタ関数
Inkscapeで描いた図にLaTeXの数式を入れてみた。 (4N3BIgZ7V4M)
--> タグ: panda大学習帳,LaTeX,Inkscape,chart,図,NoCopyrightSounds
【説明用動画】「画面外から入退場」効果 for AviUtl (take2) (AmbDMlfqlTY)
--> タグ: AviUtl,Lua,エフェクト,effect,効果,画面外から入退場,pandanote.info,panda大学習帳,nocopyrightsounds,説明用動画
Fedora 26 update live! on October 6, 2017 (IF-T0QRPaik)
--> タグ: Update,Fedora,Linux,Fedora 26,pandanote.info,Update video log
slをFedora26にインストールしてみました。 (cTT48YiuvCc)
--> タグ: Fedora26,Fedora,Unix,Linux,SunOS,Sun3,Sun4,Sparc,インストール,デスクトップ,X Window System,Wayland,SL,蒸気機関車,Steam Locomotive
Blender(2.78a)で数式を回転させてみた。【再編集版】 (er2XQKlh-Lw)
--> タグ: Blender,Tex2img,SVG,Gaussian Integral,ガウス積分,数式,LaTeX,TexLive 2016,pandanote.info,panda大学習帳
【試作してみた。】ルパン三世風タイトルをフリーの音源とか耳コピとかで作ってみた。 (uobiULoLQjU)
--> タグ: ルパン三世,Lupin the 3rd,AviUtl,musagi,効果音ラボ,耳コピ
【説明用動画】 インスタントクリッピングスクリプト for AviUtl (JxN71Ej6Azo)
--> タグ: AviUtl,pandanote.info,panda大学習帳,クリッピング,スクリプト,Lua,インスタントクリッピング,説明用動画,demo movie
【説明用動画】インスタントクリッピングスクリプトの使用例 (Ky8I1dDQSkE)
--> タグ: AviUtl,pandanote.info,panda大学習帳,クリッピング,スクリプト,Lua,インスタントスクリプト
【説明用動画】Blenderで3D化した構造式を回転させてみた。【再編集版】 (5fHLCJ5qqDw)
--> タグ: Blender,pandanote.info,LaTeX,XyMTeX,YouTubeオーディオライブラリ
【説明用動画】ポリゴンを作ってみた。【再編集版】 (Gvl2XO45lhE)
--> タグ: Blender,ポリゴン,テクスチャ,pandanote.info
【説明用動画】 Blender(2.78a)で数式を2回転させてみた。【再編集版】 (wsEnZYFTOsg)
--> タグ: Blender,AviUtl,ガウス積分,Youtubeオーディオライブラリ,Gaussian integral,いつもより多く回っております。,いつもより余計に回っております,pandanote.info,panda大学習帳
onekoをFedora26にインストールしてみました。 (9APmZjpLREI)
--> タグ: oneko,Fedora 26,Fedora,Unix,Linux,SunOS,Sun3,Sun4,Sparc,インストール,デスクトップ,X Window System,Wayland,猫,cat
【説明用動画】 Fedora 26及びFedora 27の日本語入力(ibus-mozc)の設定方法 (3W0rLwthVNI)
--> タグ: Fedora,Fedora 26,Linux,日本語,日本語入力,ibus,mozc,ibus-mozc,pandanote.info,Wnn,Fedora 27,panda大学習帳,Fedora 28
ファミコン風横浜市歌を作ってみた。 (IFawOSATBxg)
--> タグ: 横浜市歌,横浜,Yokohama,日本,Japan,musagi,chiptune,8bit,市歌,ファミコン風,pandanote.info
pandanote.infoチャンネルのロゴ動画(take2)を作ってみた。 (ijpSvCuhZgQ)
--> タグ: pandanote.info,ロゴ動画,logo movie,Blender,AviUtl,musagi,ハイケンスのセレナーデ
【説明用動画】 直方体に動画を貼り付けてみた。 (P4R_0QgeD8E)
--> タグ: Blender,AviUtl,説明用動画,pandanote.info
pandanote.infoチャンネルのロゴ動画を作ってみた。 (ix0e10yvCzU)
--> タグ: AviUtl,musagi,ハイケンスのセレナーデ,ロゴ動画,pandanote.info
【説明用動画】ルパン三世風タイトルを作ってみた。 (8BfU4S_V2RY)
--> タグ: ルパン三世風タイトル,ルパン三世,pandanote.info
【説明用動画】構造式を回転・停止させてみた。 (KywEXMpQRIo)
--> タグ: Blender,LaTeX,XyMTeX,構造式
【説明用動画】 Blenderで構造式を3Dにしてみた。 (qxUgjczOVkk)
--> タグ: Blender,LaTeX,XyMTeX,TeX2img,SVG
【説明用動画】Blenderで透過PNG画像を作成し、AviUtlで作成した背景と合成する。 (XKWt9rdD2Hg)
--> タグ: blender,aviutl,gaussian integral,pandanote.info,説明用動画,透過PNG
【説明用動画】数式を16回転させてみた。 (igR8dMXDzkc)
--> タグ: Blender,ガウス積分,Gaussian integral
【Blender】 カメラ・ランプ・オブジェクトの位置関係です。 (3mKhC4KXv_E)
--> タグ: Blender,操作動画
Blender(2.78a)で数式を回転させてみた。 (ZnmFzgWfvYs)
--> タグ: Blender,TeX2img,SVG,Gaussian Integral,ガウス積分,数式,LaTeX,TexLive 2016

OAuth2のアクセストークンが作成されておらず、かつ、--noauth-local-webserverオプションを追加して実行した場合の操作法


スポンサーリンク

OAuth2のアクセストークンが作成されておらず、かつ、--noauth-local-webserverオプションを追加して実行した場合には、以下のようなプロンプトが表示され、Verification Codeの入力を求められます。

[panda@pandanote.info youtube]$ python3 movielist.py --noauth-local-webserver /home/panda/.local/lib/python3.6/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access movielist.py-oauth2.json: No such file or directory warnings.warn(_MISSING_FILE_MESSAGE.format(filename))   Go to the following link in your browser:   https://accounts.google.com/o/oauth2/auth?client_id=349823378835-26tafco6s1j7tqhhanqccacagtqhbalt.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&access_type=offline&response_type=code Enter verification code:

 

このような場合には、以下の手順を実行します。

  1. 別の端末でブラウザを起動し、”https”で始まるURLをアドレスバーにcopy & pasteします。
  2. YouTubeのチャンネルに対応するブランドアカウント(ここではpandanote.infoを選択)を選択します。
  3. すると、ブラウザの画面が以下のような画面に切り替わすので、下図の(a)の部分に示された文字列を上記の”Enter verification code: ” の行にcopy & pasteし、Enterキーを押します。
  4. プログラムが実行されて、実行結果が表示されます。

動作の確認に使ったサンプルプログラム

動作の確認に使ったサンプルプログラムは以下の通りです。最初に書いたときには、動画のタイトルとIDのリストを出力するものでしたが、タグを出力するためのコードを追加しています。

[2018/11/23追記]…と思っていたのですがGistの更新ができていませんでした。先ほど更新したので、これでタグが出力できるコードになっていると思います。

#!/usr/bin/python
import httplib2
import os
import sys
import argparse
from apiclient.discovery import build
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow
parser = argparse.ArgumentParser(description='Command line options of movielist.py')
parser.add_argument('-a','--all-file', help='Dump information of all movies, including movies whose privacyStatus is not public.', action="store_true")
parser.add_argument('--noauth-local-webserver', help="Authorization at outside of local server.", action="store_true");
parser.add_argument('--logging-level', default="INFO", help="Logging level for oauth2client.", action="store_true");
args = parser.parse_args()
# Youtubeから動画のID等のリストを取り出すためのPython3のテストプログラム。
# URL: https://pandanote.info/?p=791
#
# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains
# the OAuth 2.0 information for this application, including its client_id and
# client_secret. You can acquire an OAuth 2.0 client ID and client secret from
# the Google Developers Console at
# https://console.developers.google.com/.
# Please ensure that you have enabled the YouTube Data API for your project.
# For more information about using OAuth2 to access the YouTube Data API, see:
# https://developers.google.com/youtube/v3/guides/authentication
# For more information about the client_secrets.json file format, see:
# https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
CLIENT_SECRETS_FILE = "client_secrets.json"
# This variable defines a message to display if the CLIENT_SECRETS_FILE is
# missing.
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 Developers 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))
# This OAuth 2.0 access scope allows for read-only access to the authenticated
# user's account, but not other types of account access.
YOUTUBE_READONLY_SCOPE = "https://www.googleapis.com/auth/youtube.readonly"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
message=MISSING_CLIENT_SECRETS_MESSAGE,
scope=YOUTUBE_READONLY_SCOPE)
storage = Storage("%s-oauth2.json" % sys.argv[0])
credentials = storage.get()
if credentials is None or credentials.invalid:
# flags = argparser.parse_args()
credentials = run_flow(flow, storage, args)
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
http=credentials.authorize(httplib2.Http()))
# Retrieve the contentDetails part of the channel resource for the
# authenticated user's channel.
channels_response = youtube.channels().list(
mine=True,
part="contentDetails"
).execute()
for channel in channels_response["items"]:
# From the API response, extract the playlist ID that identifies the list
# of videos uploaded to the authenticated user's channel.
uploads_list_id = channel["contentDetails"]["relatedPlaylists"]["uploads"]
print("Videos in list {0:s}".format(uploads_list_id))
# Retrieve the list of videos uploaded to the authenticated user's channel.
playlistitems_list_request = youtube.playlistItems().list(
playlistId=uploads_list_id,
part="snippet",
maxResults=50
)
while playlistitems_list_request:
playlistitems_list_response = playlistitems_list_request.execute()
# Print information about each video.
for playlist_item in playlistitems_list_response["items"]:
title = playlist_item["snippet"]["title"]
video_id = playlist_item["snippet"]["resourceId"]["videoId"]
video_list_request = youtube.videos().list(
id=video_id,
part="snippet,status",
maxResults=50
)
video_list_response = video_list_request.execute()
for video_list_item in video_list_response["items"]:
if args.all_file or video_list_item["status"]["privacyStatus"] == 'public':
if 'tags'in video_list_item["snippet"]:
print("{0:s} ({1:s})".format(title, video_id))
print(" --> タグ: {0:s}".format(','.join(video_list_item["snippet"]["tags"])))
playlistitems_list_request = youtube.playlistItems().list_next(
playlistitems_list_request, playlistitems_list_response)
print

まとめ

この記事ではサンプルプログラムをとりあえずPython3上で動作させるための方法について書きました。YouTubeのpandanote.infoチャンネルの方も動画の数がそこそこ増えてきたので、それらの管理用にうまく利用したいと考えています。

この記事は以上ですが、GitHub Pagesと組わせたところ、新たなWebサイト「panda大学習帳外伝」が爆誕しました。その顛末はこちらをご覧いただけると幸いです。

References / 参考文献

  1. YouTube Data API の概要
  2. argparse — Parser for command-line options, arguments and sub-commands