Exemple #1
0
        public async Task <ComicPage[]> GetPagesAsync(string targetUrl)
        {
            var tur = new Uri(targetUrl).Segments;
            var seg = tur[tur.Length - 2].Trim('/');
            var idx = tur[tur.Length - 1].Replace(".html", string.Empty);
            var url = string.Format(pagesUrl, seg, idx);

            using (var stream = await GetStreamAsync(url))
            {
                var str = string.Empty;
                using (var sr = new StreamReader(stream))
                {
                    str = sr.ReadToEnd();
                }
                using (var jobj = JsonVisitor.FromString(str))
                {
                    var imgs  = jobj["listImg"].ToEnumerable();
                    var pages = new List <ComicPage>();
                    var i     = 0;
                    foreach (var item in imgs)
                    {
                        var page = new ComicPage {
                            Name = i++.ToString(), TargetUrl = item.ToString()
                        };
                        pages.Add(page);
                    }
                    return(pages.ToArray());
                }
            }
        }
Exemple #2
0
        public void GivenNullString_MustParsed()
        {
            var visitor = JsonVisitor.FromString(null);

            Assert.IsNotNull(visitor);
            visitor = JsonVisitor.FromString(string.Empty);
            Assert.IsNotNull(visitor);
        }
Exemple #3
0
        public async Task <SearchComicResult> SearchAsync(string keywork, int skip, int take)
        {
            var page = 1;

            if (take != 0)
            {
                page = Math.Max(1, skip / take);
            }
            var targetUrl = string.Format(url, keywork, page, take);
            var setting   = new RequestSettings
            {
                Address  = targetUrl,
                Referrer = "https://www.kuaikanmanhua.com/"
            };
            var datas = await networkAdapter.GetStringAsync(setting);

            using (var visit = JsonVisitor.FromString(datas))
            {
                var hit = visit["data"]["hit"].ToArray();
                var res = new SearchComicResult
                {
                    Total   = hit.Count(),
                    Support = true
                };
                var sns = new List <ComicSnapshot>();
                foreach (var item in hit)
                {
                    var conv  = item["vertical_image_url"].ToString();
                    var title = item["title"].ToString();
                    var id    = item["id"].ToString();
                    var desc  = item["description"].ToString();
                    var user  = item["user"]["nickname"].ToString();
                    var sn    = new ComicSnapshot
                    {
                        Author    = user,
                        Descript  = desc,
                        ImageUri  = conv,
                        Name      = title,
                        TargetUrl = targetUrl,
                        Sources   = new ComicSource[]
                        {
                            new ComicSource
                            {
                                TargetUrl = "https://www.kuaikanmanhua.com/web/topic/" + id,
                                Name      = "Kuaikan"
                            }
                        }
                    };
                    sns.Add(sn);
                }
                res.Snapshots = sns.ToArray();
                return(res);
            }
        }
Exemple #4
0
        public void GivenStringToCreate_MustParsedToObjectOrArray()
        {
            var obj    = @"{""A"":1,""B"":2}";
            var arr    = @"[1,2,3,4]";
            var visit1 = JsonVisitor.FromString(obj);
            var val    = visit1["A"];

            Assert.AreEqual("1", val.ToString());
            var visit2 = JsonVisitor.FromString(arr);

            Assert.AreEqual(4, visit2.ToArray().Count());
        }
Exemple #5
0
        public void GivenArrayValue_IsArrayMustTrue()
        {
            var val     = "[]";
            var visitor = JsonVisitor.FromString(val);

            Assert.IsTrue(visitor.IsArray);
            visitor.Dispose();

            val     = "{}";
            visitor = JsonVisitor.FromString(val);
            Assert.IsFalse(visitor.IsArray);
            visitor.Dispose();
        }
