ゼッタノート

ゼッタが勉強したことをまとめたノート代わりのブログ。たまに日記になるかも。

youtubeliveのアーカイブで取得できるコメント(チャット)情報について

皆さんくそお久しぶりです。ここのところ学校生活が忙しかったりなんだったりして長らく更新が停滞していましたが、今日から少しずつ更新できたらいいかなと思っています。

そんなお久しぶり一発目はyoutubeliveのアーカイブで取得できるコメントについてです。 今、ブログのネタ用に作るプログラムの下準備をしていて、そのためにアーカイブのコメントを取得する必要があったのですが、この情報が多すぎてなかなか全体を把握しづらい。誰かが取得できる情報をまとめてないかなと思ったのですが、数秒検索して出てこなかったので(短気)まとめておきます。

今回コメントを取得する上で参考にさせていただいたのはこちら

watagassy.hatenablog.com

上のコードで取得すると全て辞書形式になるので

  • key1
    • value1
    • key2
      • value2
  • value3

という風に書いていきます。 値を赤、辞書のキーを青で色付けするので、欲しいデータを赤から探して、上にさかのぼる間に出てきた青色の単語を辞書のキーとして使っていくことで、所望のデータを取ってくることができるはずです。

取れる値早見表

クリックで飛べます

内容
クライアントID
その人のメンバー歴
メンバーアイコンのURL
コメントした人のユーザ名
ユーザアイコンの諸要素
操作の種類
絵文字の諸要素
コメント文
コメントされたときの時間

取れる値について

  • replayChatItemAction(key,string)
    • actions(key, string)(以下リスト)
      • index0
        • addChatitemAction(key, string)
          • clientId(key, string)
            • value(string): クライアントのID
          • item(key, string)
            • liveChatTextMessageRenderer(key, string)
              • authorBadges(key, string)(以下リスト)
                • index0
                  • liveChatAuthorBadgeRenderer(key, string)
                    • accessibility(key, string)
                      • accessibilityData(key, string)
                        • label(key, string)
                          • value(string): その人がメンバーになってどれくらい経ったか(例:'メンバー(7 か月)')
                    • customThumbnail(key, string)
                      • thumbnails(key, string)(以下リスト)
                        • index0
                          • url(key, string)
                            • value(string): メンバーアイコンのurl。index0に16×16のサイズが、index1に32×32が入っている?
                    • tooltip(key, string)
                      • value(string): その人がメンバーになってどれくらい経ったか(例:'メンバー(7 か月)')
              • authorExternalChannnelId(key, string)
                • value(string): なんかのID
              • authorName(key, string)
              • authorPhoto(key, string)
                • thumbnails(key, string)(以下リスト)
                  • <span id="usericon" index0(ユーザアイコンの32×32)
                    • height(key, string)
                      • value(int): ユーザアイコンの高さ
                    • url(key, string)
                      • value(string): ユーザアイコンのURL
                    • width(key, string)
                      • value(string): ユーザアイコンの幅
                  • index1(index0の64×64バージョン。省略)
              • contextMenuAccessibility(key, string)
                • accessibilityData(key, string)
                  • label(key, string)
                    • value(string): 操作の種類(多分)。(例:'コメントの操作')
              • contextMenuEndpoint(key, string)
                • clickTrackingParams(key, string)
                  • value(string): 不明。謎の文字列
                • commandMetadata(key, string)
                  • webCommandMetadata(key, string)
                    • ignoreNavigation(key, string)
                • liveChatItemContextMenuEndpoint(key, string)
                  • params(key, string)
                    • value(string): 不明。めっちゃ長い文字列
              • id(key, string)
                • value(string): 不明。なんかのid
              • message(key, string)
                • runs(key, string)(以下リスト)
                  • index0
                    • emoji(key, string)
                      • emojiId(key, string)
                        • value(string): 絵文字(スタンプ)のid。メンバーだけが使えるやつ
                      • image(key, string)
                        • accessibility(key, string)
                          • accessibilityData(key, string)
                            • label(key, string)
                              • value(string): 絵文字の名前だと思う
                        • thumbnails(key, string)(以下リスト)
                          • index0(絵文字の24×24)
                            • height(key, string)
                              • value(int): 絵文字画像の高さ
                            • url(key, string)
                              • value(string): 絵文字画像URL
                            • width(key, string)
                              • value(int): 絵文字画像の幅
                          • index1(絵文字の48×48。省略)
                      • isCustomEmoji(key, string)
                        • value(Boolean): 配信主が作成したスタンプか(?)
                      • searchTerms(key, string)(以下リスト)
                        • 0(index): 絵文字の名前
                        • 1(index): よく分からない。別名
                      • shortcuts(key, string)(以下リスト)
                        • 0(index): 絵文字投稿時の文字列?(例:':846Mojii:')
                  • index1
                    • text(key, string)
                      • value(string): コメント内容
              • timestampText(key, string)
                • simpleText(key, string)
                  • value(string): コメントされたときの動画時間(H:MM:SS)。マイナスもある
              • timestampUsec(key, string)
                • value(string): コメントされたときの動画時間(マイクロ秒表記?)
    • videoOffsetTimeMsec(key, string)

注意点

なんか不明データばっかでごめんなさい。自分が使いそうなところ以外は注視してないので、後は自分で読み取ってもらえれば...

コメントにあたる、message[runs]について

コメントは1つの連続した文字列は1つのインデックスを、絵文字は1つのインデックスを使用します。どういうことかというと、

  • 絵文字を3つだけ使ったコメントの場合
     インデックスは2まであります

  • 文字だけでコメントした場合
     インデックスは0のみです

  • 文字でコメントした後、絵文字を使った場合。(例:うおおおおお(emoji))
     インデックスは1まであります

という感じです。コメントの文字部分だけ抽出したい場合はキーがemojiとなっている部分を省いてください。

スパチャやメンバー通知について

構造が普通のコメントと違うので注意が必要です。まず、双方ともキー'message'がありません。スパチャにはキー'liveChatTickerPaidMessageItemRenderer'が'message'に代わるようにして存在します。メンバー通知は上でまとめた辞書が丸ごと2つで1セットみたいで、まず、'message'キーが'liveChatMembershipItemRenderer'に代わったもの、次に'liveChatTickerSpnsorItemRenderer'に代わったものが来ます。

また、スパチャも日本円と海外通貨で処理が違うみたいで、日本円は先ほど述べた通りなのですが、海外通貨の場合、メンバー通知のように2つの辞書で1セットらしく、1つ目は'liveChatPaidMessageRenderer'、2つ目が'liveChatTickerPaidMessageItemRenderer'が'message'と入れ替わっています。

自分がこれからしようとしていることに、ここら辺の情報はさほど重要ではないので、その下にどんな情報が入っているのかまでは調べていません。

終わりに

以上がyoutubeliveのアーカイブから取得できるコメント情報でした。かなりの量の情報を取得できますね。いろいろできそうです。

これからアーカイブコメントから何かをしようとしている人の助けになれれば幸いです。