private void RequestComment() { //タイムシフト if (Status.Archive) { try { Console.WriteLine("Request:" + Vpos + " " + LastRequestTime); var query = new GetRequestQuery(GetWayBackKeyApiUrl); query.AddQuery("thread", Status.ThreadId); var a = NicoNicoWrapperMain.Session.GetAsync(query.TargetUrl).Result; var key = a.Split('=')[1]; var xml = BuildThread(ResFrom, LastRequestTime + 60, key); Console.WriteLine(xml); XmlSocket.Send(xml); Task.Run(() => { XmlSocket.RecursiveReceive(new MemoryStream()); }); } catch (RequestTimeout) { } } else { var xml = BuildThread(); XmlSocket.Send(xml); Task.Run(() => { XmlSocket.RecursiveReceive(new MemoryStream()); }); } }
public void ConfirmReservation(string id, ConfirmReservation conf) { if (conf == null) { return; } //lvを消す id = id.Replace("lv", ""); try { var request = new GetRequestQuery(WatchingReservationApiUrl); request.AddQuery("mode", "confirm_watch_my"); request.AddQuery("vid", id); var a = NicoNicoWrapperMain.Session.GetAsync(request.TargetUrl).Result; var doc = new HtmlDocument(); doc.LoadHtml2(a); conf.Id = id; conf.Expires = doc.DocumentNode.SelectSingleNode("//div[@class='info']/div[1]/p").InnerText; conf.Title = doc.DocumentNode.SelectSingleNode("//div[@class='info']/div/strong").InnerText; conf.Token = Regex.Match(a, "confirmToWatch[^,]+,[ ]'(.*)'").Groups[1].Value; }catch (RequestTimeout) { conf.Expires = null; conf.Title = null; conf.Token = null; return; } }
//コメントナンバーを返す public string Post(string comment, string mail, string vpos) { Video.Status = "コメント投稿中"; try { var query = new GetRequestQuery(GetPostKeyApiUrl); query.AddQuery("version_sub", "2"); query.AddQuery("block_no", Math.Floor((decimal)(LastRes + 1) / 100).ToString()); query.AddQuery("version", "1"); query.AddQuery("yugi", ""); query.AddQuery("device", "1"); query.AddQuery("thread", GetFlv.ThreadID); var postkey = NicoNicoWrapperMain.Session.GetAsync(query.TargetUrl).Result; postkey = HttpUtility.UrlDecode(postkey).Split('=')[1]; var root = new XmlDocument(); var chat = root.CreateElement("chat"); chat.SetAttribute("thread", GetFlv.ThreadID); chat.SetAttribute("vpos", vpos); chat.SetAttribute("mail", mail); chat.SetAttribute("ticket", Ticket); chat.SetAttribute("user_id", GetFlv.UserId); chat.SetAttribute("postkey", postkey); if (GetFlv.IsPremium) { chat.SetAttribute("premium", "1"); } chat.InnerText = comment; root.AppendChild(chat); var request = new HttpRequestMessage(HttpMethod.Post, GetFlv.CommentServerUrl); request.Content = new StringContent(root.InnerXml); request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml"); var a = NicoNicoWrapperMain.Session.GetAsync(request).Result; var doc = new HtmlDocument(); doc.LoadHtml2(a); var status = doc.DocumentNode.SelectSingleNode("packet/chat_result").Attributes["status"].Value; if (status != "0") { Video.Status = "コメントの投稿に失敗しました"; return(null); } else { Video.Status = "コメントを投稿しました"; return(doc.DocumentNode.SelectSingleNode("packet/chat_result").Attributes["no"].Value); } } catch (RequestTimeout) { Video.Status = "コメントの投稿に失敗しました(タイムアウト)"; return(null); } }
public VideoViewModel(string url) : base(url) { var query = new GetRequestQuery(url); query.AddQuery("watch_harmful", 1); VideoUrl = query.TargetUrl; WatchiApiInstance = new NicoNicoWatchApi(this); StoryBoardInstance = new NicoNicoStoryBoard(this); }
public void OpenTweetView() { var query = new GetRequestQuery("https://twitter.com/intent/tweet"); query.AddQuery("url", Uri.EscapeDataString("http://www.nicovideo.jp" + new Uri(VideoUrl).AbsolutePath)); query.AddQuery("hashtags", ApiData.Video.Id); query.AddQuery("original_referer", Uri.EscapeDataString(VideoUrl)); query.AddQuery("text", Uri.EscapeDataString(ApiData.Video.Title + "(" + NicoNicoUtil.ConvertTime(ApiData.Video.Duration) + ")")); TweetBrowser = new WebBrowser(); TweetBrowser.Navigating += (obj, e) => { if (e.Uri.Query == "") { TweetPopupOpen = false; } }; TweetPopupOpen = true; TweetBrowser.Navigate(query.TargetUrl); }
public async Task HeartbeatAsync(string id) { try { var query = new GetRequestQuery(Dmc.ApiUrls.First() + "/" + id); query.AddQuery("_format", "json"); query.AddQuery("_method", "PUT"); var request = new HttpRequestMessage(HttpMethod.Post, new Uri(query.TargetUrl)); request.Content = new StringContent(LastResponseXml); request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request); if (!NicoNicoUtil.IsValidJson(a)) { return; } var doc = DynamicJson.Parse(a); if (doc.data()) { var data = doc.data; if (data != null) { LastResponseXml = data.ToString(); } else { } } return; } catch (RequestFailed) { return; } }
public async Task <bool> ToggleFollowOwnerAsync(NicoNicoWatchApiData apiData) { try { if (apiData.IsChannelVideo) { GetRequestQuery query = null; if (apiData.IsUploaderFollowed) { query = new GetRequestQuery(ChannelUnFollowApi); } else { query = new GetRequestQuery(ChannelFollowApi); } query.AddQuery("channel_id", apiData.Channel.Id); query.AddQuery("return_json", 1); query.AddQuery("time", apiData.Channel.FavoriteTokenTime); query.AddQuery("key", apiData.Channel.FavoriteToken); var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(query.TargetUrl); var json = DynamicJson.Parse(a); if (json.status == "succeed") { if (apiData.IsUploaderFollowed) { Owner.Status = "フォローを解除しました"; } else { Owner.Status = "フォローしました"; } return(true); } } else { if (apiData.IsUploaderFollowed) { var request = new HttpRequestMessage(HttpMethod.Delete, string.Format(UploaderInfoApi, apiData.Owner.Id)) { Content = new FormUrlEncodedContent(new Dictionary <string, string>()) }; request.Headers.Add("x-request-with", Owner.VideoUrl); var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request); var json = DynamicJson.Parse(a); if (json.meta.status == 200D) { Owner.Status = "フォローを解除しました"; return(true); } else { Owner.Status = "フォロー解除に失敗しました"; return(false); } } else { var request = new HttpRequestMessage(HttpMethod.Post, string.Format(UploaderInfoApi, apiData.Owner.Id)) { Content = new FormUrlEncodedContent(new Dictionary <string, string>()) }; request.Headers.Add("x-request-with", Owner.VideoUrl); var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request); var json = DynamicJson.Parse(a); if (json.meta.status == 200D) { Owner.Status = "フォローしました"; return(true); } else { Owner.Status = "フォローに失敗しました"; return(false); } } } return(false); } catch (RequestFailed) { return(false); } }
public async Task <DmcSession> CreateAsync() { dynamic json = new DynamicJson(); json.session = new { recipe_id = Dmc.RecipeId, content_id = Dmc.ContentId, content_type = "movie", content_src_id_sets = new List <dynamic>(), timing_constraint = "unlimited", keep_method = new { heartbeat = new { lifetime = Dmc.HeartbeatLifeTime } }, protocol = new { name = "http", parameters = new { http_parameters = new { parameters = new { http_output_download_parameters = new {} } } } }, content_uri = "", session_operation_auth = new { session_operation_auth_by_signature = new { token = Dmc.Token, signature = Dmc.Signature } }, content_auth = new { auth_type = Dmc.AuthType, max_content_count = 10, content_key_timeout = Dmc.ContentKeyTimeout, service_id = "nicovideo", service_user_id = Dmc.ServiceUserId }, client_info = new { player_id = Dmc.PlayerId }, priority = Dmc.Priority }; var mux = new { video_src_ids = new List <string>(), audio_src_ids = new List <string>() }; foreach (var video in Dmc.Videos) { mux.video_src_ids.Add(video); } foreach (var audio in Dmc.Audios) { mux.audio_src_ids.Add(audio); } json.session.content_src_id_sets = new[] { new { content_src_ids = new[] { new { src_id_to_mux = mux } } } }; try { var str = json.ToString(); var query = new GetRequestQuery(Dmc.ApiUrls.First()); query.AddQuery("_format", "json"); var request = new HttpRequestMessage(HttpMethod.Post, new Uri(query.TargetUrl)) { Content = new StringContent(json.ToString()) }; request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request); var ret = new DmcSession(); var doc = DynamicJson.Parse(a); ret.Id = doc.data.session.id; ret.ContentUri = doc.data.session.content_uri; LastResponseXml = doc.data.ToString(); return(ret); } catch (RequestFailed) { return(null); } }
//コメント取得 public async Task <List <NicoNicoCommentEntry> > GetCommentAsync() { Video.CommentStatus = "取得中"; var list = new List <NicoNicoCommentEntry>(); //---ユーザーコメント取得--- var root = new XmlDocument(); var packet = root.CreateElement("packet"); var thread = root.CreateElement("thread"); thread.SetAttribute("thread", GetFlv.ThreadID); thread.SetAttribute("version", "20090904"); thread.SetAttribute("user_id", GetFlv.UserId); thread.SetAttribute("userkey", GetFlv.UserKey); thread.SetAttribute("scores", "1"); var leaves = root.CreateElement("thread_leaves"); leaves.SetAttribute("thread", GetFlv.ThreadID); leaves.SetAttribute("user_id", GetFlv.UserId); leaves.SetAttribute("userkey", GetFlv.UserKey); leaves.SetAttribute("scores", "1"); leaves.InnerText = "0-" + ((GetFlv.Length / 60) + 1) + ":100,1000"; //公式動画だったらThreadkeyも取得する if (ApiData.IsOfficial) { try { var query = new GetRequestQuery(GetThreadKeyApiUrl); query.AddQuery("thread", GetFlv.ThreadID); query.AddQuery("language_id", 0); var threadKeyRaw = await NicoNicoWrapperMain.Session.GetAsync(query.TargetUrl); var temp = threadKeyRaw.Split('&'); var threadKey = temp[0].Split('=')[1]; var force184 = temp[1].Split('=')[1]; thread.SetAttribute("threadkey", threadKey); thread.SetAttribute("force_184", force184); leaves.SetAttribute("threadkey", threadKey); leaves.SetAttribute("force_184", force184); thread.RemoveAttribute("userkey"); leaves.RemoveAttribute("userkey"); } catch (RequestTimeout) { Video.CommentStatus = "取得失敗"; } } packet.AppendChild(thread); packet.AppendChild(leaves); root.AppendChild(packet); try { var request = new HttpRequestMessage(HttpMethod.Post, GetFlv.CommentServerUrl); request.Content = new StringContent(root.InnerXml); request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml"); var a = await NicoNicoWrapperMain.Session.GetAsync(request); var doc = new HtmlDocument(); doc.LoadHtml2(a); var resultcode = doc.DocumentNode.SelectSingleNode("/packet/thread").Attributes["resultcode"].Value; if (resultcode == "11") { Video.Status = "取得失敗(復帰中)"; var recv = new GetRequestQuery(GetFlv.CommentServerUrl + "thread"); recv.AddQuery("version", "20090904"); recv.AddQuery("thread", GetFlv.ThreadID); recv.AddQuery("res_from", "-1000"); a = NicoNicoWrapperMain.Session.GetAsync(recv.TargetUrl).Result; doc.LoadHtml2(a); } StoreEntry(doc, list); //------ if (resultcode != "0") { Video.CommentStatus = "取得失敗"; return(null); } if (list.Count == 0 && resultcode == "0") { Video.CommentStatus = "取得完了"; return(list); } list.Sort(); Ticket = doc.DocumentNode.SelectSingleNode("packet/thread").Attributes["ticket"].Value; LastRes = int.Parse(doc.DocumentNode.SelectSingleNode("packet/thread").Attributes["last_res"].Value); Video.CommentStatus = "取得完了"; return(list); } catch (RequestTimeout) { Video.CommentStatus = "取得失敗(タイムアウト)"; return(null); } }
public async Task <List <NicoNicoCommentList> > GetAllCommentAsync() { var normalList = new NicoNicoCommentList("通常コメント"); var uploaderList = new NicoNicoCommentList("投稿者コメント"); var communityList = new NicoNicoCommentList("コミュニティコメント"); var channelList = new NicoNicoCommentList("チャンネルコメント"); var officialList = new NicoNicoCommentList("公式コメント"); try { var ret = new List <NicoNicoCommentList>(); //通常コメントを取得 //ret.Add(new NicoNicoCommentList() { ListName = "通常コメント", CommentList = await GetNormalCommentAsync() }); //パケットIDとコメントタイプを紐付ける var dic = new Dictionary <long, CommentType>(); var jsonarray = new List <object>(); { PacketId = PacketCount; //rs jsonarray.Add(new { ping = new { content = "rs:" + RequestId % IdLimit } }); //ps 通常コメント jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } }); var normalThread = new { thread = Owner.ApiData.Thread.ThreadIds.Default, version = "20090904", language = 0, user_id = int.Parse(Owner.ApiData.Viewer.Id), with_global = 1, scores = 1, nicoru = 0, userkey = Owner.ApiData.Context.UserKey }; dic[PacketId] = CommentType.Normal; jsonarray.Add(new { thread = normalThread }); //pf jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } }); //------ //ps 通常コメント leaves jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } }); var normalLeaves = new { thread = Owner.ApiData.Thread.ThreadIds.Default, language = 0, user_id = int.Parse(Owner.ApiData.Viewer.Id), content = "0-" + ((Owner.ApiData.Video.Duration / 60) + 1) + ":100," + GetReadCommentCount(Owner.ApiData.Video.Duration).ToString(), scores = 1, nicoru = 0, userkey = Owner.ApiData.Context.UserKey }; dic[PacketId] = CommentType.NormalLeaves; jsonarray.Add(new { thread_leaves = normalLeaves }); //pf leaves jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } }); //------ //投稿者コメント有りフラグ if (Owner.ApiData.Thread.HasOwnerThread == "1") { //ps 投稿者コメント jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } }); var forkThread = new { thread = Owner.ApiData.Thread.ThreadIds.Default, version = "20061206", fork = 1, user_id = int.Parse(Owner.ApiData.Viewer.Id), res_from = -1000, with_global = 1, scores = 1, nicoru = 0, userkey = Owner.ApiData.Context.UserKey }; dic[PacketId] = CommentType.Uploader; jsonarray.Add(new { thread = forkThread }); //pf fork jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } }); } if (Owner.ApiData.IsChannelVideo) { //ps チャンネルコメント jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } }); var query = new GetRequestQuery(ThreadKeyApiUrl); query.AddQuery("thread", Owner.ApiData.Thread.ThreadIds.Community); var threadkey = await App.ViewModelRoot.CurrentUser.Session.GetAsync(query.TargetUrl); var threadKeyDic = HttpUtility.ParseQueryString(threadkey); channelList.ThreadKey = threadKeyDic["threadkey"]; channelList.Force184 = threadKeyDic["force_184"]; var channelThread = new { thread = Owner.ApiData.Thread.ThreadIds.Community, version = "20090904", language = 0, user_id = int.Parse(Owner.ApiData.Viewer.Id), force_184 = channelList.Force184, with_global = 1, scores = 1, nicoru = 0, threadkey = channelList.ThreadKey }; dic[PacketId] = CommentType.Channel; jsonarray.Add(new { thread = channelThread }); //pf channel jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } }); jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } }); var channelLeaves = new { thread = Owner.ApiData.Thread.ThreadIds.Community, language = 0, user_id = int.Parse(Owner.ApiData.Viewer.Id), content = "0-" + ((Owner.ApiData.Video.Duration / 60) + 1) + ":100," + GetReadCommentCount(Owner.ApiData.Video.Duration).ToString(), scores = 1, nicoru = 0, force_184 = threadKeyDic["force_184"], threadkey = threadKeyDic["threadkey"] }; dic[PacketId] = CommentType.ChannelLeaves; jsonarray.Add(new { thread_leaves = channelLeaves }); //pf channel jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } }); } //rf jsonarray.Add(new { ping = new { content = "rf:" + RequestId++ % IdLimit } }); PacketCount += jsonarray.Count; } var request = new HttpRequestMessage(HttpMethod.Post, Owner.ApiData.Thread.ServerUrl) { Content = new StringContent(DynamicJson.Serialize(jsonarray), Encoding.UTF8, "text/plain") }; var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request); //結果 { var currentType = CommentType.Normal; foreach (var entry in DynamicJson.Parse(a)) { //コメントタイプを確認 if (entry.ping()) { var content = entry.ping.content as string; if (content.Contains("ps")) { currentType = dic[long.Parse(content.Split(':')[1])]; } continue; } if (entry.thread()) { var thread = entry.thread; switch (currentType) { case CommentType.NormalLeaves: { normalList.ThreadId = thread.thread; normalList.Ticket = thread.ticket() ? thread.ticket : ""; normalList.LastRes = thread.last_res() ? (int)thread.last_res : 0; break; } case CommentType.Uploader: { break; } case CommentType.Channel: { break; } case CommentType.ChannelLeaves: { channelList.ThreadId = thread.thread; channelList.Ticket = thread.ticket() ? thread.ticket : ""; channelList.LastRes = thread.last_res() ? (int)thread.last_res : 0; break; } } continue; } if (entry.chat()) { var chat = entry.chat; switch (currentType) { case CommentType.NormalLeaves: { if (chat.deleted()) { continue; } var item = new NicoNicoCommentEntry() { Number = (int)chat.no, Vpos = (int)chat.vpos, PostedAt = (long)chat.date, Anonymity = chat.anonymity(), UserId = chat.user_id, Mail = chat.mail() ? chat.mail : "", Content = chat.content, Score = chat.score() ? (int)chat.score : 0 }; item.DisassembleMail(); normalList.Add(item); break; } case CommentType.Uploader: { if (chat.deleted()) { continue; } var item = new NicoNicoCommentEntry() { Number = (int)chat.no, Vpos = (int)chat.vpos, PostedAt = (long)chat.date, Content = chat.content, Mail = chat.mail() ? chat.mail : "" }; item.Mail = new string(item.Mail.Select(n => (ConvMap.ContainsKey(n) ? ConvMap[n] : n)).ToArray()); item.IsUploader = true; item.DisassembleMail(); uploaderList.Add(item); break; } case CommentType.Channel: { break; } case CommentType.ChannelLeaves: { if (chat.deleted()) { continue; } var item = new NicoNicoCommentEntry() { Number = (int)chat.no, Vpos = (int)chat.vpos, PostedAt = (long)chat.date, Anonymity = chat.anonymity(), UserId = chat.user_id, Mail = chat.mail() ? chat.mail : "", Content = chat.content, Score = chat.score() ? (int)chat.score : 0 }; item.DisassembleMail(); channelList.Add(item); break; } } } } if (!normalList.IsEmpty()) { normalList.Sort(); ret.Add(normalList); } if (!communityList.IsEmpty()) { communityList.Sort(); ret.Add(communityList); } if (!channelList.IsEmpty()) { channelList.Sort(); ret.Add(channelList); } if (!officialList.IsEmpty()) { officialList.Sort(); ret.Add(officialList); } if (!uploaderList.IsEmpty()) { uploaderList.Sort(); ret.Add(uploaderList); } } return(ret); } catch (RequestFailed) { Owner.Status = "コメントの取得に失敗しました"; return(null); } }
public async Task <int> PostAsync(NicoNicoCommentList target, int vpos, string mail, string text) { try { var query = new GetRequestQuery(GetPostKeyApiUrl); query.AddQuery("thread", target.ThreadId); query.AddQuery("block_no", Math.Floor((decimal)(target.LastRes + 1) / 100).ToString()); query.AddQuery("device", "1"); query.AddQuery("version", "1"); query.AddQuery("version_sub", "6"); var postkey = await App.ViewModelRoot.CurrentUser.Session.GetAsync(query.TargetUrl); PacketId = PacketCount; var jsonarray = new List <object>(); //rs jsonarray.Add(new { ping = new { content = "rs:" + RequestId % IdLimit } }); //ps jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } }); //コメント投稿 var chat = new { thread = target.ThreadId, vpos = vpos, mail = mail, ticket = target.Ticket, user_id = int.Parse(Owner.ApiData.Viewer.Id), premium = Owner.ApiData.Viewer.IsPremium ? 1 : 0, postkey = postkey, content = text }; jsonarray.Add(new { chat = chat }); //pf jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } }); //rf jsonarray.Add(new { ping = new { content = "rf:" + RequestId++ % IdLimit } }); var request = new HttpRequestMessage(HttpMethod.Post, Owner.ApiData.Thread.ServerUrl) { Content = new StringContent(DynamicJson.Serialize(jsonarray), Encoding.UTF8, "text/plain") }; PacketCount += jsonarray.Count; var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request); //成功したか確認 foreach (var entry in DynamicJson.Parse(a)) { if (entry.chat_result()) { if (entry.chat_result.status == 0D) { Owner.Status = "コメントを投稿しました"; return((int)entry.chat_result.no); } else { Owner.Status = "コメントの投稿に失敗しました"; return(-1); } } } return(-1); } catch (RequestFailed) { Owner.Status = "コメントの投稿に失敗しました"; return(-1); } }