Exemple #6
0
        public async Task <ComicEntity> GetChaptersAsync(string targetUrl)
        {
            var mc   = new Uri(targetUrl).Segments.Last();
            var part = mc.Remove(0, 2);

            using (var mem = GetStream())
            {
                var arg = $"{{\"comic_id\":{part}}}";
                WrtieStream(mem, arg);
                var stream = await GetStreamAsync(detailUri, "POST", mem);

                string str = null;
                using (var sr = new StreamReader(stream))
                {
                    str = sr.ReadToEnd();
                }
                using (var jobj = JsonVisitor.FromString(str))
                {
                    var data   = jobj["data"];
                    var entity = new ComicEntity
                    {
                        Name     = data["title"].ToString(),
                        Descript = data["evaluate"].ToString(),
                        ComicUrl = targetUrl,
                        ImageUrl = data["vertical_cover"].ToString()
                    };
                    var ep     = data["ep_list"].ToEnumerable();
                    var len    = ep.Count();
                    var chapts = new List <ComicChapter>(ep.Count());
                    foreach (var item in ep)
                    {
                        var title = item["title"].ToString();
                        if (string.IsNullOrWhiteSpace(title))
                        {
                            title = entity.Name + "-" + (len - chapts.Count);
                        }
                        var id  = item["id"].ToString();
                        var url = "https://manga.bilibili.com/" + mc + "/mc" + id;
                        var chp = new ComicChapter
                        {
                            TargetUrl = url,
                            Title     = title
                        };
                        chapts.Add(chp);
                    }
                    chapts.Reverse();
                    entity.Chapters = chapts.ToArray();
                    return(entity);
                }
            }
        }
Exemple #7
0
        public async Task <ComicPage[]> GetPagesAsync(string targetUrl)
        {
            var    blocks = new List <ComicPage>();
            string str    = null;

            using (var sr = new StreamReader(await CreateRequest(targetUrl)))
            {
                str = sr.ReadToEnd();
            }
            var match = regex.Match(str);
            var sc    = match.Groups[0].Value + ";pages;";
            var strx  = v8.Evaluate(sc)?.ToString();

            if (strx is null)
            {
#if NETSTANDARD1_3 || NET452
                return(new ComicPage[0]);
#else
                return(Array.Empty <ComicPage>());
#endif
            }
            string[] inn     = null;
            var      visitor = JsonVisitor.FromString(strx.Replace("\r\n", "$@$"));
            try
            {
                if (strx.StartsWith("{"))
                {
                    inn = visitor["page_url"].ToString().Split(new[] { "$@$" }, StringSplitOptions.RemoveEmptyEntries);
                }
                else
                {
                    inn = visitor.ToEnumerable().Select(x => x.ToString()).ToArray();
                }
                foreach (var item in inn)
                {
                    var val  = item.ToString().Trim();
                    var name = HttpUtility.UrlDecode(val.Split('/').Last());
                    blocks.Add(new ComicPage
                    {
                        Name      = name,
                        TargetUrl = "https://images.dmzj.com/" + val
                    });
                }
            }
            finally
            {
                visitor.Dispose();
            }
            return(blocks.ToArray());
        }
Exemple #8
0
        public void GivenNullOrNot_HasValueMustFalseOrTrue()
        {
            var visitor = JsonVisitor.FromString(null);

            Assert.IsFalse(visitor.HasValue);
            visitor.Dispose();

            visitor = JsonVisitor.FromString("{}");
            Assert.IsTrue(visitor.HasValue);
            visitor.Dispose();

            visitor = JsonVisitor.FromString("[]");
            Assert.IsTrue(visitor.HasValue);
            visitor.Dispose();
        }
Exemple #9
0
        public async Task <ComicPage[]> GetPagesAsync(string targetUrl)
        {
            const int width        = 660;
            var       epId         = new Uri(targetUrl).Segments.Last().TrimStart('m', 'c');
            string    targetObjStr = null;

            using (var mem = GetStream())
            {
                var arg = $"{{\"ep_id\":{epId}}}";
                WrtieStream(mem, arg);
                var stream = await GetStreamAsync(imgIndexUri, "POST", mem);

                string str = null;
                using (var sr = new StreamReader(stream))
                {
                    str = sr.ReadToEnd();
                }
                using (var jobj = JsonVisitor.FromString(str))
                {
                    var imgs  = jobj["data"]["images"].ToEnumerable();
                    var paths = imgs.Select(x => x["path"].ToString() + $"@{width}w.jpg").ToArray();
                    targetObjStr = "{\"urls\":\"[" + string.Join(",", paths.Select(x => $"\\\"{x}\\\"")) + "]\"}";
                }
            }
            using (var mem = GetStream())
            {
                WrtieStream(mem, targetObjStr);
                var stream = await GetStreamAsync(imgTokenUri, "POST", mem);

                string str = null;
                using (var sr = new StreamReader(stream))
                {
                    str = sr.ReadToEnd();
                }
                using (var jobj = JsonVisitor.FromString(str))
                {
                    var data  = jobj["data"].ToEnumerable();
                    var pages = data.Select(x => x["url"].ToString() + "?token=" + x["token"].ToString())
                                .ToArray();
                    return(Enumerable.Range(0, pages.Length)
                           .Select(x => new ComicPage {
                        Name = x.ToString(), TargetUrl = pages[x]
                    })
                           .ToArray());
                }
            }
        }
