ニコニコ動画のAPI一覧

これは、[NicoClient](https://github.com/AnmotiProjects/NicoClient)というTypeScript製のニコニコ動画のラッパーを開発する際のメモ書きです。
随時追加していきます。

# 注意
ここに載っているAPIの大半は公表されていないAPIです。
**自己責任で使用して下さい。**

ニコニコ動画のサーバーに負担がかからないよう、リクエストは最小限にとどめるなど節度を持った利用をしましょう。
また、UserAgentを適切に指定しましょう。
例: `<実装するソフトウェアとかの名前>/<バージョン> <開発者のメール> niconico/<ニコニコのユーザーID>`

`*`が付いたヘッダやパラメーターなどは必須です。
付いていないものは必須では有りませんが、取得できるデータが少なくなったりします。

githubのリンク先でanyとなっているものは筆者が確認できていないデータです。
もしそのデータが確認できた場合は教えてくれたら追記します。

間違っていたら教えて下さい。

# nicovideo.jp
多くの場合、以下のような値を指定しないと INVALID_PARAMETER(400) と怒られます。
指定しましょう
`Frontend-Id`と`Frontend-Version`は必須です。
他はなくてもいいですが、あったので一応書いておきます。

```yml
X-Frontend-Id: 2
X-Frontend-Version: 9.46
X-Niconico-Language: ja-jp
X-Client-Os-Type: others
```
いくつかのapiでしか確認をしていませんが、以下のようなパラメーターを指定することでも大丈夫なようです。
`_frontendId`: 2
`_frontendVersion`: 9.46

多くのサンプルコードの場合`X-Frontend-Version`は整数ですが、
後述する [nvapi.nicovideo.jp/v1/hello](#v1hello) で整数だと`INVALID_PARAMETER(400)`が返されるので小数点付きの方がよいと思います。
執筆時点(2024/05/09)のWeb版は以下を使用していました。

```yml
X-Frontend-Id: 70
X-Frontend-Version: 0
```

### レスポンス
jsonは以下の形式で帰ってきます。
この記事ではmetaは無視してdata以下を記述しています。
```typescript
{
    "meta": {
        "status": 200,
        "id"?: string,
        "errorCode"?: string,
        "errorMessage"?: string,
    }
    "data": {
        /* ... */
    }
}
```

### Cookie
ニコニコ動画のアカウント認証は`user_session`という値が使用されます。
二段階認証を設けている場合でもこの値だけです。
```yml
Cookie: user_session=user_session_<userid>_<token>
```

### ActionTrackID
ActionTrackIDはコメントなどを取得する際に使用される値です。
リクエストごとにランダムな値を生成する必要があります。
ActionTrackIDは `<英数字>_<数字>` の値です。
英数字と数字は一文字以上であれば何でもよさそうです。
だた、実際のリクエストでは `<英数字10桁_UnixTime>` が使われているのでそれを使います。

## *www*.nicovideo.jp

### api/watch/v3(_guest)/
動画情報を取得するapiです。
`https://www.nicovideo.jp/api/watch/v3/<videoID>`(ログイン必須)
`https://www.nicovideo.jp/api/watch/v3_guest/<videoID>`
Method: GET POST PUT PATCH DELETE
Header: 
`X-Frontend-Id`*
`X-Frontend-Version`*
Param:
`actionTrackId`*: [actionTrackID](#actiontrackid)
Response: [VideoInfo.www.d.ts](https://github.com/AnmotiProjects/NicoClient/blob/main/src/NicoClient/wrapper/types/NicoVideoJP/VideoInfo.www.d.ts)
media系は飛ばしてるところがありますが、きちんと理解したら追記します。
こちらも参考になるかと [ニコ動 動画情報取得API サンプルレスポンス](https://gist.github.com/Negima1072/8d3abe48e9c2690b459da9cefcd0e89c)

`api/watch/v3/`でログインすることで各`viewer`の値が確認できるようになります。
`api/watch/v3_guest/`では各`viewer`の値は`null`になります。

## nvapi.nicovideo.jp

### v1/hello
アプリのアップデートを確認するapiです。
`https://nvapi.nicovideo.jp/v1/hello`
Method: GET
Header: 
`X-Frontend-Id`*
`X-Frontend-Version`* - 小数点以下がないとだめ
Param:
`osVersion`: `15.8.2`(exam)
\- iOSだとシステムのバージョンだったけど他は確認してない

```typescript:Response
data: {
    "version": {
    "isUpdateRequired": false,
    // アプリにアップデートが必要かどうか(X-Frontend-Version)が最新かどうか
    "isOSUpdateRequired"?: false,
    // OSにアップデートが必要かどうか(osVersion指定時のみ)
    }
}
```

## account.nicovideo.jp
`secure.nicovideo.jp`は`account`と内容は同じだと思います(パスは違う)。
もし違う点があった場合は随時書きますが、今のところ書く予定はありません。

### login/redirector
ニコニコ動画にメール(電話番号?)とパスでログインするapiです。
Cookieで取得できます。
`https://account.nicovideo.jp/login/redirector`
執筆予定...
(2段階認証のログインも執筆予定)

RestAPIでセッションを取得する方法はなさそうです。

### api/public/v2/user.json
アカウントの個人情報とかを取得するapiです。
`https://account.nicovideo.jp/api/public/v2/user.json`
執筆予定...

Response: [AccountInfo.account.d.ts](https://github.com/AnmotiProjects/NicoClient/blob/a027132f8fb6ea16bee0a2a3ff924d075f0418e4/src/NicoClient/wrapper/types/NicoVideoJP/AccountInfo.account.d.ts)

### api/v1/register/account_passport
ゲストアカウントを新規作成するapiです。
`https://account.nicovideo.jp/api/v1/register/account_passport`

以下が参考になると思います。
[Nicoaccount-Signature/register.py](https://github.com/popo-nyan/Nicoaccount-Signature/blob/master/register.py)
Cryptoとかよくわかってないので、NicoClientには未実装です。
実装するかもですが

## snapshot.search.nicovideo.jp
公開されてるAPIです。
サーバーに負荷がかからないようにできるだけこのapiから取得する方が良いでしょう。
詳しくは以下に記載されています。

https://site.nicovideo.jp/search-api-docs/snapshot

### api/v2/snapshot/video/contents/search
ニコニコ動画のスナップショットから動画を検索するapiです。

### api/v2/snapshot/version
スナップショットの最終更新日時を取得するapiです。

# nimg.jp

## dcdn.cdn.nimg.jp

### nicovideo/old-ranking/
ニコニコ動画の過去ランキングを取得するapiです。
詳しくは以下を参照してください。

https://dwango.github.io/niconico/genre_ranking/ranking_log/

# 参考
https://qiita.com/vram/items/0b14bc800ce8fd69b70d
https://zenn.dev/negima1072/articles/nvcomment-api
https://github.com/popo-nyan/Nicoaccount-Signature
https://site.nicovideo.jp/search-api-docs/snapshot