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()); } } }
public void GivenNullString_MustParsed() { var visitor = JsonVisitor.FromString(null); Assert.IsNotNull(visitor); visitor = JsonVisitor.FromString(string.Empty); Assert.IsNotNull(visitor); }
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); } }
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()); }
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(); }
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); } } }
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()); }
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(); }
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()); } } }
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()); } }
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(); } }
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); }
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(); } }
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()); } }