コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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();
        }
コード例 #4
0
        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);
        }