ニコニコ実況 過去ログ 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 までのすべての過去ログに加え、コミュニティでの実況番組も含めた新ニコニコ実況、さらに 2024/06/10 からは実況用代替コメントサーバーである NX-Jikkyo の当日分の過去ログを5分に1回収集し、取得したデータを XML 形式や JSON 形式で提供する、非公式の過去ログデータベース API です。
比較的簡単に利用できるようにしているつもりですが、いくつか注意事項もあります。利用される際は下記の 機能・注意事項 をよく読んだ上でご利用ください。
/nicoad や /emotion のようなコマンド付きコメント)も含まれます。/nicoad からメッセージだけ取り出して固定コメントとして描画したり…といった実装が別途必要になります。/\/[a-z]+ / で判定できると思います。<packet></packet> 、JSON なら {"packet": []} のようなレスポンスになります。
データをリクエストする際のベースとなる 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 形式に変換して出力します。 |
取得した XML・JSON データは以下の定義に基づいて構成されています。(プロパティ名は順不同)
文字コードは UTF-8(BOMなし)、改行コードは LF です。
| プロパティ名 | 内容 | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| packet |
すべてのコメントデータがくるまれている親要素。
|
||||||||||||||||||||||||||||
| 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 は指定された期間の過去ログをそのまま出力しているため、必ずしも 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>
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": "ハンケチ用意"
}
},
(以下コメントが続く)
]
}