ブラウザ版のNotionを便利にするNewtion
youtube.jsというライブラリで何ができるか試すの絵文字

youtube.jsというライブラリで何ができるか試す

2022-04-20

2022-04-20

はじめに

こんにちは。Youtube公式 API の利用が厳しすぎ、こふです。

Youtube には公式の API がありますよね。 しかし、自分で利用するプログラムを実装しているとアップデートの際に対応する必要がでてくるのも事実。申請自体は楽だけど、利用制限もあります。

作りっぱなしのツールなら良いが、長期的に運用したい個人開発ツールだったら、困ります。Youtubejs を使うことでそういった手間を削減できるかもしれない、と思い使ってみることにしました。

Star 数(いいね数)は 2022/04/201.8k と、ある程度信頼できるはず。

Github はこちら

ドキュメントを読む前

  • 普通は Google の開発者用コンソールへアクセスし、API キーを発行することで使えるようになるはず、だけど。。。
  • もしかして ChromeSelenium で動かして情報を取得するの?

とも思っていました。

特徴

README を参照すると、以下のようになっていました。

  • 動画、プレイリスト、音楽、アルバムの検索が可能
  • チャンネル登録・その解除、高評価・低評価、コメント
  • 登録動画やあなたへのおすすめフィードの取得
  • 任意の Google アカウントへのアクセス
  • ライブ放送のチャットと統計の取得
  • アカウントの設定の変更
  • プレイリストの作成・削除
  • 動画のダウンロード

当然、ログインを必要としないものなら、アカウントは不要とのこと。

ソースコードをパッとみてわかる仕組み

  • .proto ファイルがある、gRPC を使っている?
  • 使っているライブラリは普通だ

何に使えるか

  • API を叩かない(使わない)ので、なんらかの方法で回避している(ローカルから Axios などでリクエストしている)ように思います
  • つまり、Web サービスのようなローカルでない場所からは CORS エラーで使えないと考えられます
  • あくまで CLI ツールやローカルで動かすダッシュボードに使えそう
  • そういう意味では、Electron で作ったデスクトップアプリに使えるのでは?と想像できますね

何か作ってみたいです。

実際に使ってみる

ライブラリの名前はyoutubei.jsです、気をつけてください。おそらく先に名前を取られているためでしょう。

mkdir youtube-js && cd youtube-js node -v v16.14.0 npm install [email protected]

検証用のテンプレートレポジトリを Vite とかで作ろう。。。記事更新予定!

検索する

node main.js > result.shell { query: 'ヒカキン ピーチ城', corrected_query: 'N/A', estimated_results: 33001, videos: [ { id: 'vB1JB56oj6A', url: 'https://youtu.be/vB1JB56oj6A', title: 'ヒカキン×ピーチ城', description: 'HIKAKIN #マリオ #ピーチ姫.', channel: [Object], metadata: [Object] }, ] }

これだけでも必要十分なデータが手に入りました。

チャンネルデータ、メタデータを確認すると。。。

console.log(searchResult.videos[0].channel); { id: 'UCyovtAEAMaURfoJC8JGH0FA', name: 'おまとめさん', url: 'https://www.youtube.com/channel/UCyovtAEAMaURfoJC8JGH0FA' }
console.log(searchResult.videos[0].metadata); { view_count: '2,870,316 views', short_view_count_text: { simple_text: '2.8M views', accessibility_label: '2.8 million views' }, thumbnails: [ { url: 'https://i.ytimg.com/vi/vB1JB56oj6A/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCAMegqKnNKINaY65Mg_pTuhFppgQ', width: 360, height: 202 }, { url: 'https://i.ytimg.com/vi/vB1JB56oj6A/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA2F1yneSfuZ6_Jqh7J9lR5RgzSXA', width: 720, height: 404 } ], duration: { seconds: 41, simple_text: '0:41', accessibility_label: '41 seconds' }, published: '1 year ago', badges: [], owner_badges: [] }

すごい、視聴回数もサムネイル画像も取得できます。

検索キーワードのサジェスト

予測変換のようなもので、これのことです。プログラムから取得できるのは非常に便利では?と思いました。

const Innertube = require('youtubei.js') const main = async () => { const youtube = await new Innertube() const suggestionsResult = await youtube.getSearchSuggestions('ヒカキン', { client: 'YOUTUBE', }) console.log(suggestionsResult) } main()

すると、配列でテキストと太字のテキスト(入力している単語)が返ってくる。

これを使うと、SEO 対策のための関連キーワードツールのように、新たなアイデアが生まれるかもしれないですね。

[ { text: 'ヒカキン', bold_text: 'ヒカキン' }, { text: 'ヒカキンフォートナイト', bold_text: 'ヒカキン' }, { text: 'ヒカキンゲームズ', bold_text: 'ヒカキン' }, { text: 'ヒカキンマイクラ', bold_text: 'ヒカキン' }, { text: 'ヒカキンクレーンゲーム', bold_text: 'ヒカキン' }, { text: 'ヒカキン青鬼', bold_text: 'ヒカキン' }, { text: 'ヒカキン マリオ', bold_text: 'ヒカキン' }, { text: 'ヒカキン青鬼オンライン', bold_text: 'ヒカキン' }, { text: 'ヒカキン料理', bold_text: 'ヒカキン' }, { text: 'ヒカキンうた', bold_text: 'ヒカキン' } ]

