チャンネル
日付
時刻
日付
時刻

About

ニコニコ実況 過去ログ APIは、ニコニコ実況の過去ログを XML や JSON データで提供しています。

去る 2020 年 12 月、ニコニコ実況はニコニコ生放送内の一公式チャンネルとしてリニューアルされました。
これに伴い、2008 年 11 月から運用されてきた旧システムは提供終了となり(事実上のサービス終了)、torne や BRAVIA などの家電への対応が軒並み終了する中、当時の生の声が詰まった約 12 年分の過去ログも同時に失われることとなってしまいました。

そこで 5ch の DTV 板の住民が中心となり、旧ニコニコ実況が終了するまでに 12 年分の全チャンネルの過去ログをアーカイブする計画が立ち上がりました。紆余曲折あり Nekopanda 氏が約 12 年分のラジオや BS も含めた全チャンネルの過去ログを完璧に取得してくださったおかげで、12 年分の過去ログが電子の海に消えていく事態は回避できました。
しかしながら、旧 API が廃止されてしまったため過去ログを API 経由で取得することができなくなり、またアーカイブされた過去ログから見たい範囲のログを探す場合も、アーカイブのサイズが合計約 150GB もあることから、とても以前のように手軽に過去ログに触れることはできなくなってしまいました。

一方、ニコニコ生放送内の一公式チャンネルとして移行した新ニコニコ実況では、タイムシフト(旧ニコニコ実況での過去ログに相当)の視聴期限は 3 週間までとなっているため、その期限を過ぎると過去ログは視聴できなくなってしまいます。また一般会員は事前にタイムシフト予約をしておく必要があるなど、以前のような利便性は失われています。

この API は、そうしたニコニコ実況の過去ログを取り巻く現状を改善すべく、Nekopanda 氏が配布されている旧ニコニコ実況の 2020/12/15 までの全過去ログに加え、15 分に 1 回コミュニティからの番組も含めた新ニコニコ実況の当日分の過去ログを自動で収集し、取得したデータを XML 形式や JSON 形式で提供する、非公式過去ログデータベース API です。
比較的簡単に利用できるようにしているつもりですが、いくつか注意事項もあります。利用される際は下記の 機能・注意事項 をよく読んだ上でご利用ください。

機能・注意事項

  • 2020 年 12 月 15 日までに投稿された旧ニコニコ実況の全ての過去ログを取得できます。
  • 2020 年 12 月 16 日以降に投稿された新ニコニコ実況の全ての過去ログを取得できます。
    • 新ニコニコ実況の過去ログデータは自作の JKCommentCrawler を利用して収集しています。
    • 公式チャンネル ( jk1・jk2・jk4・jk5・jk6・jk7・jk8・jk9・jk101・jk211 ) の放送に加えて、公式では廃止され、現在は 有志のコミュニティ から放送されている NHK BS1・BS11 以外の BS・CS 各局 ( jk103・jk141・jk151・jk161・jk171・jk181・jk191・jk192・jk193・jk222・jk236・jk333 ) 、地デジ独立局 ( jk10・jk11・jk12 ) の過去ログも収集しています。
    • 15 分に 1 回、当日分の全チャンネルの過去ログを自動で収集します。
      • その関係で、たとえば 17:05 に終わった番組の過去ログを直後の 17:06 に取得する、といったことはできません。
      • 17:00 ~ 17:15 の過去ログの収集が終わる 17:15 以降(実際は実行に 3 分ほどかかるため 17:18 以降)まで待つ必要があります。
      • コミュニティからの実況番組は 24 時間放送されているわけではないため、放送されていない時間帯のコメントは取得できません。
    • レスポンスには運営コメント( /nicoad/emotion のようなコマンド付きコメント)も含まれます。
      • 運営コメントをレスポンスに含めるべきかかなり悩みましたが、元データの段階で運営コメントを取り除いてしまうと後から運営コメントが必要になっても手遅れになってしまうので、それよりかはいいかなーと判断しました。
      • このため、API を利用するクライアントソフト側で運営コメントを全て弾いたり、/nicoad からメッセージだけ取り出して固定コメントとして描画したり…といった実装が別途必要になります。
      • 正規表現なら /\/[a-z]+ / で判定できると思います。
  • 指定された期間の過去ログが存在しない場合は空の packet が返されます。
    • 例えば 2008 年 11 月 26 日(ニコニコ実況のリリース日)よりも前の時刻や、現在時刻よりも未来の時刻などです。
    • 上記以外にも、指定された日付のコメント自体は存在するが、時刻で絞り込むとその期間内にコメントが 1 件も投稿されていなかった、といった場合にも発生します(コメントの少ない早朝や昼間、BS チャンネルに多い)。
    • 具体的には、XML なら <packet></packet> 、JSON なら { "packet": [] } のようなレスポンスになります。
    • エラーにはならないので、もし 1 件も過去ログを取得できなかった場合にエラーにしたい場合は、適宜クライアントソフト側で 1 件でもコメントを取得できているか確認するような実装にしてください。
  • レスポンスの 文字コードは UTF-8(BOMなし)、改行コードは LF です。ツール等で利用する際は注意してください。
  • 3日分を超えるコメントを一度に取得することはできません。数日分かに分けて取得するようにしてください。
  • 万全は期しているつもりですが、突貫工事で作ったため修正できていない不具合があるかもしれません。
  • サーバーは 3 時と 15 時に再起動します。その関係で、再起動後 2 ~ 3 分は API にアクセスできなくなります。
  • 一個人が運営している非公式 API です。ニコニコ公式とは一切関係ありません。
  • 過去ログデータを除いたコードは GitHub にて公開しています。なにか不具合があれば Issues へお願いします。
    • 未検証ですが、自分のサイトでこの API をホストすることも可能です。

リクエストパラメータ

データをリクエストする際のベースとなる URL は以下になります。
https://jikkyo.tsukumijima.net/api/kakolog/{実況ID}
この URL に下の表のパラメータを加え、実際にリクエストします。

パラメータ名 説明
{実況ID} ニコニコ実況のチャンネル ID を表します。URL 自体に含めてください。
例: NHK総合 → jk1・BS11 → jk211
starttime 取得を開始する時刻の UNIX タイムスタンプを表します。
endtime 取得を終了する時刻の UNIX タイムスタンプを表します。
format 出力するフォーマットを表します。xml( XML 形式)または json( JSON 形式)のいずれかを指定します。
XML 形式では過去ログをヘッダーをつけた上でそのまま出力します。
JSON 形式では過去ログをニコニコ動画のコメント API のレスポンスと類似した形態の JSON 形式に変換して出力します。
(例)「 2020/11/27 08:00:00 ~ 2020/11/27 08:15:00 の NHK総合の XML 形式のコメント」を取得する場合
下記 URL にアクセスしてデータを取得します。
基本 URL + 2020/11/27 08:00:00 のタイムスタンプ + 2020/11/27 08:15:00 のタイムスタンプ + フォーマット (xml)
UNIX タイムスタンプの計算は Unixtime相互変換ツール のサイトが使いやすいです。
https://jikkyo.tsukumijima.net/api/kakolog/jk1?starttime=1606431600&endtime=1606432500&format=xml

レスポンスフィールド

取得した XML・JSON データは以下の定義に基づいて構成されています。(プロパティ名は順不同)
文字コードは UTF-8(BOMなし)、改行コードは LF です。

プロパティ名 内容
packet
全てのコメントデータがくるまれている親要素。
プロパティ名 内容
chat
コメントデータ。
取得した過去ログをそのまま出力しているため、一部のコメントにしか存在しないプロパティもあります。
プロパティ名 内容
thread コメントのスレッド ID
no コメント番号(コメ番)
vpos スレッド ID から起算したコメントの再生位置(1/100秒)
date コメント投稿時間の UNIX タイムスタンプ
date_usec コメント投稿時間の小数点以下の時間 コメント投稿時間の正確なタイムスタンプは
date: 1606431600・date_usec: 257855 なら 1606431600.257855 のようになる
user_id ユーザー ID(コマンドに 184 が指定されている場合は匿名化される)
mail コメントのコマンド(184, red naka big など)
premium コメントしたユーザーがプレミアム会員であれば 1
anonymity 匿名コメントであれば 1
content コメント本文( XML 形式では chat 要素自体の値)
AA など、まれに複数行コメントがあるので注意
error エラーメッセージ(エラー発生時のみ)。指定されたフォーマットに合わせて出力されますが、
存在しないフォーマットが指定されたりパラメータが不足している場合には常に JSON 形式で出力されます。
エラーメッセージ 説明
必要なパラメータが存在しません。 リクエストパラメータのうちのいずれかが欠けている場合に発生します。
常に JSON 形式で出力されます。
フォーマットは XML または JSON 形式である必要があります。 リクエストパラメータに設定されたフォーマットが xml でも json でもない場合に発生します。
常に JSON 形式で出力されます。
指定された実況 ID は存在しません。 指定された実況 ID が存在しない場合に発生します。
過去一度も存在したことがない実況 ID のみが対象のため、新ニコニコ実況では用意されていないラジオや BS の一部チャンネルを指定した場合でもこのエラーは発生しません。
取得開始時刻または取得終了時刻が不正です。 取得開始時刻・取得終了時刻の UNIX タイムスタンプがマイナスの値や現在時刻より未来の値になっている場合に発生します。
取得開始時刻と取得終了時刻が同じ時刻です。 取得開始時刻と取得終了時刻の UNIX タイムスタンプが同じ値の場合に発生します。
指定された取得開始時刻は取得終了時刻よりも後です。 取得開始時刻の UNIX タイムスタンプが取得終了時刻の UNIX タイムスタンプよりも大きい場合に発生します。
3日分を超えるコメントを一度に取得することはできません。数日分かに分けて取得するようにしてください。 サーバーの処理負荷等の兼ね合いにより、3日分を超えるコメントを一度に取得することはできません。数日分かに分けて取得するようにしてください。

XML データサンプル

XML は指定された期間の過去ログをそのまま出力しているため、必ずしも Valid な XML であるとは限りません(まれに破損している場合がある)。

<packet>
<chat thread="1606417201" no="2750" vpos="1440040" date="1606431601" mail="184" user_id="mmJyd4lCsV6e3loLXR0QvZnlnFI" premium="1" anonymity="1" date_usec="373180">六甲おろし歌って</chat>
<chat thread="1606417201" no="2751" vpos="1440136" date="1606431602" mail="184" user_id="Vz1E1ii0OXV1ApWddfG7niOSYak" anonymity="1" date_usec="183595">キタ━━━━(゚∀゚)━━━━!!</chat>
<chat thread="1606417201" no="2752" vpos="1440100" date="1606431603" mail="184" user_id="HCnCAmVDEac_T_fkeS9EHkymli8" anonymity="1" date_usec="405333">hjmt</chat>
<chat thread="1606417201" no="2753" vpos="1440298" date="1606431603" mail="184" user_id="SxULPQ3aPP4noCUEGj_1GOEjp8Y" anonymity="1" date_usec="965862">完全版はBSで方式やろな</chat>
<chat thread="1606417201" no="2754" vpos="1440400" date="1606431605" mail="184" user_id="2H54YZyR0BLlv8_1XnlYl-euia4" anonymity="1" date_usec="103550">合唱会</chat>
<chat thread="1606417201" no="2755" vpos="1440400" date="1606431605" mail="184" user_id="0ojZYR0_KDaecXFZGnaqwazTU3w" premium="1" anonymity="1" date_usec="540295">コンサート</chat>
<chat thread="1606417201" no="2756" vpos="1440400" date="1606431605" mail="184" user_id="FREZGJEF5OhEaGskb3upsxbxu2c" anonymity="1" date_usec="585768">らすとか</chat>
<chat thread="1606417201" no="2757" vpos="1440404" date="1606431606" mail="184" user_id="JknVYfrFwBy2CDrz_jz8bWb5-hU" premium="1" anonymity="1" date_usec="83051">!?</chat>
<chat thread="1606417201" no="2758" vpos="1440515" date="1606431606" mail="184" user_id="QrzHcVSABkD_JaPWmNzcXYBlzUY" anonymity="1" date_usec="782894">コロナ禍じゃ無かったら結構許されないよな</chat>
<chat thread="1606417201" no="2759" vpos="1440803" date="1606431609" mail="184" user_id="CrwzC_JXPIjjPIBW27W1QVtUc80" anonymity="1" date_usec="16461">ハンケチ用意</chat>
(以下コメントが続く)
</packet>

