예제 #1
0
        public static async Task <ContentManageResult> RemoveFollowCommunityAsync(NiconicoContext context, string communityId)
        {
            var token = await GetCommunityLeaveTokenAsync(context, communityId);

            var url  = NiconicoUrls.CommunityLeavePageUrl + token.CommunityId;
            var dict = new Dictionary <string, string>();

            dict.Add("time", token.Time);
            dict.Add("commit_key", token.CommitKey);
            dict.Add("commit", token.Commit);

#if WINDOWS_UWP
            var content = new HttpFormUrlEncodedContent(dict);
#else
            var content = new FormUrlEncodedContent(dict);
#endif


            var request = new HttpRequestMessage(HttpMethod.Post, new Uri(url));
            request.Headers.Add("Upgrade-Insecure-Requests", "1");
            request.Headers.Add("Referer", url);
            request.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");

            request.Content = content;
            var postResult = await context.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

            Debug.WriteLine(postResult);

            return(postResult.IsSuccessStatusCode ? ContentManageResult.Success : ContentManageResult.Failed);
        }
예제 #2
0
        public static async Task <bool> UpdateMylistGroupAsync(NiconicoContext context, string mylistId, string name, string description, bool isPublic, MylistSortKey defaultSortKey, MylistSortOrder defaultSortOrder)
        {
            var dict = new Dictionary <string, string>();

            dict.Add("name", name);
            dict.Add("description", description);
            dict.Add("isPublic", isPublic.ToString1Or0());
            dict.Add("defaultSortKey", defaultSortKey.ToQueryString());
            dict.Add("defaultSortOrder", defaultSortOrder.ToQueryString());

            var request = new HttpRequestMessage(HttpMethod.Put, new Uri($"https://nvapi.nicovideo.jp/v1/users/me/mylists/{mylistId}"));

#if WINDOWS_UWP
            request.Content         = new HttpFormUrlEncodedContent(dict);
            request.Headers.Referer = new Uri($"https://www.nicovideo.jp/my/mylist/{mylistId}");
#else
            request.Content          = new FormUrlEncodedContent(dict);
            request.Headers.Referrer = new Uri($"https://www.nicovideo.jp/my/mylist/{mylistId}");
#endif
            request.Headers.Add("X-Request-With", "https://www.nicovideo.jp");


            var res = await context.SendAsync(request);

            var json = await res.Content.ReadAsStringAsync();

            var result = JsonConvert.DeserializeObject <MylistUpdateResultResponse>(json);
            return(result.Meta.Status == 200);
        }
예제 #3
0
        public static async Task <ContentManageResult> AddFollowCommunityAsync(NiconicoContext context, string communityId)
        {
            var communityIdWoCo      = communityId.Substring(2);
            var communityJoinPageUrl = new Uri($"https://com.nicovideo.jp/motion/{communityId}");

            var uri = $"https://com.nicovideo.jp/api/v1/communities/{communityIdWoCo}/follows.json";
            //            await PrepareCorsAsscessAsync(HttpMethod.Post, uri);

            var request = new HttpRequestMessage(HttpMethod.Post, new Uri(uri));

#if WINDOWS_UWP
            request.Headers.Referer = communityJoinPageUrl;
            request.Headers.Host    = new Windows.Networking.HostName("com.nicovideo.jp");
#else
            request.Headers.Referrer = communityJoinPageUrl;
            request.Headers.Host     = "com.nicovideo.jp";
#endif
            request.Headers.Add("Origin", "https://com.nicovideo.jp");
            request.Headers.Add("X-Requested-By", communityJoinPageUrl.OriginalString);

            var message = await context.SendAsync(request);

            var json = await message.Content.ReadAsStringAsync();

            var result = Newtonsoft.Json.JsonConvert.DeserializeObject <FollowResultResponse>(json);


            return(result.Meta.Status == 200 || result.Meta.Status == 201 ? ContentManageResult.Success : ContentManageResult.Failed);
        }
