ニコ生新配信APIの実装 (C#)
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

ニコ生新配信APIの実装 (C#)

2018-10-05 21:00

    共通の事項

    ライブラリを追加

     Web APIのクライアントに必要なライブラリは基本的にASP.NET MVC 4に含まれていますが、依存関係もそれなりにあるので、NuGetを使用した方が楽です。
     GUIを使用する場合には下図のように”Microsoft ASP.NET Web API Client Libraries”を選択し、インストールします。

    ※.Net Framework 4.5以上必須




    usingの追加

    using System.Net.Http;
    using System.Net.Http.Formatting;
    using System.Runtime.Serialization;


    ※以降は全て非同期(asyncが必要)で処理です。
    User-Agentはアプリ名とバージョンを記載すること。
    データの送受信は全てjson形式。
    仕様変更される場合があります。

    例外処理などは省略してあります。

    運営コメント

    データクラスの追加

    [DataContract]
    public class PostComment
    {
    [DataMember(Name = "text")]
    public string text { get; set; }
    [DataMember(Name = "isPermanent")]
    public bool isPermanent { get; set; }
    [DataMember(Name = "color")]
    public string color { get; set; }
    [DataMember(Name = "userName")]
    public string userName { get; set; }
    }

    HTTP リクエスト (PutAsJsonAsync)

    using (HttpClientHandler handler = new HttpClientHandler())
    using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(10) })
    {
    client.DefaultRequestHeaders.Add("User-Agent", "クライアント名");
    handler.CookieContainer = container;

    PostComment _PostComment = new PostComment
    {
    text = "コメント",
    isPermanent = false,
    color = "",
    userName = ""
    };

    var response = await client.PutAsJsonAsync<PostComment>("http://live2.nicovideo.jp/watch/" + LiveID + "/operator_comment", _PostComment).ConfigureAwait(false);

    // 200 OKの場合は正常に送信など後はお好きなように。
    if (response.StatusCode == HttpStatusCode.OK)
    return true;
    }

    User-Agent : クライアントを判別できるものを付けてください。
    container
    : CookieContainer
    LiveID : lvを含む放送番号

    text : コメントテキスト
    isPermanent : /permでずっと表示するコメにするかどうか(true/false)
    color : コメントの色。red,blue,greenなど。省略可能。
    userName : コテハン。省略可能。

    基本的な情報は下記を参考。
    大百科の運コメAPI

    /cls

    await client.DeleteAsync("http://live2.nicovideo.jp/watch/" + LiveID + "/operator_comment").ConfigureAwait(false);


    配信開始・停止

    データクラスの追加

    [DataContract]
    public class LiveState
    {
    [DataMember(Name = "state")]
    public string state { get; set; }
    }

    HTTP リクエスト (PutAsJsonAsync)

    using (HttpClientHandler handler = new HttpClientHandler())
    using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(10) })
    {
    client.DefaultRequestHeaders.Add("User-Agent", "クライアント名");
    handler.CookieContainer = container;

    LiveState _LiveState = new LiveState
    {
    state = "on_air"
    };

    var response = await client.PutAsJsonAsync<LiveState>("http://live2.nicovideo.jp/watch/" + LiveID + "/segment", _LiveState).ConfigureAwait(false);

    // responseにはstart_timeとend_timeが飛んで来るので後はお好きなように。
    string json = await response.Content.ReadAsStringAsync();

    // 409 Conflictの場合はすでに配信開始済み。
    if (response.StatusCode == HttpStatusCode.Conflict)
    return true;

    // 200 OKの場合は正常に開始。
    if (response.StatusCode == HttpStatusCode.OK)
    return true;

    // エラーの時は数秒待機してから再試行してください。
    return false;
    }

    配信停止はstateを変えるだけ。
    state ="end"

    延長リスト
    "http://live2.nicovideo.jp/watch/" + LiveID + "/extension";
    ここを叩くと、json形式で延長可能な一覧が取れる。

    延長

    データクラスの追加

    [DataContract]
    public class LiveExtension
    {
    [DataMember(Name = "minutes")]
    public int minutes { get; set; }
    }

    HTTP リクエスト (PostAsJsonAsync)

    using (HttpClientHandler handler = new HttpClientHandler())
    using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(10) })
    {
    client.DefaultRequestHeaders.Add("User-Agent", "クライアント名");
    handler.CookieContainer = container;

    LiveExtension _LiveExtension = new LiveExtension
    {
    minutes = 30 //延長可能な一覧から取得した時間をminutesに指定する。
    };

    var response = await client.PostAsJsonAsync<LiveExtension>("http://live2.nicovideo.jp/watch/" + LiveID + "/extension", _LiveExtension).ConfigureAwait(false);

    // responseにはstart_timeとend_timeが飛んで来るので後はお好きなように。
    string json = await response.Content.ReadAsStringAsync();
    }


    バックステージパス ※配信主でも送信可能

    データクラスの追加

    [DataContract]
    public class PostBspComment
    {
    [DataMember(Name = "text")]
    public string text { get; set; }
    [DataMember(Name = "userName")]
    public string userName { get; set; }
    [DataMember(Name = "color")]
    public string color { get; set; }
    }

    HTTP リスエスト (PostAsJsonAsync)

    using (HttpClientHandler handler = new HttpClientHandler())
    using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(10) })
    {
    client.DefaultRequestHeaders.Add("User-Agent", "クライアント名");
    handler.CookieContainer = container;

    PostBspComment _PostBspComment = new PostBspComment
    {
    text = "コメント",
    userName = "Wangdora",
    color = "red"
    };

    var response = await client.PostAsJsonAsync<PostBspComment>("http://live2.nicovideo.jp/watch/" + LiveID + "/bsp_comment", _PostBspComment).ConfigureAwait(false);

    // 200 OKの場合は正常に送信など後はお好きなように。
    if (response.StatusCode == HttpStatusCode.OK)
    return true;
    }


    アンケート

    データクラスの追加

    [DataContract]
    public class EnqueteContents
    {
    [DataMember(Name = "question")]
    public string Question { get; set; }
    [DataMember(Name = "items")]
    public List<string> Items { get; set; }
    }


    アンケート開始

    HTTPリクエスト (PostAsJsonAsync)

    using (HttpClientHandler handler = new HttpClientHandler())
    using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(10) })
    {

    client.DefaultRequestHeaders.Add("User-Agent", "クライアント名");
    handler.CookieContainer = container;

    List<string> _Reply = new List<string>();
    _Reply.Add(Q1);
    _Reply.Add(Q2);
    _Reply.Add(Q3);
    _Reply.Add(Q4);
    _Reply.Add(Q5);
    _Reply.Add(Q6);
    _Reply.Add(Q7);
    _Reply.Add(Q8);
    _Reply.Add(Q9);

    EnqueteContents _EnqueteContents = new EnqueteContents
    {
    Question = question,
    Items = _Reply
    };

    var response = await client.PostAsJsonAsync<EnqueteContents>("http://live2.nicovideo.jp/unama/watch/" + LiveID + "/enquete", _EnqueteContents).ConfigureAwait(false);
    }

    question : 質問
    Q1~Q9 : 選択肢
    questionとQ1、Q2は必須です。

    上記は省略してありますが、選択肢が無い場合はAddしないで下さい。↓

    if (!string.IsNullOrEmpty(Q1))
    _Reply.Add(Q1);


    アンケート結果表示

    HTTPリクエスト (PostAsync)

    using (HttpClientHandler handler = new HttpClientHandler())
    using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(10) })
    {
    client.DefaultRequestHeaders.Add("User-Agent", "クライアント名");
    handler.CookieContainer = container;
    var response = await client.PostAsync("http://live2.nicovideo.jp/unama/watch/" + LiveID + "/enquete/result", null).ConfigureAwait(false);
    }


    アンケート結果消去

    HTTPリクエスト (DeleteAsync)

    using (HttpClientHandler handler = new HttpClientHandler())
    using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(10) })
    {
    client.DefaultRequestHeaders.Add("User-Agent", "クライアント名");
    handler.CookieContainer = container;
    var response = await client.DeleteAsync("http://live2.nicovideo.jp/unama/watch/" + LiveID + "/enquete").ConfigureAwait(false);
    }


    番組情報取得

    "http://live2.nicovideo.jp/watch/" + LiveID + "/programinfo"

    全ての部屋情報が取得できる。返ってきたJSONのid要素はチャンネル放送だと追い出し機能の仕様で変動する(id番号と部屋番号は一致しない)ので注意。

    来場者数、コメント数を取得
    "http://live2.nicovideo.jp/watch/" + LiveID + "/statistics"

    動画引用

    データクラスの追加

    [DataContract]
    public class MixingRoot
    {
    [DataMember(Name = "mixing")]
    public List<Contents> Mixing { get; set; }
    }

    [DataContract]
    public class Contents
    {
    [DataMember(Name = "content")]
    public string Content { get; set; }
    [DataMember(Name = "audio")]
    public float Audio { get; set; }
    [DataMember(Name = "display")]
    public string Display { get; set; }
    }

    HTTP リクエスト (PutAsJsonAsync)

    using (HttpClientHandler handler = new HttpClientHandler())
    using (HttpClient client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(10) })
    {
    client.DefaultRequestHeaders.Add("User-Agent", "クライアント名");
    handler.CookieContainer = container;

    // 放送画面の設定
    var _Contents1 = new Contents
    {
    Content = LiveID, // 自分の放送ID (lv)
    Audio = (float)1.0, // 音量 (0.0~1.0)
    Display = "main"
    };

    // 動画の設定
    var _Contents2 = new Contents
    {
    Content = "sm9", // 動画番号 (sm)
    Audio = (float)1.0, //音量 (0.0~1.0)
    Display = "sub"
    };

    MixingRoot _MixingRoot;
    if (Start)
    {
    // 動画引用開始
    _MixingRoot = new MixingRoot()
    {
    Mixing = new List<Contents>() { _Contents1, _Contents2 }
    };
    }
    else
    {
    // 動画引用停止
    _MixingRoot = new MixingRoot()
    {
    Mixing = new List<Contents>() { _Contents1 }
    };
    }

    var response = await client.PutAsJsonAsync<MixingRoot>(UrlWatch2 + LiveID + "/broadcast/mixing", _MixingRoot).ConfigureAwait(false);

    // 404
    if (response.StatusCode == HttpStatusCode.NotFound)
    return "番組が見つかりませんでした。";

    // 400
    if (response.StatusCode == HttpStatusCode.BadRequest)
    return "引用できないコンテンツです。";

    // 401
    if (response.StatusCode == HttpStatusCode.Unauthorized)
    return "再ログインしてください。";

    // 500
    if (response.StatusCode == HttpStatusCode.InternalServerError)
    return "動画引用に失敗しました。";

    return Status;
    }


    Start : 動画引用開始か停止のフラグ
    Status : stringの戻り値("動画を開始します。"など)
    Display : "main"、"sub"、"none" 画面をどこに表示するか。noneは音声のみ
    また、音量は配信画面と引用動画のそれぞれに指定できる。
    パラメータ無しで同アドレスを叩くと、現在の状態が取得できる。


    コテハン・サムネイル取得

    "http://api.ce.nicovideo.jp/api/v1/user.info?user_id=" + UserID

    ユーザーIDからコテハンとサムネイル画像へのパスを取得できる。連打制限ありになった。
    コミュニティページからHTMLパースして取り出す方が制限なくて使える。

    RTMPアドレスの取得
    "http://live2.nicovideo.jp/unama/api/v3/programs/" + LiveID + "/broadcast"
    JSONでrtmpとname(ストリームキー)が取得できる。

    ユーザー別番組スケジュールの取得
    "http://live2.nicovideo.jp/unama/tool/v1/program_schedules"
    放送主の予約枠を100件分、現在の状態(放送中かどうか)を取得できる。
    statusは、reserved、test、onAir、endの4種類。

    ここには書いてないけど、コメ鯖のWebSocketがSSL化されたらしい。
    ※覚書なのでご自由に。APIが実装され次第追記。
    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。