created: 2020-04-29T03:41:01.000Z

YouTube DataAPIv3 でプレイリストに動画を追加する

工程はこんな感じになる

  • GCPのコンソールでYouTubeDataAPIv3をenableにする
  • OAuthトークンを取得
  • youtube.playlistItems.insert を呼ぶ

トークンを取得するのが面倒なのだが、サービスアカウントの認証情報でそのままリクエストを投げることはできないようだ

アプリケーションは OAuth 2.0 トークンを、非公開のユーザー情報にアクセスするリクエストと共に送信しなければなりません。アプリケーションはクライアント ID と、場合によってクライアント シークレットを、トークンを取得するために送信します。ウェブ アプリケーション、サービス アカウント、インストール型アプリケーションで使用する OAuth 2.0 認証情報を作成できます。

GCPのコンソールでYouTubeDataAPIv3をenableにする

GCPの管理画面で操作してenableにする

この記事はスクショが多くてよさそうである

ただし、今回は youtube.playlistItems.insert を呼びたいので、払い出す認証はAPIキーではなくOAuthクライアントになる。APIキーはreadonlyな処理しかできず、writeっぽい操作はOAuthトークンが必要ということらしい

OAuthトークンを取得

ここにあるスクリプトをコピペして実行するとトークンが得られる 一箇所 SCOPES のところはいじる必要がある (スクリプトだとreadonlyになっている)

トークンの取得はこんな感じになる

  • スクリプトを実行
  • コンソールにURLが表示されるのでブラウザでアクセス
  • Googleアカウントの認証、渡す権限についても承認する
  • ブラウザでcodeが提示されるので、それをコンソールに戻って入力
  • $HOME/.credentials/youtube-nodejs-quickstart.json にトークンが置かれる

youtube.playlistItems.insert を呼ぶ

  • clientId, clientSecret は OAuthクライアントの認証情報
  • auth.credentialsyoutube-nodejs-quickstart.json の中身
import { youtube_v3, google } from 'googleapis';
const auth = new google.auth.OAuth2({
  clientId: 'xxxxxxxx.apps.googleusercontent.com',
  clientSecret: 'xxxxxxxxxxx9',
});
auth.credentials = {
  access_token: 'xxxxxxxxxx',
  refresh_token: 'xxxxxxxxxxxxx',
  token_type: 'Bearer',
  expiry_date: 1588132656533,
};
const youtube = new youtube_v3.Youtube({ auth });

youtube.playlistItems
  .insert({
    part: 'id,snippet,contentDetails',
    requestBody: {
      snippet: {
        playlistId: 'xxxxxxxxxGLoNoixAluaV',
        position: 0,
        resourceId: {
          videoId: 'sqPbMsssiFw',
          kind: 'youtube#video',
        },
      },
    },
  })
  .then((res) => console.log(res.data))
  .catch(console.error);

参考