예제 #4
0
        public static async Task <string> GetDmcWatchResponseDataAsync(NiconicoContext context, string requestId)
        {
            if (!NiconicoRegex.IsVideoId(requestId))
            {
                //				throw new ArgumentException();
            }

            var dict = new Dictionary <string, string>();
            var url  = $"{NiconicoUrls.VideoWatchPageUrl}{requestId}";

            url += "?" + HttpQueryExtention.DictionaryToQuery(dict);

            try
            {
                var message = new HttpRequestMessage(HttpMethod.Get, new Uri(url));

                var res = await context.SendAsync(message);

                if (res.ReasonPhrase == "Forbidden")
                {
                    throw new WebException("require payment.");
                }

                var text = await res.Content.ReadAsStringAsync();

                return(text);
            }
            catch (Exception e)
            {
                throw new WebException("access failed watch/" + requestId, e);
            }
        }
예제 #5
0
        public static async Task DmcSessionExitHeartbeatAsync(
            NiconicoContext context,
            DmcWatchResponse watch,
            DmcSessionResponse sessionRes
            )
        {
            var session    = watch.Media.Delivery.Movie.Session;
            var sessionUrl = $"{session.Urls[0].UrlUnsafe}/{sessionRes.Data.Session.Id}?_format=json&_method=DELETE";

            var message = new HttpRequestMessage(HttpMethod.Post, new Uri(sessionUrl));

            message.Headers.Add("Access-Control-Request-Method", "POST");
            message.Headers.Add("Access-Control-Request-Headers", "content-type");
            message.Headers.UserAgent.Add(context.HttpClient.DefaultRequestHeaders.UserAgent.First());
            message.Headers.Add("Accept", "application/json");

            var requestJson = JsonConvert.SerializeObject(sessionRes.Data, new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore
            });

#if WINDOWS_UWP
            message.Content = new HttpStringContent(requestJson, Windows.Storage.Streams.UnicodeEncoding.Utf8, "application/json");
#else
            message.Content = new StringContent(requestJson, UnicodeEncoding.UTF8, "application/json");
#endif
            var result = await context.SendAsync(message, HttpCompletionOption.ResponseHeadersRead);

            if (!result.IsSuccessStatusCode)
            {
                System.Diagnostics.Debug.WriteLine(result.ToString());
            }
        }
예제 #6
0
        public static async Task DmcSessionFirstHeartbeatAsync(
            NiconicoContext context,
            DmcWatchResponse watch,
            DmcSessionResponse sessionRes
            )
        {
            var session    = watch.Media.Delivery.Movie.Session;
            var sessionUrl = $"{session.Urls[0].UrlUnsafe}/{sessionRes.Data.Session.Id}?_format=json&_method=PUT";

            var message = new HttpRequestMessage(HttpMethod.Options, new Uri(sessionUrl));

            message.Headers.Add("Access-Control-Request-Method", "POST");
            message.Headers.Add("Access-Control-Request-Headers", "content-type");
#if WINDOWS_UWP
            message.Headers.UserAgent.Add(context.HttpClient.DefaultRequestHeaders.UserAgent.First());
#else
            message.Headers.UserAgent.Add(context.HttpClient.DefaultRequestHeaders.UserAgent.First());
#endif

            var result = await context.SendAsync(message, HttpCompletionOption.ResponseHeadersRead);

            if (!result.IsSuccessStatusCode)
            {
                System.Diagnostics.Debug.WriteLine(result.ToString());
            }
        }
예제 #7
0
        public static async Task <string> PostReservationAsync(NiconicoContext context, string vid, bool overwrite)
        {
            var dict = new Dictionary <string, string>();

            if (vid.StartsWith("lv"))
            {
                vid = vid.Remove(0, 2);
            }

            if (!int.TryParse(vid, out var vidNumber))
            {
                throw new ArgumentException("vid can not accept NiconicoLiveContentId.");
            }

            dict.Add(nameof(vid), vid);
            dict.Add(nameof(overwrite), overwrite.ToString1Or0());

            var requestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri("http://live.nicovideo.jp/api/timeshift.reservations"))
            {
#if WINDOWS_UWP
                Content = new HttpFormUrlEncodedContent(dict)
#else
                Content = new FormUrlEncodedContent(dict)
#endif
            };

            requestMessage.Headers.Add("origin", "https://live.nicovideo.jp");
            var response = await context.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead);

            return(await response.Content.ReadAsStringAsync());
        }
예제 #8
0
        public static async Task <bool> SendOfficialHlsWatchAsync(
            NiconicoContext context,
            string contentId,
            string trackId
            )
        {
            var uri        = new Uri($"https://nvapi.nicovideo.jp/v1/2ab0cbaa/watch?t={Uri.EscapeDataString(trackId)}");
            var refererUri = new Uri($"https://www.nicovideo.jp/watch/{contentId}");

            {
                var optionReq = new HttpRequestMessage(HttpMethod.Options, uri);
                optionReq.Headers.Add("Access-Control-Request-Headers", "x-frontend-id,x-frontend-version");
                optionReq.Headers.Add("Access-Control-Request-Method", "GET");
                optionReq.Headers.Add("Origin", "https://www.nicovideo.jp");
#if WINDOWS_UWP
                optionReq.Headers.Referer = refererUri;
#else
                optionReq.Headers.Referrer = refererUri;
#endif
                var optionRes = await context.SendAsync(optionReq);

                if (!optionRes.IsSuccessStatusCode)
                {
                    return(false);
                }
            }
            //var allowHeaders = res.Headers["Access-Control-Allow-Headers"];

            {
                var watchReq = new HttpRequestMessage(HttpMethod.Get, uri);

                watchReq.Headers.Add("X-Frontend-Id", "6");
                watchReq.Headers.Add("X-Frontend-Version", "0");
#if WINDOWS_UWP
                watchReq.Headers.Referer = refererUri;
#else
                watchReq.Headers.Referrer = refererUri;
#endif
                watchReq.Headers.Add("Origin", "https://www.nicovideo.jp");

                var watchRes = await context.SendAsync(watchReq);

                return(watchRes.IsSuccessStatusCode);
            }
        }
예제 #9
0
        public static async Task <ContentManageResult> RemoveMylistItemAsync(NiconicoContext context, string group_id, params string[] itemIdList)
        {
            string url = $"https://nvapi.nicovideo.jp/v1/users/me/mylists/{group_id}/items?itemIds=" + string.Join("%2C", itemIdList);

            var res = await context.SendAsync(new HttpRequestMessage(HttpMethod.Delete, new Uri(url)));

            var json = await res.Content.ReadAsStringAsync();

            var result = Newtonsoft.Json.JsonConvert.DeserializeObject <MylistContentResult>(json);

            return(result.Meta.Status == 200 ? ContentManageResult.Success : ContentManageResult.Failed);
        }
예제 #10
0
        // Liveのwatchページから再生準備情報を取得します
        public static async Task <string> GetLiveWatchPageHtmlAsync(NiconicoContext context, string liveId, bool forceHtml5 = true)
        {
#if WINDOWS_UWP
            var request = new HttpRequestMessage(HttpMethod.Get, new Uri(NiconicoUrls.Live2WatchPageUrl + liveId));
#else
            var request = new HttpRequestMessage(HttpMethod.Get, NiconicoUrls.Live2WatchPageUrl + liveId);
#endif
            request.Headers.Add(@"Cookie", "player_version=leo");
            var res = await context.SendAsync(request);

            return(await res.Content.ReadAsStringAsync());
        }
