ニコニコ生放送のコメントを取る
タイムシフトは知らん
WSAPIに繋ぐ
https://live2.nicovideo.jp/watch/lvXXXXXXXXXにアクセスしてHTMLを取ってくる
(スマホアプリが使ってる JSON API もあるがそっちは user_session 必須)
script#embedded-data の data-props を取る
JSONとしてパースする
site.relive.webSocketUrl を取る
たまにメジャーバージョンが変わって破壊的変更をされるっぽいので wsapi/v2/ が含まれているか確認しておいたほうがいいかも
↑のURLにWebSocketで繋ぐ
こういうJSONを送る
code:json
{
"type": "startWatching",
"data": {
"stream": {
"quality": "low",
"protocol": "hls",
"latency": "high"
},
"room": {
"protocol": "webSocket",
"commentable": false
},
"reconnect": false
}
}
なんかいろいろJSONが帰ってくるがコメントを取りたいなら"type": "room" なやつを引く
code:json
{
"type": "room",
"data": {
"name": "アリーナ",
"messageServer": {
"uri": "wss://msgd.live2.nicovideo.jp/websocket",
"type": "niwavided"
},
"threadId": "M.ランダムな英数字",
"isFirst": true,
"waybackkey": "waybackkey"
}
}
これで WSAPI は用無しなはず
コメントサーバーに繋ぐ
さっきもらった data.messageServer.uri にWebSocketを繋ぐ
WebSocketのsubprotocolとして msg.nicovideo.jp#json を指定しないといけない
こういうJSONを送る
code:json
[
{
"thread": {
"thread": "さっきもらったスレッドID",
"version": "20061206",
"user_id": "guest",
"res_from": -150,
"with_global": 1,
"scores": 1,
"nicoru": 0
}
}
]
user_idはログインしてないならguest、ログインしてるならユーザーID?
あんまり意味があるのかわからない
必要に応じて {"ping": {"content": "任意の文字列"}}を配列に追加できる
これはそのまま帰ってくる
{"thread": {...}}の前後に追加してどこまでが過去ログか判断するのとかに使える
いろいろJSONが降ってくる
code:js
{
"anonymity": 1, // 184かどうか?たぶん
"content": "コメント内容",
"date": 1610979171, // UNIXタイムスタンプ
"date_usec": 884877,
"mail": "184",
"thread": "スレッドID",
"user_id": "ユーザーID(184ならランダムな英数字、そうじゃないならnico.ms/user/xxxに入れて飛べるID)",
"premium": 1, // 一般会員の場合はなくなる、3だと放送主?
"no": 1, // 公式生だとない
"vpos": 11111
}
Tips: 公式生かどうかの判断方法
WSAPIは公式生とユーザー生(含むチャンネル?)で別鯖っぽい
WSAPIのURLに unama/ って入ってたらユーザー生放送
埋め込みプレーヤーについて (https://ext.live2.nicovideo.jp/watch/lvXXXXXXXX)
公式生だけ使える
https://live2.nicovideo.jp/api/v2/programs/lvXXXXXXXX/external.json?cache_busting=1611013133272&websocket=v2を叩いてる
ここで公式生じゃないと403 (domain not allowed で弾かれる)
domainとは?
WSAPIのURLはwss://a.live2.nicovideo.jp/wsapi/v2/watch/broadcastId?audience_token=audience_token&frontend_id=88