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

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

×

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

2018-09-15 07:00
  • 4

共通の事項

ライブラリを追加

 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パースして取り出す方が制限なくて使える。

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