예제 #11
0
        // https://www.nicovideo.jp/api/watch/v3_guest/1615359905?_frontendId=6&_frontendVersion=0&actionTrackId=rV8Nf4Qith_1615871913294&skips=harmful&additionals=pcWatchPage,external,marquee,series&isContinueWatching=true&i18nLanguage=ja-jp&t=1615871919713
        // https://www.nicovideo.jp/api/watch/v3/1615359905?_frontendId=6&_frontendVersion=0&actionTrackId=nYQzK4jFdB_1615872059788&skips=harmful&additionals=pcWatchPage,external,marquee,series&isContinueWatching=true&i18nLanguage=ja-jp&t=1615872080318
        public static async Task <string> GetDmcWatchJsonDataAsync(NiconicoContext context, string requestId, bool isLoggedIn, string actionTrackId)
        {
            if (!NiconicoRegex.IsVideoId(requestId))
            {
                //				throw new ArgumentException();
            }

            //bool isLoggedIn = true;

            var dict = new Dictionary <string, string>();
            var url  = $"{NiconicoUrls.VideoApiUrlBase}watch/{(isLoggedIn ? "v3" : "v3_guest")}/{requestId}";

            dict.Add("_frontendId", "6");
            dict.Add("_frontendVersion", "0");
            dict.Add("actionTrackId", actionTrackId);
            dict.Add("skips", "harmful");
            dict.Add("additionals", WebUtility.UrlEncode("pcWatchPage,external,marquee,series"));
            dict.Add("isContinueWatching", "true");
            dict.Add("i18nLanguage", "ja-jp");
            dict.Add("t", DateTimeOffset.Now.ToUnixTimeMilliseconds().ToString());

            url += "?" + HttpQueryExtention.DictionaryToQuery(dict);

            var requestMessage = new HttpRequestMessage(HttpMethod.Get, new Uri(url));

            requestMessage.Headers.Add("Accept", "*/*");
            requestMessage.Headers.Referer = new Uri($"https://www.nicovideo.jp/watch/{requestId}");
            requestMessage.Headers.Add("Sec-Fetch-Site", "same-origin");
            requestMessage.Headers.Host = new Windows.Networking.HostName("www.nicovideo.jp");

            try
            {
                var res = await context.SendAsync(requestMessage);

                if (res.ReasonPhrase == "Forbidden")
                {
                    throw new WebException("require payment.");
                }

                var text = await res.Content.ReadAsStringAsync();

                return(text);
            }
            catch (Exception e)
            {
                throw new WebException("access failed watch/" + requestId, e);
            }
        }
예제 #12
0
        // Communityへの登録
        // http://com.nicovideo.jp/motion/co1894176
        // mode:commit
        // title:登録申請
        // comment:
        // notify:
        // POST
        public static async Task <ContentManageResult> AddFollowCommunityAsync___(
            NiconicoContext context
            , string communityId
            , string title   = ""
            , string comment = ""
            , bool notify    = false
            )
        {
            // http://com.nicovideo.jp/motion/id にアクセスして200かを確認

            var url = NiconicoUrls.CommunityJoinPageUrl + communityId;
            var res = await context.GetAsync(url);

            if (!res.IsSuccessStatusCode)
            {
                return(ContentManageResult.Failed);
            }

            await Task.Delay(1000);

            // http://com.nicovideo.jp/motion/id に情報をpostする
            var dict = new Dictionary <string, string>()
            {
                { "mode", "commit" },
                { "title", title ?? "フォローリクエスト" },
                { "comment", comment ?? "" },
                { "notify", notify ? "1" : "" },
            };

            var request = new HttpRequestMessage(HttpMethod.Post, new Uri(url));

            request.Headers.Add("Upgrade-Insecure-Requests", "1");
            request.Headers.Add("Referer", url);
            request.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");

#if WINDOWS_UWP
            request.Content = new HttpFormUrlEncodedContent(dict);
#else
            request.Content = new FormUrlEncodedContent(dict);
#endif

            var postResult = await context.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

            Debug.WriteLine(postResult);

            return(postResult.IsSuccessStatusCode ? ContentManageResult.Success : ContentManageResult.Failed);
        }
예제 #13
0
        public static async Task <bool> RemoveMylistGroupAsync(NiconicoContext context, string mylistId)
        {
            var request = new HttpRequestMessage(HttpMethod.Delete, new Uri($"https://nvapi.nicovideo.jp/v1/users/me/mylists/{mylistId}"));

#if WINDOWS_UWP
            request.Headers.Referer = new Uri($"https://www.nicovideo.jp/my/mylist/{mylistId}");
#else
            request.Headers.Referrer = new Uri($"https://www.nicovideo.jp/my/mylist/{mylistId}");
#endif
            request.Headers.Add("X-Request-With", "https://www.nicovideo.jp");

            var res = await context.SendAsync(request);

            var json = await res.Content.ReadAsStringAsync();

            var result = JsonConvert.DeserializeObject <MylistUpdateResultResponse>(json);
            return(result.Meta.Status == 200);
        }