Exemple #10
0
        public async Task <ComicPage[]> GetPagesAsync(string targetUrl)
        {
            var str = string.Empty;

            using (var sr = new StreamReader(await GetStreamAsync(targetUrl)))
            {
                str = sr.ReadToEnd();
            }
            var html = new HtmlDocument();

            html.LoadHtml(str);
            var eval = await GetJsEvalAsync(FetchJsEvalAsync);

            var dataBlock  = dataRegex.Match(str);
            var noticLeft  = str.IndexOf("window[\"n", str.IndexOf("window[\"n") + 4);
            var noticRight = str.IndexOf(";", noticLeft);
            var notic      = str.Substring(noticLeft, noticRight - noticLeft);
            var data       = dataBlock.Groups[1].Value;
            var dataJs     = "var DATA='" + data + "';window.DATA=DATA;";
            var sb         = new StringBuilder();

            sb.Append(varJs);
            sb.Append(dataJs);
            sb.Append(notic + ";");
            sb.Append(eval);
            sb.Append(";JSON.stringify(_v);");
            var val = jsEngine.Evaluate(sb.ToString()).ToString();

            using (var doc = JsonVisitor.FromString(val))
            {
                var pages = new List <ComicPage>();
                var pics  = doc["picture"].ToEnumerable();
                foreach (var item in pics)
                {
                    var pid  = item["pid"];
                    var url  = item["url"];
                    var page = new ComicPage
                    {
                        Name      = pid.ToString(),
                        TargetUrl = url.ToString()
                    };
                    pages.Add(page);
                }
                return(pages.ToArray());
            }
        }
Exemple #11
0
        public async Task <ComicPage[]> GetPagesAsync(string targetUrl)
        {
            var str = string.Empty;

            using (var sr = new StreamReader(await CreateRequest(targetUrl)))
            {
                str = sr.ReadToEnd();
            }
            var jsCodesRgx = regex.Match(str);
            var jsCode     = jsCodesRgx.Groups[1].Value;
            var val        = jsEngine.Evaluate <string>("var a=JSON.stringify(" + jsCode + ");a");
            var visitor    = JsonVisitor.FromString(val);

            try
            {
                var info = visitor["data"]
                           .ToArray().First()["res"]["data"]["comic_info"];
                var comics = info["comic_images"].ToArray();
                var pages  = new List <ComicPage>();
                var title  = info["title"].ToString();
                foreach (var item in comics)
                {
                    var uri  = item["url"].ToString();
                    var page = new ComicPage
                    {
                        Name      = title,
                        TargetUrl = uri
                    };
                    pages.Add(page);
                }
                return(pages.ToArray());
            }
            finally
            {
                visitor.Dispose();
            }
        }
Exemple #12
0
        public async Task <SearchComicResult> SearchAsync(string keywork, int skip, int take)
        {
            var pageIndex = 1;

            if (take != 0)
            {
                pageIndex = Math.Max(1, skip / take);
            }
            var searchObj = new
            {
                key_word  = keywork,
                page_num  = pageIndex,
                page_size = take
            };
            var searchStr = JsonHelper.Serialize(searchObj);
            var res       = new SearchComicResult
            {
                Support = true
            };

            using (var mem = GetStream())
            {
                var buffer = Encoding.UTF8.GetBytes(searchStr);
                mem.Write(buffer, 0, buffer.Length);
                mem.Seek(0, SeekOrigin.Begin);
                var req = new RequestSettings
                {
                    Address  = searchUrl,
                    Method   = "POST",
                    Host     = UrlHelper.FastGetHost(searchUrl),
                    Referrer = "https://manga.bilibili.com/",
                    Data     = mem,
                    Headers  = headers
                };
                var str = await networkAdapter.GetStringAsync(req);

                using (var visitor = JsonVisitor.FromString(str))
                {
                    var list = visitor["data"]["list"].ToEnumerable();
                    res.Total = list.Count();
                    var sns = new List <ComicSnapshot>();
                    foreach (var item in list)
                    {
                        var conv  = item["vertical_cover"].ToString();
                        var title = item["org_title"].ToString();
                        var id    = item["id"].ToString();
                        var auth  = string.Join(",", item["author_name"].ToEnumerable());
                        var url   = "https://manga.bilibili.com/detail/mc" + id;
                        var sn    = new ComicSnapshot
                        {
                            Author    = auth,
                            ImageUri  = conv,
                            Name      = title,
                            TargetUrl = url,
                            Sources   = new ComicSource[]
                            {
                                new ComicSource
                                {
                                    TargetUrl = url,
                                    Name      = "Bilibili"
                                }
                            }
                        };
                        sns.Add(sn);
                    }
                    res.Snapshots = sns.ToArray();
                }
            }
            return(res);
        }
