1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Node.jsでYouTube Liveのコメントやアイコンをターミナルに表示させてみる

1
Posted at

YouTube LiveのコメントをNode.jsから取得できるライブラリを見つけたので試してみました。

アイコン表示も

利用ライブラリ youtube-chat

どうやらスクレイピングしてそうでAPIキーなどは不要です。

$ node -v
v25.2.1

環境はv25.2.1で試します。

簡単に試す

まずは、YouTubeでライブをしてコメントできる状態にします

CleanShot 2025-12-27 at 12.13.46.png

npm init -y && npm pkg set type=module

コードは以下で簡単に試せます。

https://www.youtube.com/live/_JOMjRiTs2X みたいなURLだと_JOMjRiTs2XがIDになるので該当箇所を変更します。

import { LiveChat } from "youtube-chat";

// 監視したい動画のID
const VIDEO_ID = "_JOMjRiTs2X"; //LiveのID

// 【修正箇所】videoId ではなく liveId に変更
const liveChat = new LiveChat({ liveId: VIDEO_ID });

// チャットを受信した時の処理
liveChat.on("chat", (chatItem) => {
    const message = chatItem.message.map(m => m.text).join("");
    const author = chatItem.author.name;
    console.log(`[${author}]: ${message}`);
});

// エラーが起きた時の処理
liveChat.on("error", (err) => {
    console.error("エラーが発生しました:", err);
});

// 監視スタート
console.log(`YouTube Live 監視開始: https://www.youtube.com/watch?v=${VIDEO_ID}`);
liveChat.start();

chatItemの中をみてみる

//省略

liveChat.on("chat", (chatItem) => {
    console.log(chatItem); // 
});

//省略

このように取得した時のchatItemの中で色々情報が送られてきてました。

urlのところでアイコンなども取れそうですね。

{
  id: 'ChwKGkNQNm9ocERsM0pFREZab19yUVlkUjdBejVn',
  author: {
    name: '@IoTLT',
    thumbnail: {
      url: 'https://yt4.ggpht.com/ytc/AIdro_nDqtFx_eiqB0KmdtSlWHrMnLYUo_rDkX9lvdNR5v4EHA=s64-c-k-c0x00ffffff-no-rj',
      alt: '@IoTLT'
    },
    channelId: 'UCE8qgjhgQVEdxmVa6hIAieA'
  },
  message: [ { text: 'テスト' } ],
  isMembership: false,
  isOwner: true,
  isVerified: false,
  isModerator: false,
  timestamp: 2025-12-27T03:08:12.528Z
}
[@IoTLT]: テスト
{
  id: 'ChwKGkNPRHM3T2ZtM0pFREZZdkJ3Z1FkQy04WTV3',
  author: {
    name: '@IoTLT',
    thumbnail: {
      url: 'https://yt4.ggpht.com/ytc/AIdro_nDqtFx_eiqB0KmdtSlWHrMnLYUo_rDkX9lvdNR5v4EHA=s64-c-k-c0x00ffffff-no-rj',
      alt: '@IoTLT'
    },
    channelId: 'UCE8qgjhgQVEdxmVa6hIAieA'
  },
  message: [ { text: 'テスト' } ],
  isMembership: false,
  isOwner: true,
  isVerified: false,
  isModerator: false,
  timestamp: 2025-12-27T03:15:45.098Z
}
[@IoTLT]: こんばんわ
{
  id: 'ChwKGkNJam5xdXJtM0pFREZZakN3Z1Fkd19nUElB',
  author: {
    name: '@IoTLT',
    thumbnail: {
      url: 'https://yt4.ggpht.com/ytc/AIdro_nDqtFx_eiqB0KmdtSlWHrMnLYUo_rDkX9lvdNR5v4EHA=s64-c-k-c0x00ffffff-no-rj',
      alt: '@IoTLT'
    },
    channelId: 'UCE8qgjhgQVEdxmVa6hIAieA'
  },
  message: [ { text: 'こんばんわ' } ],
  isMembership: false,
  isOwner: true,
  isVerified: false,
  isModerator: false,
  timestamp: 2025-12-27T03:15:50.306Z
}
[@IoTLT]: ども
{
  id: 'ChwKGkNKUHVtdl9tM0pFREZVYlB3Z1FkS3V3cHhn',
  author: {
    name: '@IoTLT',
    thumbnail: {
      url: 'https://yt4.ggpht.com/ytc/AIdro_nDqtFx_eiqB0KmdtSlWHrMnLYUo_rDkX9lvdNR5v4EHA=s64-c-k-c0x00ffffff-no-rj',
      alt: '@IoTLT'
    },
    channelId: 'UCE8qgjhgQVEdxmVa6hIAieA'
  },
  message: [ { text: 'ども' } ],
  isMembership: false,
  isOwner: true,
  isVerified: false,
  isModerator: false,
  timestamp: 2025-12-27T03:16:34.079Z
}
[@IoTLT]: こんにいてゃ
{
  id: 'ChwKGkNJSzlrTVhwM0pFREZXX0N3Z1Fkc193eVJ3',
  author: {
    name: '@IoTLT',
    thumbnail: {
      url: 'https://yt4.ggpht.com/ytc/AIdro_nDqtFx_eiqB0KmdtSlWHrMnLYUo_rDkX9lvdNR5v4EHA=s64-c-k-c0x00ffffff-no-rj',
      alt: '@IoTLT'
    },
    channelId: 'UCE8qgjhgQVEdxmVa6hIAieA'
  },
  message: [ { text: 'こんにいてゃ' } ],
  isMembership: false,
  isOwner: true,
  isVerified: false,
  isModerator: false,
  timestamp: 2025-12-27T03:27:57.586Z
}

