youtube.jsというライブラリで何ができるか試す
2022-04-20
2022-04-20
はじめに
こんにちは。Youtube公式 API
の利用が厳しすぎ、こふです。
Youtube
には公式の API
がありますよね。
しかし、自分で利用するプログラムを実装しているとアップデートの際に対応する必要がでてくるのも事実。申請自体は楽だけど、利用制限もあります。
作りっぱなしのツールなら良いが、長期的に運用したい個人開発ツールだったら、困ります。Youtubejs
を使うことでそういった手間を削減できるかもしれない、と思い使ってみることにしました。
Star
数(いいね数)は 2022/04/20
で 1.8k
と、ある程度信頼できるはず。
Github はこちら
ドキュメントを読む前
- 普通は
Google
の開発者用コンソールへアクセスし、API
キーを発行することで使えるようになるはず、だけど。。。 - もしかして
Chrome
をSelenium
で動かして情報を取得するの?
とも思っていました。
特徴
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から可能である。
このライブラリ以外になにも外部ライブラリを入れないが、ダウンロードできるのはなぜだろう?
ライブラリの該当箇所を見つけましたが、コードリーディングは省略します。難しい。。。
実際に試してみます。
❯ 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
を使う必要があります(当然)