Skip to content

Instantly share code, notes, and snippets.

@yuta0801
Last active May 31, 2023 15:47
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuta0801/2e3cd3581f078d4a0f68ff3e3953c513 to your computer and use it in GitHub Desktop.
Save yuta0801/2e3cd3581f078d4a0f68ff3e3953c513 to your computer and use it in GitHub Desktop.
YouTubeLiveChatを取得する

YouTubeライブチャットを取得する

注意:ライブラリなどを使用すれば更にかんたんに安定に取得できる可能性がありますが、

ここではライブラリを使わずにAPIKEYだけで使えるAPIのみで取得することを優先しています

1, ライブIDを取得する

この工程は省略できますが、毎回IDを教えて上げる必要があります。

URL
get https://www.googleapis.com/youtube/v3/search?
      eventType=live&
      part=id&
      channelId=(チャンネルID)&
      type=video&
      key=(APIキー)

帰ってくるJSONの(json).items[0].id.videoIdにIDがあるのである場合は次に進む

2, チャットIDを取得する

この工程は省略できますが、毎回IDを教えて上げる必要があります。

URL
get https://www.googleapis.com/youtube/v3/videos?
		part=liveStreamingDetails&
		id=(1で取得したライブID)&
		key=(APIキー)

帰ってくるJSONの(json).items[0].liveStreamingDetails.activeLiveChatIdにIDがあるのである場合は次に進む

3, チャットを含むデータを取得する

基本的にこれを一定時間ごとに叩く

get https://www.googleapis.com/youtube/v3/liveChat/messages?
		liveChatId=(2で取得したチャットID)&
		part=authorDetails,snippet&
		hl=ja&
		maxResults=2000&
		key=(APIキー)

ってくるJSONの(json).itemsに取得できる全てのチャットがあるので、

for文などで回し、最後に取得したチャットの日付を記録し新しいかどうかで判断する

以下、JSによる例

var time = 0; // この変数に読んだコメントのUNIXを入れてそれより古いものを弾くから最初に現在時刻を入れておけば以前のは弾かれる
for (var i = 0; i < (json).items.length; i++) {
  var item = json.items[i];
  time = new Date(item.snippet.publishedAt).getTime();
  if (lastRead < time) {
    lastRead = time;
    console.log(item);
  }
}

items[i].snippet.publishedAtISO 8601(YYYY-MM-DDThh:mm:ss.sZ) フォーマットの投稿時間。

チャットを取得する

3で選別したそれぞれのitemについての話

メッセージ:(item).snippet.textMessageDetails.messageText

ユーザー名:(item).authorDetails.displayName

その他詳細:https://developers.google.com/youtube/v3/live/docs/liveChatMessages

スーパーチャットを取得する

3で選別したそれぞれのitemの内スーパーチャットについての話

スーパーチャットかどうか:(item).type == "superChatEvent" (string) スーパーチャットでない場合以下の項目はありません

金額:(item).superChatDetails.amountMicros (unsigned long) (購入通貨のマイクロ単位) 例:購入金額が1ドルの場合、1000000です。

通貨:(item).superChatDetails.currency (string) (ISO 4217)[https://en.wikipedia.org/wiki/ISO_4217] で定められた通貨コード

表示用文字列:(item).superChatDetails.amountDisplayString (string) 購入金額と通貨を含む$ 1.00のような文字列。

コメント:(item).superChatDetails.userComment (string) ユーザーがスーパーチャットに含めたコメント

階層:(item).superChatDetails.tier (unsigned integer) YouTubeが定めたランクのようなもの。YouTubeUIで一定金額ごとに色が変わったり強調されたりする 触ってみるとわかる。送信しなくてもプレビュー出来るから一度見てみると良い(自分のライブで出来るかはわからない)

何かあったら気軽に質問してください

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment