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

About

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

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

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

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

この API は、そうしたニコニコ実況の過去ログを取り巻く現状を改善すべく、Nekopanda 氏が配布されている旧ニコニコ実況の 2020/12/15 までのすべての過去ログに加え、コミュニティベースの番組も含めた新ニコニコ実況の当日分の過去ログを5分に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・jk252・jk260・jk263・jk265・jk333 ) 、地デジ独立局 ( jk10・jk11・jk12 ) の過去ログも収集しています。
    • 5分に1回、当日分の全チャンネルの過去ログを自動で収集します。
      • 収集は5分に1回のため、たとえば 17:02 に終わった番組の過去ログを直後の 17:03 に取得する、といったことはできません。
      • 17:00 ~ 17:05 の過去ログの収集が終わる 17:05 以降(実際は収集に 3 分ほどかかるため 17:08 以降)まで待つ必要があります。
      • コミュニティベースの実況チャンネルでは必ずしも24時間放送されているわけではないため、そのコミュニティで番組が放送されていない時間帯のコメントは取得できません。
    • レスポンスには運営コメント( /nicoad/emotion のようなコマンド付きコメント)も含まれます。
      • 運営コメントをレスポンスに含めるべきかかなり悩みましたが、元データの段階で運営コメントを取り除いてしまうと後から運営コメントが必要になっても手遅れになってしまうので、それよりかはいいかなーと判断しました。
      • このため、API を利用するクライアントソフト側で運営コメントをすべて弾いたり、/nicoad からメッセージだけ取り出して固定コメントとして描画したり…といった実装が別途必要になります。
      • 正規表現なら /\/[a-z]+ / で判定できると思います。
  • 指定された期間の過去ログが存在しない場合は空の packet が返されます。
    • たとえば 2009年11月26日(ニコニコ実況のリリース日)よりも前の時刻などです。また、新しく開局したチャンネルで、開局前の時刻を指定したときも同じく空の packet が返されます。
    • これ以外にも、指定された日付のコメント自体は存在するが、指定された時刻で絞り込むとその期間内にコメントが 1 件も投稿されていなかった、といった場合にも発生します(コメントの少ない早朝や昼間、BS チャンネルに多い)。
    • 具体的には、XML なら <packet></packet> 、JSON なら {"packet": []} のようなレスポンスになります。
    • エラーにはならないので、もし 1 件も過去ログを取得できなかった場合にエラーにしたい場合は、適宜 API クライアント側で 1 件でもコメントを取得できているか確認するような実装にしてください。
  • レスポンスの 文字コードは UTF-8(BOMなし)、改行コードは LF です。ツール等で利用する際は注意してください。
  • 3日分を超えるコメントを一度に取得することはできません。数日分かに分けて取得するようにしてください。
  • 万全は期しているつもりですが、突貫工事で作ったため修正できていない不具合があるかもしれません。
  • 一個人が運営している非公式 API です。ニコニコ公式とは一切関係ありません。
  • 過去ログデータを除いたコードは GitHub にて公開しています。なにか不具合があれば Issues へお願いします。
    • 未検証ですが、自分のサイトでこの API をホストすることも可能です。
  • 5分おきに収集した過去ログデータは KakologArchives (Hugging Face) にて公開しています。
    • この API も KakologArchives リポジトリから過去ログデータを取得しています。
    • 以前はサーバーのローカルディスクに保存された過去ログデータを出力していましたが、サーバーのディスク容量を 170GB 近く消費することから自宅サーバーで運用せざるを得ず、安定性に問題を抱えていました。
    • Hugging Face から過去ログデータを取得するように変更し、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日分を超えるコメントを一度に取得することはできません。数日分かに分けて取得するようにしてください。
Hugging Face で障害が発生しているため、過去ログを取得できません。(HTTP Error xxx) 障害が発生しているなどの理由により、Hugging Face のサーバーにアクセスできなかったときに起きるエラーです。
出力元の過去ログデータは Hugging Face から取得しているため、Hugging Face で障害が発生している間は過去ログを取得できません。

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": "ハンケチ用意"
            }
        },
        (以下コメントが続く)
    ]
}