Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ニコニコ動画非公式APIでのコメント取得の覚え書

More than 3 years have passed since last update.

前提知識

動画コメントは動画ページやGetFlvから取得した動画情報(以下FlvResponse)に含まれるメッセージサーバURLにアクセスすることで取得できます。(動画情報取得の参考:http://blog.hitobashira.org/?eid=24)

ただし、通常動画と公式動画等では、取得方法が一部異なります。
取得方法の違いはFlvResponseの needs_key 属性から判別します。

<追記(2017/07/13)>
動画ページの仕様変更により動画ページからのFlvResponseを取得する方法が変わりました。

動画ページ内の #js-initial-watch-data[data-api-data] に格納されてstringをhtmlエンコードすることでFlvResponse相当のjsonが取れます。
コメントのThreadIdは json.video.dmInfo.Thread.Id から、また needs_key は json.video.dmInfo.Thread.ThreadKeyRequired を利用することで差し替えが出来ます。

参考 js-initial-watch-dataのjson構造のC#実装

https://github.com/tor4kichi/OpenNiconico2/blob/master/Mntone.Nico2/Mntone.Nico2.Shared/Videos/WatchAPI/InitialWatchData.cs

参考2 js-initial-watch-dataの取得からパースまで

https://github.com/tor4kichi/OpenNiconico2/blob/master/Mntone.Nico2/Mntone.Nico2.Shared/Videos/WatchAPI/WatchAPIClient.cs

</追記>

なお、ログイン済みのセッションでコメント取得を行わないと接続制限がかかる可能性があるようです。(言及しているページ失念)

通常動画でのコメント取得

通常動画(FlvResponse.needs_key=="0")では、以下のデータをメッセージサーバURLにGET(またはPOST)リクエストを送ることでコメントを取得できます。

通常動画コメントGet
var messageServerUrl = ""; // FlvResponse.ms
var threadId = "";  // FlvResponse.thread_id
var urlWithQuery = $"{messageServerUrl}thread?thread={threadId}&version=20061206&res_from=-1000&scores=1"
実際に取得できるコメントデータの例
<packet>
    <thread resultcode="0" thread="1173108780" last_res="4372356" ticket="0x3623680" revision="524" server_time="1460769684" click_revision="34112" num_clicks="1"/>
    <leaf thread="1173108780" count="1486189"/>
    <leaf thread="1173108780" leaf="1" count="673290"/>
    <leaf thread="1173108780" leaf="2" count="716366"/>
    <view_counter video="15601870" id="sm9" mylist="163005"/>
    <chat thread="1173108780" no="4372257" vpos="20243" date="1460626223" mail="184 device:3DS" user_id="y79an8JFfstuVYr0VJHQThoi74I" anonymity="1" leaf="3">コメント内容</chat>
    <chat thread="1173108780" no="4372258" vpos="19305" date="1460626262" mail="184" user_id="NFx6Vi2j0bLsw3bugF-dqqK_ZCU" anonymity="1" leaf="3">コメント内容</chat>
    <chat thread="1173108780" no="4372259" vpos="25739" date="1460626326" mail="184" user_id="NFx6Vi2j0bLsw3bugF-dqqK_ZCU" anonymity="1" leaf="4">コメント内容</chat>
    <num_click thread="1173108780" no="4371768" count="21"/>
</packet>

パラメータについては以下のページを参考にしました
https://blog.nanoway.net/web/nicovideo-comment-api

公式動画等でのコメント取得

公式動画等(FlvResponse.needs_key =="1")では、通常動画のデータにプラスして以下の属性を追加してGET(またはPOST)リクエストを送ることでコメントを取得できます。

  • threadkey
  • force_184
  • user_id

(通常動画ではuser_id無しでも取得できるようですが公式動画は必要なようです)

threadkeyとforce_184は以下のAPIにスレッドIDを与えてアクセスすることで取得できます。

http://flapi.nicovideo.jp/api/getthreadkey?thread=[ThreadId]

[ThreadId]をFlvResponse.thread_idに置き換えてGetリクエストを送ることで

threadkey=1260895818.CVzCNuF6F-6HLMku45inDrJ7020&force_184=1

というURLパラメータ形式の文字列が返ってきます。

ちなみに、URLパラメータのパースにはSystem.Webが利用可能な場合には

var queryDict = System.Web.HttpUtility.ParseQueryString(query);
var threadkey = queryDict["threadkey"];
var force_184= queryDict["force_184"];

System.Webを使わない場合には

public static class HttpQueryExtention
{
    public static IDictionary<string, string> QueryToDictionary(string query)
    {
        return query.Split(new char[] { '&' }).ToDictionary(
                    source => source.Substring(0, source.IndexOf('=')),
                    source => Uri.UnescapeDataString(source.Substring(source.IndexOf('=') + 1)));
    }
}

を使ってthreadkeyとforce_184を取得します。

公式動画コメントGet
var messageServerUrl = ""; // FlvResponse.ms
var user_id = ""; // FlvResponse.user_id
var threadId = "";  // FlvResponse.thread_id
var urlWithQuery = $"{messageServerUrl}thread?thread={threadId}&version=20061206&res_from=-1000&scores=1&threadkey={threadkey}&force_184={force_184}&user_id={user_id}"

あとは通常動画と同じようにGetリクエストを送ればコメントデータが受け取れます。

C#での実装

https://github.com/tor4kichi/OpenNiconico2/blob/master/Mntone.Nico2/Mntone.Nico2.Shared/Videos/Comment/CommentClient.cs

これは https://github.com/mntone/OpenNiconico2 をフォークしてUWP向けに改変+Video系APIを拡充したものです。

フォーク後の方はHttpClientが System.Net.HttpClient から Windows.Web.HttpClient に変更されています。

参考

ニコニコ動画の公式動画に投稿されたコメントの取得方法
http://d.hatena.ne.jp/s01149ht/20091216/1260983794

ニコニコ動画のコメント解析
https://blog.nanoway.net/web/nicovideo-comment-api

UrlParameterの組み立て
http://stackoverflow.com/questions/659887/get-url-parameters-from-a-string-in-net

URLクエリのパース処理の参考元
https://github.com/mntone/OpenNiconico2

蛇足

ニコニコ動画は公式のAPIドキュメントが無いです。

はい。

tor4kichi
シンプルで"使える"アプリを作ろう
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away