動画詳細

const Innertube = require('youtubei.js') const main = async () => { const youtube = await new Innertube() const video = await youtube.getDetails('vB1JB56oj6A') console.log(video) } main()

結果はデータが多いので一部割愛しますが、Metadata の中には

  • 埋め込み用 URL まで丁寧に返してくれる(動画 ID を繋げるだけだけど
  • is_family_safe: trueから動画の対象年齢に近いものも取得可能
  • 視聴回数、動画のカテゴリ、投稿日

などがありました。

{ id: 'vB1JB56oj6A', title: 'ヒカキン×ピーチ城', description: '#HIKAKIN #マリオ #ピーチ姫', thumbnail: { url: 'https://i.ytimg.com/vi_webp/vB1JB56oj6A/maxresdefault.webp', width: 1920, height: 1080 }, metadata: { }, like: [Function (anonymous)], dislike: [Function (anonymous)], removeLike: [Function (anonymous)], subscribe: [Function (anonymous)], unsubscribe: [Function (anonymous)], comment: [Function (anonymous)], getComments: [Function (anonymous)], getLivechat: [Function (anonymous)], setNotificationPreferences: [Function (anonymous)] }

コメント取得

const main = async () => { const youtube = await new Innertube() const response = await youtube.getComments('vB1JB56oj6A') console.log(response) }
{ comments: [ { text: 'ピーチ城のテーマに似てるって気がついた時点で有能', author: [Object], metadata: [Object], like: [Function: like], dislike: [Function: dislike], reply: [Function: reply], getReplies: [Function: getReplies] },

ここからコメントのテキスト、投稿者、コメントに対する高評価・低評価も可能で、リプライも可能です。 しかし、ログインが必要なものはログインしないとエラーとなります。

トレンド情報

const Innertube = require('youtubei.js') const main = async () => { const youtube = await new Innertube() const trending = await youtube.getTrending() console.log(trending.now.content[0].videos) } main()

これで自分のダッシュボードを作り、毎時間ここからトレンドの動画を取得するなど可能です。

ラズパイなどを常時起動させ、定期的にメール送信などはローカルからであればできそう。

サインイン(ログイン)していないと、以下のエラーを吐きます。

node:internal/process/promises:265 triggerUncaughtException(err, true /* fromPromise */); ^ InnertubeError: You are not signed in

つまり、ブラウザから呼び出しているようではない。

動画のダウンロード

https://github.com/LuanRT/YouTube.js#downloading-videosから可能である。

このライブラリ以外になにも外部ライブラリを入れないが、ダウンロードできるのはなぜだろう?

https://github.dev/LuanRT/YouTube.js/blob/dbc8b62ba274805645d37479a5f03d75b09921f5/lib/Innertube.js#L785

ライブラリの該当箇所を見つけましたが、コードリーディングは省略します。難しい。。。

実際に試してみます。

node start.js [DOWNLOADER] Downloading Looking for Life on Mars | Full Episode I NOVA | PBS by NOVA PBS Official [DOWNLOADER] Starting download now! [DOWNLOADER] Done!

実際にダウンロードでき、再生もできた。。。

検索結果をまとめてダウンロードして、Youtube にアクセスすることなく動画を閲覧するツールを作ることができますね。

例えば、Youtube の広告を見たくない、Youtube を開くと見るのをやめられないなど各個人理由があるかもしれないが、そういった使い方が簡単にできるのは良いところかも。

ログイン・サインイン

2 通りのやり方があり、OAuth を使う、Cookie を使う

シンプルで信頼できるのは OAuth を使う方法なので、それで試してみる

node main.js Hello! On your phone or computer, go to https://www.google.com/device and enter the code HOGE-HOGE Successfully signed-in, enjoy!

リンクをクリックしコードを入力するとアカウント選択画面に飛びます。

これで成功。ここから、ログインを必要とする行動が可能になります。例えば

  • ログインする
  • 動画を検索する
  • 結果の上位 10 件の動画時間が 10 分以上の動画に高評価を押す
  • 1 つ目の動画に適当なコメントを残す
  • ログアウトする

ということです。認証情報 がローカルに生成されるため、Git 管理はすべきでないです。.gitignore に追加すれば OK 。

さいごに

  • 非常に気軽に使えるライブラリ
  • ローカルで試すツール(デスクトップアプリ・CLI ツール)に組み込むことは可能
    • あくまで Github にコードを公開したり、デスクトップアプリの実行ファイルを配布する中で使うことはできると思います(MIT ライセンス)
  • Web 上で公開するツールには Youtube 公式 API を使う必要があります(当然)

参考

関連記事


アバター

こふ

情報通信を専攻している大学生です。大学・趣味・アルバイトでプログラムを書いています。ITサービス・文章を創作することが好きです。

このブログについて

共有する