ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

Go言語で YouTube Data API を叩いて概要欄を一括 Update する方法

1. やろうとしたこと

YouTube の概要欄に書かれている URL が古くなっていて、すべて更新したかった。

出来るだけカンタンに CLI で解決したいな、と思ったので、
最初は書き慣れてる Ruby にしようかと思ったが、 公式のサンプルコードgoogleauth gem を使わない古い書き方だし、
https://github.com/googleapis/google-api-ruby-client/tree/master/samples/cli も3年前の更新だしで、嫌な思いをしそうだったので途中でやめた。

数ヶ月くらい書いていなかった Golang を、腕がなまらないよう使うことにした。

2. 特に参考になったもの

今回 client_secret.json が必要になるのだが、その取得方法を上の記事ではわかりやすく説明してくれている。

3. どんなコードになるか

軽く書きたかったのできれいなコードでなくて申し訳ないが、おおむねこんなふうになった。

3-1. 認証部分

認証部分は公式のサンプルコードのやり方を拝借しつつ、
サンプルコードで使われている New メソッドは deprecated であったので
NewService メソッドを使うように変更をおこなった。

認証部分はおおまかに言うと、
実行ディレクトリと同じディレクトリに格納した client_secret.json をもとに URL が発行され、
実行者はその URL に Web ブラウザでアクセス。

OAuth2 認証が終わるとトークン文字列が発行されるので、
その文字列をコンソールに貼り付けて Enter。 すると、それを元にして token.json が作られて、以降の実行ではその token.json が使われるようになる。

逆に言えば、別ユーザー(別チャンネル)で認証をやり直したい場合は token.json を一度消してから
再び go run main.go をやってあげる必要があるということだ。

3-2. Search:list でチャンネルの動画ID一覧を取得

Search:list API を使っている110行目について。

ここでは .ForMine(true) というメソッドを使っている。
これにより、自分が管理する動画だけが対象となる。

.ChannelId("UCxxxxxxxxxxxxxxxxx") のようにすればいいのでは?
と思われるかもしれないが、単純なチャンネル検索だとアップしたての動画や古い動画が引っかからないという罠があるので、
ForMine でおこなっている。

なお、このコードでは問題ないが、ForMine を使うには OAuth 認証でないといけなく、

youtubeService, err := youtube.NewService(context.Background(), option.WithAPIKey("AIza..."))

のようにAPIキーで初期化をおこなった場合には、権限不足で失敗するので注意。

ここで書かれているところの『非公開のユーザー情報』にあたるものの閲覧なのであろう。

3-3. Video:update で概要欄の更新

この Update の部分の情報が少なかったのが今回の記事を書いたきっかけだ。

139〜140行目を見てもらえばわかる通りに、
video.Snippet.Description の値を更新したあとで、Update メソッドの引数には 「snippet」パートを更新するよ、って宣言と Video 構造体を丸ごと渡してあげている。

至って単純なものなのだが、同じことをやっている人が見つからず、
失敗した場合にどの項目が初期化されてしまうかが恐ろしかったので、
新たにチャンネルを作って数秒のスクリーンレコーディングの動画をアップするなどしていた。

4. 問題点

Update 処理は Quota の消費が激しく、Quota を 50以上消費する。
https://developers.google.com/youtube/v3/getting-started?hl=ja#quota

1日の Quota の制限は申請を出していない限り 10,000 なので、
(たいていの人は大丈夫だが)200件以上の動画をすでに投稿している場合、1日で処理を追えることが出来ない。

まあ、最新の動画から順次変えていけば充分だと思うので大きな問題ではないが、
動画数が多い人は大変だなぁ……という印象を受けた。
Quota の上限アップの申請もっとカンタンにしてほしい。システム仕様書を提出しないといけないとか大変すぎ……。

それか、投稿動画で共通のテンプレートを概要欄に設定できれば、
こんな地道な書き換えも発生しないのになー。

がんばれYouTube! その機能が欲しいYouTuberさんは多いと思うぞ!!

f:id:nekonenene:20200425041120j:plain