JSON データサンプル

ASCII の範囲外の文字もエスケープされずに出力されます。
実際のレスポンスではサイズが大きくなってしまうため、下記のような改行やインデントは行われません。

{
    "packet": [
        {
            "chat": {
                "thread": "1606417201",
                "no": "2750",
                "vpos": "1440040",
                "date": "1606431601",
                "mail": "184",
                "user_id": "mmJyd4lCsV6e3loLXR0QvZnlnFI",
                "premium": "1",
                "anonymity": "1",
                "date_usec": "373180",
                "content": "六甲おろし歌って"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2751",
                "vpos": "1440136",
                "date": "1606431602",
                "mail": "184",
                "user_id": "Vz1E1ii0OXV1ApWddfG7niOSYak",
                "anonymity": "1",
                "date_usec": "183595",
                "content": "キタ━━━━(゚∀゚)━━━━!!"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2752",
                "vpos": "1440100",
                "date": "1606431603",
                "mail": "184",
                "user_id": "HCnCAmVDEac_T_fkeS9EHkymli8",
                "anonymity": "1",
                "date_usec": "405333",
                "content": "hjmt"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2753",
                "vpos": "1440298",
                "date": "1606431603",
                "mail": "184",
                "user_id": "SxULPQ3aPP4noCUEGj_1GOEjp8Y",
                "anonymity": "1",
                "date_usec": "965862",
                "content": "完全版はBSで方式やろな"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2754",
                "vpos": "1440400",
                "date": "1606431605",
                "mail": "184",
                "user_id": "2H54YZyR0BLlv8_1XnlYl-euia4",
                "anonymity": "1",
                "date_usec": "103550",
                "content": "合唱会"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2755",
                "vpos": "1440400",
                "date": "1606431605",
                "mail": "184",
                "user_id": "0ojZYR0_KDaecXFZGnaqwazTU3w",
                "premium": "1",
                "anonymity": "1",
                "date_usec": "540295",
                "content": "コンサート"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2756",
                "vpos": "1440400",
                "date": "1606431605",
                "mail": "184",
                "user_id": "FREZGJEF5OhEaGskb3upsxbxu2c",
                "anonymity": "1",
                "date_usec": "585768",
                "content": "らすとか"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2757",
                "vpos": "1440404",
                "date": "1606431606",
                "mail": "184",
                "user_id": "JknVYfrFwBy2CDrz_jz8bWb5-hU",
                "premium": "1",
                "anonymity": "1",
                "date_usec": "83051",
                "content": "!?"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2758",
                "vpos": "1440515",
                "date": "1606431606",
                "mail": "184",
                "user_id": "QrzHcVSABkD_JaPWmNzcXYBlzUY",
                "anonymity": "1",
                "date_usec": "782894",
                "content": "コロナ禍じゃ無かったら結構許されないよな"
            }
        },
        {
            "chat": {
                "thread": "1606417201",
                "no": "2759",
                "vpos": "1440803",
                "date": "1606431609",
                "mail": "184",
                "user_id": "CrwzC_JXPIjjPIBW27W1QVtUc80",
                "anonymity": "1",
                "date_usec": "16461",
                "content": "ハンケチ用意"
            }
        },
        (以下コメントが続く)
    ]
}