Plant seeds

露頭に迷ってしまいそうな大学院生が、どこかに書かなければ忘れてしまいそうな大切なことをここに残していきます。

【初めてのWeb API】Youtube Data APIをPythonで使ってみた。

※しばらく下書きで眠っているので一旦公開します。

 

動機

Youtubeの日記カテゴリの動画を見るのが好きで昔から見ていました。好きな人の動画は最初から何度も見返したりするなどだいぶハマっていました。その中でもYoutubeChannelを消してしまったり、動画が削除されてしまったり等、一連のつながりが消えてしまうのが嫌であったり、オフライン環境でも見れるようにしたいという重いもあり、あくまでも個人使用目的として既存のWebサービスでダウンロードをしていました。

特に日記カテゴリでは、動画の投稿された順番が重要になってくることもあり、動画のファイル名の先頭に日付を付けることで投稿順序が崩れないように整理をしていました。

ところが、最近はやめることを宣言した方がいて何度も見返すのができないのが寂しいのでダウンロードをしていましたが、あまりの煩わしさにプログラミングで解決する癖がなかったのもあって自動化ツールを作ってみることにしました。

 

Web API

ところが、WebAPIに触った経験もあまりなく、そもそもHTTPメソッドベースであるということを前提にしたプログラミングに慣れていなかったのが大きな壁でした。

Youtube Data API v3を使って開発したこの自動化スクリプトを作るにあたって、この開発の流れを初心者向けに解説をしておきたいと思います。

今回はPythonのライブラリ

を使用しています。pytubeはURLを指定してエンコーディングを指定するだけでダウンロードできるライブラリです。また、google-api-python-clientはGoogleが提供しているAPIPythonで実現可能にするライブラリで、チャンネル、動画情報の取得や検索を行うのに使用しました。

 

github.com

github.com

 

Web APIとプログラミング

慣れていないとあまりイメージできないのが、ここです。普段使っているWebサービスはブラウザでしか利用できないという思い込みが強すぎてなかなか手が出せない難しいものとして考えがちなのですが、要はHTTPを理解してしまえばものすごく簡単なことなんです。

Webアプリケーション(例:Youtube)を利用するときには、ブラウザでブックマークに登録しているものを押すか、Youtubeで検索したりURLをアドレスバーに入力したりすることで簡単にできます。

f:id:rtok:20170821124811p:plain

この直感的なWebアプリケーションの利用イメージはこのようなものだと思われます。しかし、このイメージではWebAPIを使う上でかなりの障害になってしまいます。

 

f:id:rtok:20170821125800p:plain

このようなイメージではどうでしょう。どんなWebアプリケーションを使う場合でも、WebブラウザとWebサーバーは絶えずやりとりをしています。しかし、サービスのほとんどはJavascriptなどでWebブラウザが直接視覚的な情報を提供しているため、あたかも自分のやりたいサービスがパソコン上で動いているかのように見えているのです。

このWebアプリケーションとWebサーバーのやりとりの部分をWeb APIによって実現していくことになります。

今回用いたYoutube Data APIv3のリソースとメソッド

リソースとは、Youtubeが持っている情報のことです。動画やチャンネル、コメントなどを資源としてサーバー上に保存されています。ブラウザはその情報を絶えず取得し、僕らの目に見えるような形で提供してくれていました。

 Channels

これは主にチャンネルの情報などを提供してくれるリソースです。チャンネルIDなどでチャンネルを指定してリクエストを送ると、そのチャンネル名や創設日などを教えてくれます。

今回はlistメソッドを使って、動画を保存したいチャンネルの情報を取得しました。取得したい情報の種類と、チャンネルのIDをリクエストとして送信し、その結果からチャンネル名とチャンネルで投稿された動画の数だけ抜き出して使っています。

 

Search

これは主に検索機能を提供してくれるリソースです。Youtubeのトップページで検索したい動画のキーワードを入力することがありますが、それはこれによって実装することができます。今回はlistメソッドを使って、取得したい情報、チャンネルID、欲しいデータの種類(今回は動画のみ、別に再生リストやチャンネルそのものを選択することができる。)、検索結果の表示順序(今回は日付順)をリクエストして送信し、その検索結果からチャンネルで投稿された動画全てを抜き出すことができます。加えて、ページという概念があり、ページをめくって次々に検索結果の情報を抜き出さなければいけないのですが、ここでは説明を省きます。

 

Videos

これは主に動画の情報などを提供してくれるリソースです。動画IDを指定してリクエストを送ると、その動画のタイトルや投稿日時などを教えてくれます。

今回はlistメソッドを使って、先程のSearchで得た動画のIDを指定して動画タイトルと投稿日時を取得しています。

 

最終的に、これらで得た結果を利用しながらpytubeでダウンロードさせるところまで持っていきます。

 

PythonAPI

 

gist361a1483ee2803ce10d3561a0b86a3f5

 

このようにして、Oauth認証などをすべてライブラリを通してPythonでやり、認証がとれたらそれを使って、即座にメソッドを送信することができます。

詳しくは後半で説明します。