protected override async Task <GetChaptersResponse> GetChaptersAsync(GetChaptersRequest request) { var r = new GetChaptersResponse(); var keyList = request.ChapterKeys.ToArray(); for (var i = 0; i < keyList.Length; i++) { var ck = keyList[i]; if (ck.StartsWith("n")) { var pck = ck.Substring(1); var pdoc = await GetDoc(new Uri($"read/{request.BookKey}/{pck}.html", UriKind.Relative)); ck = await parseChapterPageAsync(new ChapterDataDetailed(), pdoc); } var doc = await GetDoc(new Uri($"read/{request.BookKey}/{ck}.html", UriKind.Relative)); var cc = new ChapterDataDetailed(); var nk = await parseChapterPageAsync(cc, doc); if (i + 1 < keyList.Length && keyList[i + 1].Substring(1) == ck) { keyList[i + 1] = nk; } r.Chapters.Add(cc); } return(r); }
protected override async Task <GetChaptersResponse> GetChaptersAsync(GetChaptersRequest request) { var r = new GetChaptersResponse(); var keyList = request.ChapterKeys.ToArray(); for (var i = 0; i < keyList.Length; i++) { var ck = keyList[i].Split(new[] { ' ' }, 2); var doc = await GetDoc(new Uri($"/xiaoshuo/{request.BookKey}/{ck[0]}.html", UriKind.Relative)); var cc = new ChapterDataDetailed { Key = keyList[i], VolumeTitle = ck[1] }; parseChapterPage(cc, doc); r.Chapters.Add(cc); } return(r); }
private void parseChapterPage(ChapterDataDetailed chapter, HtmlDocument document) { //var articlename='放开那个女巫'; //var chaptername=' 第一千一百七十四章 一劳永逸的货币方案'; //var bookid='97525'; //var preview_page = "/xiaoshuo/97/97525/25492728.html"; //var next_page = "/xiaoshuo/97/97525/"; //var index_page = "/xiaoshuo/97/97525/"; //var chapter_id = "25497283"; var script = document.DocumentNode.SelectNodes("/html/head/script").Last(n => !n.GetInnerText().IsNullOrWhiteSpace()); var prop = Helpers.ParseJsKvp(script.GetInnerText()); chapter.Title = prop["chaptername"]; if (chapter.Title.StartsWith(chapter.VolumeTitle)) { chapter.Title = chapter.Title.Substring(chapter.VolumeTitle.Length); } chapter.Title = chapter.Title.Trim(); var c = document.GetElementbyId("box").Element("p", "Text"); var s = default(StringBuilder); chapter.WordCount = 0; foreach (var item in c.Elements("#text")) { var t = item.GetInnerText(); if (t.EndsWith("2k小说阅读网")) { t = t.Substring(0, t.Length - "2k小说阅读网".Length); } t = t.Trim(); if (t.IsNullOrEmpty() && s is null) { continue; } s = s ?? new StringBuilder(); s.AppendLine(t); chapter.WordCount += t.Length; } chapter.Content = s.ToString(); }
private async Task <string> parseChapterPageAsync(ChapterDataDetailed chapter, HtmlDocument document) { // var preview = "7966638.html",next = "7966640.html",bid = "11341",book="剑娘",zid = "7966639",chapter = "第893章 舰娘再现";document.onkeydown= jumpPage; var rscript = document.DocumentNode.SelectNodes("/html/head/script").Last(n => !n.GetInnerText().IsNullOrWhiteSpace()); var prop = Helpers.ParseJsKvp(rscript.GetInnerText()); chapter.Key = prop["zid"]; chapter.Title = prop["chapter"]; var nk = prop["next"]; // 123567.html if (nk.Contains('.')) { nk = nk.Substring(0, nk.IndexOf('.')); } else { nk = null; //the last chapter } var center = document.GetElementbyId("center"); chapter.UpdateTime = DateTime.Parse(center.SelectSingleNode("./div[@class='title']/span[last()]").GetInnerText()); chapter.WordCount = int.Parse(center.SelectSingleNode("./div[@class='title']/span[last()-1]").GetInnerText()); var displayTitle = center.SelectSingleNode("./div[@class='title']/h1").GetInnerText(); if (displayTitle != chapter.Title && displayTitle.EndsWith(chapter.Title)) { chapter.VolumeTitle = displayTitle.Substring(0, displayTitle.Length - chapter.Title.Length).Trim(); } var script = center.SelectSingleNode("./script"); var content = document.GetElementbyId("content"); if (script != null) { var scr = script.GetInnerText(); var uri = "/ajax/content/"; var data = default(Dictionary <string, string>); IJsValue post(IJsFunction callee, IJsObject caller, bool isConstructCall, IReadOnlyList <IJsValue> arguments) { uri = arguments[0].ToString().CoalesceNullOrEmpty("/ajax/content/"); data = ((IDictionary <string, IJsValue>)arguments[1]).ToDictionary(kv => kv.Key, kv => kv.Value.ToString()); return(JsUndefined.Instance); } using (jsrt.CreateContext().Use(true)) { var jq = JsObject.Create(); jq["post"] = JsFunction.Create(post); JsValue.GlobalObject["$"] = jq; JsContext.RunScript(scr); } var realContent = await Post(new Uri(uri, UriKind.RelativeOrAbsolute), new HttpFormUrlEncodedContent(data)); var contentDoc = new HtmlDocument(); contentDoc.Load((await realContent.Content.ReadAsBufferAsync()).AsStream(), document.DeclaredEncoding); content = contentDoc.DocumentNode; } chapter.Content = string.Join("\n", content.Elements("p").EmptyIfNull().Select(p => p.GetInnerText())); return(nk); }