過去コメントが全て取れてそうですね。

一件のコメントだと以下。

[@IoTLT]: こんにいてゃ
{
  id: 'ChwKGkNJSzlrTVhwM0pFREZXX0N3Z1Fkc193eVJ3',
  author: {
    name: '@IoTLT',
    thumbnail: {
      url: 'https://yt4.ggpht.com/ytc/AIdro_nDqtFx_eiqB0KmdtSlWHrMnLYUo_rDkX9lvdNR5v4EHA=s64-c-k-c0x00ffffff-no-rj',
      alt: '@IoTLT'
    },
    channelId: 'UCE8qgjhgQVEdxmVa6hIAieA'
  },
  message: [ { text: 'こんにいてゃ' } ],
  isMembership: false,
  isOwner: true,
  isVerified: false,
  isModerator: false,
  timestamp: 2025-12-27T03:27:57.586Z
}

ターミナルにアイコンも表示してみる

iTerm2などだと画像表示ができるとのことで、以下のパッケージを試してみました。

import { LiveChat } from "youtube-chat";
import terminalImage from "terminal-image";

const VIDEO_ID = "_JOMjRiTs2X"; //LiveのID
const liveChat = new LiveChat({ liveId: VIDEO_ID });

liveChat.on("chat", async (chatItem) => {
    const message = chatItem.message.map(m => m.text).join("");
    const author = chatItem.author.name;
    const thumbnailUrl = chatItem.author.thumbnail.url;

    try {
        const response = await fetch(thumbnailUrl);
        const arrayBuffer = await response.arrayBuffer();
        const buffer = Buffer.from(arrayBuffer);
        
        const image = await terminalImage.buffer(buffer, { width: 3, height: 2 });
        
        // 画像とテキストの間に少しスペースを入れる
        console.log(`${image} [${author}]: ${message}`);
    } catch (err) {
        console.log(`[${author}]: ${message}`);
    }
});

liveChat.on("error", (err) => console.error("エラー:", err));

console.log(`iTerm2で監視中...`);
liveChat.start();

初回実行でアラートが出ます。YESにしましょう。

CleanShot 2025-12-27 at 12.48.26.png

VS Codeの中のターミナルだと表示されないですが、iTerm2だと以下のようにコメントが表示されます。

CleanShot 2025-12-27 at 12.56.47.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?