Exemplo n.º 1
0
        public async Task ParsePageTest(string id)
        {
            var args = new DevPageGetRequest
            {
                Query = new DevPageGetRequest.QueryArgs()
                {
                    Id             = id,
                    LanguageCode   = "en",
                    GovernmentCode = "us"
                }
            };
            var result = await _pageParser.TryParsePageAsync(args);

            Assert.IsTrue(result.IsSuccess);
            Assert.IsTrue(result.Result.AppIds.Length >= 10);
        }
        private async Task <OperationResult <List <string> > > TryGetNextPageAsync(string url, CancellationToken token)
        {
            var args     = new DevPageGetRequest();
            var response = await _client.GetAsync <DevPageGetRequest, string>(Host + url, args, token).ConfigureAwait(true);

            if (response.IsSuccess)
            {
                var appIds = new List <string>();

                var html    = response.Result;
                var matches = InitDataCallbackRegex.Matches(html);

                foreach (Match match in matches)
                {
                    var jsonData = InitDataRegex.Match(match.Value);
                    if (!jsonData.Success)
                    {
                        continue;
                    }

                    var data = JsonConvert.DeserializeObject <InitData>(jsonData.Groups[1].Value);

                    if (data.IsError || string.IsNullOrEmpty(data.Key))
                    {
                        continue;
                    }

                    switch (data.Key)
                    {
                    case "ds:3":
                    {
                        var jArr = (JArray)data.Data;
                        var apps = TryGetValue <JArray>(jArr, 0, 1, 0, 0, 0);
                        appIds = TryGetValues <string>(apps, 12, 0).ToList();

                        //TODO: KOA Pagination not supported :( Please add if know how

                        break;
                    }
                    }
                }

                return(new OperationResult <List <string> >(appIds));
            }

            return(new OperationResult <List <string> >(response.Exception));
        }
        public async Task <OperationResult <DevInfo> > TryParsePageAsync(DevPageGetRequest args, CancellationToken token = default(CancellationToken))
        {
            var isv2 = _urlVersionRegex.IsMatch(args.Query.Id);

            var response = await _client.GetAsync <DevPageGetRequest, string>(isv2?DevUrl : DeveloperUrl, args, token).ConfigureAwait(true);

            if (response.IsSuccess)
            {
                var devInfo = new DevInfo
                {
                    DevId = args.Query.Id
                };

                var html    = response.Result;
                var matches = InitDataCallbackRegex.Matches(html);

                foreach (Match match in matches)
                {
                    var jsonData = InitDataRegex.Match(match.Value);
                    if (!jsonData.Success)
                    {
                        continue;
                    }

                    var data = JsonConvert.DeserializeObject <InitData>(jsonData.Groups[1].Value);

                    if (data.IsError || string.IsNullOrEmpty(data.Key))
                    {
                        continue;
                    }

                    switch (data.Key)
                    {
                    case "ds:3":
                    {
                        var jArr = (JArray)data.Data;
                        var apps = TryGetValue <JArray>(jArr, 0, 1, 0, 0, 0);
                        devInfo.AppIds = TryGetValues <string>(apps, 12, 0).ToArray();

                        var more = TryGetValue <string>(jArr, 0, 1, 0, 0, 3, 4, 2);
                        if (!string.IsNullOrEmpty(more) && more.StartsWith("/store/"))
                        {
                            var appIds = await TryGetNextPageAsync(more, token).ConfigureAwait(true);

                            if (appIds.IsSuccess)
                            {
                                appIds.Result.AddRange(devInfo.AppIds);
                                devInfo.AppIds = appIds.Result.Distinct().ToArray();
                            }
                        }

                        break;
                    }
                    }
                }

                return(new OperationResult <DevInfo>(devInfo));
            }

            return(new OperationResult <DevInfo>(response.Exception));
        }