マイリストの読み込み、新規作成、編集、削除、マイリストに動画を追加、削除
以上の部分を修正する。
「とりあえずマイリスト」の修正は→
https://writening.net/page?fXYxFY
重複する動画を登録しようとするとエラーが出るが特に問題はないと思うので修正していない
1/28 自分の非公開マイリストの読み込みに対応したので追加
1/31 動画の削除に対応したので追加
2/12 自分のマイリストをAPIから閲覧する部分を一部修正
ニコニコにパラメータを渡す部分#
TrinityCS>NetUtil>PostSmileVideo
でEdit Method
19行目tryから
32行目httpWebRequest.Method = "POST";を削除し以下を挿入
try
{
string hage = url;
url = url.Replace("?delete", "?");
url = url.Replace("&put", "");
url = url.TrimEnd(new char[]
{
','
});
string s = url.Split(new char[]
{
'?'
})[1];
byte[] bytes = Encoding.ASCII.GetBytes(s);
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url.Split(new char[]
{
'?'
})[0]);
try
{
if (url.IndexOf("https://nvapi.nicovideo.jp/v1/users/me/mylists/") != -1)
{
if (hage.IndexOf("delete") != -1)
{
httpWebRequest.Method = "DELETE";
}
else if (hage.IndexOf("&put") != -1)
{
httpWebRequest.Method = "PUT";
}
else
{
httpWebRequest.Method = "POST";
}
}
else
{
httpWebRequest.Method = "POST";
}
if (url.IndexOf("https://nvapi.nicovideo.jp/v1/") == 0)
{
httpWebRequest.Headers.Add("X-Frontend-Id", "6");
httpWebRequest.Headers.Add("X-Request-With", "https://www.nicovideo.jp");
httpWebRequest.Headers.Add("X-Frontend-Version", "0");
}
マイリスト一覧を読み込む部分#
nFinder>mFinder_Main
・1534行目
string htm = NetUtil.GetSmilevideoHTMLText
の行でEditIL
"http://www.nicovideo.jp/mylist_add/video/sm9"
を
"https://nvapi.nicovideo.jp/v1/users/me/mylists?sampleItemCount=0"
に変更
元のテキストの中身はこれまでの改造によって変化している可能性もあるが気にしなくてOK
・1581行目
RadTreeNode radTreeNode3 = new RadTreeNode(HttpUtility.HtmlDecode(Regex.Unescape...
でEditIL
上から順に
".*\"name\":\"([^\"]*)\".*"
を
".*e,\"name\":\"([^\"]*)\".*"
".*\"id\":\"(\\d+)\".*"
を
".*{\"id\":(\\d+).*"
"\"public\":\"1\""
を
"\"isPublic\":true"
に変更してOK
TrinityCS>NetUtil>GetSmilevideoHTMLText
でEditMethod
29行目
httpWebRequest.Referer = "http://www.nicovideo.jp/";
の下に
if (url.IndexOf("https://nvapi.nicovideo.jp/v1/") == 0)
{httpWebRequest.Headers.Add("X-Frontend-Id", "6");}
を挿入
IEnumerator~というエラーが出るため、ウィンドウ下のエラー内容をダブルクリックするとエラーの位置に飛ぶので
using (IEnumerator enumerator = httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri).GetEnumerator())
から
Cookie cookie2 = (Cookie)obj2;
まで(6行)を削除してそこに
{foreach (Cookie cookie2 in httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri)){
を入れてCompile
マイリスト作成部分#
nFinder>dMylistGrourp>MakeMylistGroup1
でEditMethod
24行目以下をすべて削除し、代わりに以下を挿入してCompile
{
string result;
if (this.RadTextBox1.Text.Length == 0)
{
result = "タイトルが入力されていません。";
}
else
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("name=" + HttpUtility.UrlEncode(this.RadTextBox1.Text) + "&");
stringBuilder.Append("description=" + HttpUtility.UrlEncode(this.RadTextBox2.Text) + "&");
if (this.RadRadioButton1.IsChecked)
{
stringBuilder.Append("isPublic=true&");
}
else
{
stringBuilder.Append("isPublic=false&");
}
stringBuilder.Append("defaultSortKey=addedAt&defaultSortOrder=desc");
string text;
if (this._EditMode && Operators.CompareString(this._EditGroupID, "", true) != 0)
{
text = NetUtil.PostSmileVideo(string.Concat(new string[]
{
"https://nvapi.nicovideo.jp/v1/users/me/mylists/",
this._EditGroupID,
"?",
stringBuilder.ToString(),
"&put"
}), Conversions.ToInteger(InitializationSetup.getIni("nettimeout")), ref Variable.gp_CookieContainer);
}
else
{
text = NetUtil.PostSmileVideo("https://nvapi.nicovideo.jp/v1/users/me/mylists?" + stringBuilder.ToString(), Conversions.ToInteger(InitializationSetup.getIni("nettimeout")), ref Variable.gp_CookieContainer);
}
if (!Regex.IsMatch(text, "status\":200"))
{
result = "何らかの原因で作成または編集に失敗しました。ログイン状況、通信状況を確認してください。\r\n" + text;
}
else
{
result = "";
}
}
return result;
}
}
}
マイリストのタイトル、説明、公開設定編集部分#
nFinder>dMylistGrourp>EditGroup
22行目以下をすべて削除し、代わりに以下を挿入してCompile
{
this._EditMode = true;
new StringBuilder().Append(groupid + "?page=1&pageSize=1");
string text = NetUtil.GetSmilevideoHTMLText("https://nvapi.nicovideo.jp/v1/users/me/mylists/" + groupid, 6, ref Variable.gp_CookieContainer);
if (!Regex.IsMatch(text, "status\":200"))
{
Misc.MsgBoxEx("何らかの原因で情報取得に失敗しました。ログイン状況、通信状況を確認してください。\r\n" + text, false);
base.Close();
return;
}
text = Regex.Replace(text, "\"items\".*}}],", "");
text = Regex.Replace(text, "\"owner\".*}}}", "");
text = text.Replace("{\"meta\":{\"status\":200},\"data\":{\"mylist\":{", "");
text = text.Replace("\"", "");
foreach (string text2 in text.Split(new char[]
{
','
}))
{
try
{
string left = text2.Split(new char[]
{
':'
})[0];
string text3 = text2.Split(new char[]
{
':'
})[1];
if (Operators.CompareString(left, "id", true) == 0)
{
this._EditGroupID = text3;
}
else if (Operators.CompareString(left, "description", true) == 0)
{
this.RadTextBox2.Text = TrinityCS.Strings.ReverseToUniCode(text3).Replace("\\n", "\r\n").Replace("\\r", "");
}
else if (Operators.CompareString(left, "name", true) == 0)
{
this.RadTextBox1.Text = TrinityCS.Strings.ReverseToUniCode(text3);
}
else if (Operators.CompareString(left, "isPublic", true) == 0)
{
if (Operators.CompareString(text3, "true", true) == 0)
{
this.RadRadioButton1.IsChecked = true;
}
else
{
this.RadRadioButton2.IsChecked = true;
}
}
else if (Operators.CompareString(left, "defaultSortKey", true) == 0)
{
this._EditDefault_sort = text3;
}
else if (Operators.CompareString(left, "icon_id", true) == 0)
{
this._EditIcon_id = text3;
}
}
catch (Exception)
{
}
}
this.Label4.Text = "<html>マイリストグループを更新します。</html>";
base.Show();
base.Activate();
}
}
}
マイリストを削除する部分#
nFinder>mFinder_main>DeleteMylistGroup
DeleteMylistGroup
でEditMethod
30行目から下を全て削除し、代わりに以下を挿入してCompile
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append(registGroupID + "?delete");
string result;
if (!Regex.IsMatch(NetUtil.PostSmileVideo("https://nvapi.nicovideo.jp/v1/users/me/mylists/" + stringBuilder.ToString(), Conversions.ToInteger(InitializationSetup.getIni("nettimeout")), ref Variable.gp_CookieContainer), "status\":200"))
{
result = "何らかの原因で削除に失敗しました。ログイン状況、通信状況を確認してください。";
}
else
{
result = "";
}
return result;
}
}
}
マイリストに動画を追加する部分#
EditMethodが使えないのでやや強引な修正に
mFinder_main AddMylist
・6167行目
string text2 = NetUtil.GetSmilevideoHTMLText(url, Conversions.ToInteger(InitializationSetup.getIni("nettimeout")), ref Variable.gp_CookieContainer);
でEditIL
左のIndexが40のldloc.3と書いてある所をクリックしてldstrに変更。OK
・6178行目
result = "TokenIDが取得できません。ログイン状況、通信状況を確認してください。";
でEditIL
キーボードのDeleteキーを押す。OK
・6205行目
url = string.Concat(new string[]
でEditIL
少し複雑だが色の変わっている部分の中にある
ldc.14.1~6 の付く行をクリックして
1を3
2を2
3を5
4を4
5を1
6を5
に変更し、一旦OK
array2[0] = "http://www.nicovideo.jp/api/mylist/add?item_id=";
array2[3] = CS$<>8__locals1.$VB$Local_vidAry[num3];
array2[2] = "&token=";
array2[5] = text2;
array2[4] = "&group_id=";
array2[1] = registGroupID;
array2[5] = "&item_type=0";
のような形になっているはず
更にEditILで、該当の部分を変更していく
"http://www.nicovideo.jp/api/mylist/add?item_id=";
を
"https://nvapi.nicovideo.jp/v1/users/me/mylists/"
"&token="
を
"/items?itemId="
"&group_id="
を
"&description="
"&item_type=0"
を
""
にそれぞれ変更する
・6234行目
flag = Regex.IsMatch(text2, "\"status\":\"ok\"");
でEditIL
"\"status\":\"ok\""
を
"\"status\":201"
に変更
自分のマイリストをAPIから閲覧する部分#
※自分の非公開マイリストが閲覧出来るようになる
nFinder>mFinder_main>thread_Mylist
EditMethod
40行目を削除して代わりに以下を挿入
bool flag = Microsoft.VisualBasic.Strings.InStr(selectSideMenu, "マイリスト\\", CompareMethod.Text) == 1;
44行目の先頭で改行し-2/12追加修正部分-
text2 = System.Text.RegularExpressions.Regex.Replace(text, ".*mylist/([0-9]+).*", "$1") + "?pageSize=100";
text = "API";
を挿入、その後
46行目
"http://www.nicovideo.jp/api/deflist/list"
を
"https://nvapi.nicovideo.jp/v1/users/me/mylists/" + text2
に変更
nFinder>mFinder_main>thread_Mylist_sub
65行目
flag = (Microsoft.VisualBasic.Strings.InStr(html, "<?xml ", CompareMethod.Text) == 0 && Microsoft.VisualBasic.Strings.InStr(html, "\"video\":{\"type\"", CompareMethod.Text) == 0);
でEditIL
"\"item_type\""
を
"\"video\":{\"type\""
に変更
91行目
flag = (Microsoft.VisualBasic.Strings.InStr(url, "http://www.nicovideo.jp/my/mylist/#/home", CompareMethod.Text) == 1);
でEditIL
"http://www.nicovideo.jp/my/mylist/#/home"
を
"API"
に変更
98行目
"\"item_data\":{"
を
"\"description\":\"\"\r\n\"decoratedDescriptionHtml\":\"\"\r\n\"addedAt\":"
に
"{\"mylistitem\":["
を
"[{\"itemId\":"
に
すぐ下の
""
を
"\r\n\r\nitemId:"
に
"{\"item_type\":"
を
"{\"itemId\":"
に
すぐ下の
"\r\n\"item_type\":"
を
"\r\nitemId:"
に
それぞれ変更して、OK
html = html.Replace(",", "\r\n");
html = html.Replace("\"description\":\"\"\r\n\"decoratedDescriptionHtml\":\"\"\r\n\"addedAt\":", "");
html = html.Replace("[{\"itemId\":", "\r\n\r\nitemId:");
html = html.Replace("{\"itemId\":", "\r\nitemId:");
html = html.Replace("(\"mylist\":{\"id\":.*?,)\"name\":", "$1\"title\":");
html = html.Replace("}", "");
html = html.Replace("]", "");
html = html.Replace("\"", "");
となっていれば成功
以下全てEditIL 量が多いので少し省略
同じものを続けて挿入する事が多いので注意
110行目(以下省略)
"item_type:0"
を
"itemId"
133
"video_id:"
を
"id:sm"
136
"video_id:"
を
"id:"
140
"length_seconds:"
を
"duration:"
143
"length_seconds:"
を
"duration:"
147
"view_counter:"
を
"count:{view:"
150
"view_counter:"
を
"count:{view:"
154
"num_res:"
を
"comment:"
157
"num_res:"
を
"comment:"
161
"mylist_counter:"
を
"mylist:"
164
"mylist_counter:"
を
"mylist:"
168
"first_retrieve:"
を
"itemId:"
171
"first_retrieve:"
を
"itemId:"
175
"update_time:"
を
"itemId:"
181
"update_time:"
を
"itemId:"
185
"update_time:"
を
"itemId:"
190
"item_id:"
を
"itemId:"
にそれぞれ変更して保存。
メモ:この内175~190行目は現在はおそらく使われていない。
マイリスト内の動画を削除する部分#
nFinder>mFinder_main>DeleteMylist2
EditMethodが使えない為、以下は全てEditILで行う
6行目
"https://www.nicovideo.jp/my/mylist/#/"
を
"https://nvapi.nicovideo.jp/v1/users/me/mylists/"
13行目
""csrfToken""
を
""
16行目
".*"csrfToken":"([^&]*)".*"
を
".*\"id\":([0-9]{1,13}).*"
28行目
"http://www.nicovideo.jp/api/mylist/list?group_id="
を
"https://nvapi.nicovideo.jp/v1/users/me/mylists/"
30行目
"item_type\":0,\"item_id\":\"\\d{1,13}\""
を
"\\\"itemId\\\":[0-9]{1,13}"
36行目
"item_type:0,item_id:"
を
"itemId:"
50行目
"video_id\":\"[a-z0-9]{1,13}\""
を
"\\\"watchId\\\":\\\"[a-z0-9]{1,13}\\\""
56行目
"video_id:"
を
"watchId:"
ここから少し複雑になってしまった
124行目
stringBuilder.Append("token=" + text);
の行でEditIL
Ctrl+Cを押して、Cancel
111行目
Try
でEditILしてCtrl+V
一旦OKを押す。
StringBuilder stringBuilder2;
stringBuilder2.Append("token=" + text);
という行が増えている筈なので、もう一度EditIL
V_28をV_25に
"token="を"/items?deleteitemIds="に変更し
同行の左、276と書いてある所をクリックしてから右クリック
Move Downをクリックして、OK
stringBuilder.Append(text + "/items?deleteitemIds=");
となっていれば成功
116行目
stringBuilder.Append("id_list[0][]=" + str + "&");
でEditIL
"id_list[0][]="
を
""
"&"
を
","
に変更
124行目
stringBuilder.Append(Operators.ConcatenateObject(Operators.ConcatenateObject("group_id=", this.obj_SideMenuTreeView.SelectedNode.Tag), "&"));
でEditIL
キーボードのNキーを押し、OK
124行が
stringBuilder.Append("token=" + text);
になっているはずなのでもう一度EditIL
キーボードのNキーを押し、OK
更にもう一度EditILで
"http://www.nicovideo.jp/api/mylist/delete?"
を
"https://nvapi.nicovideo.jp/v1/users/me/mylists/"
に変更してOK
text2 = NetUtil.PostSmileVideo("https://nvapi.nicovideo.jp/v1/users/me/mylists/" + stringBuilder.ToString(), Conversions.ToInteger(InitializationSetup.getIni("nettimeout")), ref Variable.gp_CookieContainer);
になっていればOK
125行目でEditIL
"delete_count\":\\d{1,3},\"status\":\"ok\""
を
"\"status\":200"
に変更
併せてPostSmileVideoを修正したので、2023/1/31以前に修正した人だけ少し寄り道をしてもらう。↓に続く
TrinityCS>NetUtil>PostSmileVideo
でEdit Method
19行目のtryから
51行目の}を削除し、代わりに以下を挿入してCompile
try
{
string hage = url;
url = url.Replace("?delete", "?");
url = url.Replace("&put", "");
url = url.TrimEnd(new char[]
{
','
});
string s = url.Split(new char[]
{
'?'
})[1];
byte[] bytes = Encoding.ASCII.GetBytes(s);
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url.Split(new char[]
{
'?'
})[0]);
try
{
if (url.IndexOf("https://nvapi.nicovideo.jp/v1/users/me/mylists/") != -1)
{
if (hage.IndexOf("delete") != -1)
{
httpWebRequest.Method = "DELETE";
}
else if (hage.IndexOf("&put") != -1)
{
httpWebRequest.Method = "PUT";
}
else
{
httpWebRequest.Method = "POST";
}
}
else
{
httpWebRequest.Method = "POST";
}