Exemple #13
0
        public async Task <SearchComicResult> SearchAsync(string keywork, int skip, int take)
        {
            var page = 1;

            if (skip != 0 && skip > take)
            {
                page = take / skip;
            }
            var    targetUrl = string.Format(SeachUrl, page, take, keywork);
            string str       = string.Empty;

            using (var rep = await networkAdapter.GetStreamAsync(new RequestSettings {
                Address = targetUrl
            }))
                using (var sr = new StreamReader(rep))
                {
                    str = sr.ReadToEnd();
                }
            var visitor = JsonVisitor.FromString(str);

            try
            {
                var total = int.Parse(visitor["Total"].ToString());
                var items = visitor["Items"].ToArray();
                var snaps = new List <ComicSnapshot>();
                foreach (var item in items)
                {
                    var comic = item["Comics"].ToArray();
                    if (!comic.Any())
                    {
                        continue;
                    }
                    var sn      = new ComicSnapshot();
                    var sources = new List <ComicSource>();
                    foreach (var c in comic)
                    {
                        var host   = c["Host"];
                        var part   = c["Url"];
                        var name   = c["Source"];
                        var source = new ComicSource
                        {
                            Name      = name.ToString(),
                            TargetUrl = host.ToString() + part.ToString()
                        };
                        sources.Add(source);
                    }
                    var first = comic.First();
                    sn.Name      = first["SomanId"].ToString();
                    sn.ImageUri  = first["PicUrl"].ToString();
                    sn.Author    = first["Author"].ToString();
                    sn.Descript  = first["Content"].ToString();
                    sn.TargetUrl = targetUrl;
                    sn.Sources   = sources.ToArray();
                    snaps.Add(sn);
                }
                return(new SearchComicResult
                {
                    Snapshots = snaps.ToArray(),
                    Support = true,
                    Total = total
                });
            }
            finally
            {
                visitor.Dispose();
            }
        }
Exemple #14
0
        public async Task <ComicSnapshot[]> GetProposalAsync(int take)
        {
            var str = string.Empty;

#if NETSTANDARD1_3
            using (var mem = new MemoryStream())
#else
            using (var mem = recyclableMemoryStreamManager.GetStream())
#endif
            {
                var buffer = Encoding.UTF8.GetBytes("{\"page_num\":4,\"seed\":\"0\"}");
                mem.Write(buffer, 0, buffer.Length);
                mem.Seek(0, SeekOrigin.Begin);
                var datas = await networkAdapter.GetStreamAsync(new RequestSettings
                {
                    Address  = url,
                    Referrer = "https://manga.bilibili.com/",
                    Method   = "POST",
                    Data     = mem,
                    Headers  = new Dictionary <string, string>(1)
                    {
                        ["Content-Type"] = "application/json"
                    }
                });

                using (var sr = new StreamReader(datas))
                {
                    str = sr.ReadToEnd();
                }
            }
            using (var doc = JsonVisitor.FromString(str))
            {
                var dataTk = doc["data"]["list"].ToArray().ToArray();
                var sns    = new List <ComicSnapshot>(dataTk.Length);
                for (int i = 0; i < dataTk.Length; i++)
                {
                    if (take < i)
                    {
                        break;
                    }
                    var tk     = dataTk[i];
                    var authTk = tk["authors"]?.ToArray();
                    var title  = tk["title"]?.ToString();
                    var id     = tk["comic_id"]?.ToString();
                    var conver = tk["vertical_cover"]?.ToString();
                    var auth   = string.Join("-", authTk.Select(x => x.ToString()));
                    var sn     = new ComicSnapshot
                    {
                        Author    = auth,
                        Name      = title,
                        ImageUri  = conver,
                        TargetUrl = url,
                        Sources   = new ComicSource[]
                        {
                            new ComicSource
                            {
                                Name      = EngineName,
                                TargetUrl = "https://manga.bilibili.com/detail/" + id
                            }
                        }
                    };
                    sns.Add(sn);
                }
                return(sns.ToArray());
            }
        }