nvcomment (ニコニコ動画の新コメントサーバー)
2022年前半から各公式クライアントが /legacy/ から /v1/ の新APIに移行している
2024-02-18 更新: nvcomment.nicovideo.jp 下で提供されていた旧コメントAPIは死んだ
今は nv-comment.nicovideo.jp だけがあり、こちらは /legacy/ 非対応
URL
この後に /api/ とか /api.json/ を付ける
現在で新コメントサーバーになっている動画
コメントが多い順で移動している?
一例
https://nicothumb2img.vercel.app/image/sm2057168#.png https://nico.ms/sm2057168 https://nicothumb2img.vercel.app/image/sm125732#.png https://nico.ms/sm125732
変わった挙動
/api.json/ 系APIで Content-Type が application/json になった (以前は text/json; charset=UTF-8)
Firefox の JSON ビューワが使えるようになって便利
レートリミットが付いた
現時点では1分以内に60回の呼び出しで引っかかる
カウントはグローバルIPアドレスごと
同じグローバルIPから出る複数人でニコニコ動画を見まくってると早く引っかかる?
HTTPヘッダーの X-RateLimit-Remaining と X-RateLimit-Limit で取得できる
レートリミットにひっかかると HTTP 429 {"meta":{"status":429,"errorCode":"TOO_MANY_REQUESTS"}} が返るようになる
ひっかかった場合HTTPヘッダー X-RateLimit-Reset が付くようになる
中身はリセットタイミングのUNIXタイムスタンプ
e.g. 1626690016
レートリミットは /legacy/api/* と /legacy/api.json/* で共通、それ以外のパスは未対象?
今のところHTML5プレーヤーでは 429 が帰ってきても特別扱いはしていない
が、そもそもエラーになった時は「時間を置いて再度お試しください」って出るので結果的にいい感じになっている
マイナスの値を res_from に指定した時(最新n件)に指定した数のコメントが帰ってこないことがある?
例: res_from=-1000で700件分のコメントしか降ってこない
res_fromで指定した分より多くは帰ってこないっぽい
内部的に thread_leaves 相当に変換されている?
leaf がほぼ廃止された
昔 (nmsg)
code:json
[
{
"leaf": {
"thread": "1200505028",
"leaf": 1,
"count": 1867225
}
},
{
"leaf": {
"thread": "1200505028",
"leaf": 2,
"count": 1298606
}
},
// ...
]
今 (nvcomment)
code:json
[
{
"leaf": {
"thread": "1200505028",
"count": 22954837
}
}
]
leaf.leaf が消えている
threadのclick_revision が消えた (@ボタン関連)
threadのticket が 0x1234abcd 形式だったのがただのタイムスタンプっぽい文字列 e.g. 1625914478 になった
retr_from が無視されるようになった
HTTPヘッダーの差分
昔
code:http
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,HEAD
Access-Control-Allow-Headers: Content-Type
Vary: Accept-Encoding
Cache-Control: no-store
Pragma: no-cache
Content-Encoding: gzip
Content-Type: text/json; charset=UTF-8
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
今
code:http
Server: nginx
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: no-cache, private
Date: Mon, 19 Jul 2021 10:28:57 GMT
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
Access-Control-Allow-Origin: *
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Content-Encoding: gzip
diff
code:diff
-Access-Control-Allow-Headers: Content-Type
-Access-Control-Allow-Methods: POST,GET,OPTIONS,HEAD
Access-Control-Allow-Origin: *
-Cache-Control: no-store
-Connection: Keep-Alive
+Cache-Control: no-cache, private
+Connection: keep-alive
Content-Encoding: gzip
-Content-Type: text/json; charset=UTF-8
-Keep-Alive: timeout=15, max=100
-Pragma: no-cache
+Content-Type: application/json
+Date: Mon, 19 Jul 2021 10:28:57 GMT
+Server: nginx
+Transfer-Encoding: chunked
Vary: Accept-Encoding
+X-Content-Type-Options: nosniff
+X-Frame-Options: SAMEORIGIN
+X-RateLimit-Limit: 60
+X-RateLimit-Remaining: 59
OPTIONS リクエスト時でも 他の Access-Control-Allow-* は付いてこない
CORSに影響される環境では preflight request が飛ばないようにContent-Type を text/plain にする必要がある