public async Task LoadKeys(string inputPage)
        {
            string page = await DownloadHelper.DownloadStringAsync(inputPage);

            /// Could be secured against changes by capturing the script's path as it exists in the live document instead of assuming the location.
            string pattern         = "<script\\s+(type=[\"']text/javascript[\"'])?\\s+(src=[\"']/Scripts/{0}[\"'])>";
            string concatedPattern = string.Concat(string.Format(pattern, "ca.js"), "|", string.Format(pattern, "lo.js"));

            if (Regex.IsMatch(page, concatedPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled))
            {
                string funcUri     = "http://kissmanga.com/Scripts/lo.js";
                string decryptFunc = await DownloadHelper.DownloadStringAsync(funcUri);

                /// Execute CryptoJS from saved resources to reduce HTTP requests.
                engine.Execute(Properties.Resources.CryptoJs);

                /// Execute the decryption function to allow it to be called later.
                engine.Execute(decryptFunc);

                var keysPattern = "<script type=\"text/javascript\">[\\s]*(?<Value>.*)(?!</script>)";
                var regex       = new Regex(keysPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
                var keys        = string.Empty;

                foreach (Match match in regex.Matches(page))
                {
                    if (match.Value.Contains("CryptoJS"))
                    {
                        keys = match.Groups["Value"].Value;
                        break;
                    }
                }

                if (string.IsNullOrWhiteSpace(keys))
                {
                    throw new ArgumentException("Cannot decrypt image URIs.");
                }
                else
                {
                    engine.Execute(keys);
                }

                decryptor = new KissMangaTextDecryptor((string)engine.Evaluate("iv.toString()"), (string)engine.Evaluate("chko"));
            }
        }
Beispiel #2
0
        public override async Task <Book> GetBook(string bookUrl)
        {
            string page = await DownloadHelper.DownloadStringAsync(bookUrl);

            var  chaptersLinks = ParseHelper.ParseGroup("<a href=\"(?<Value>.*?)\" .*? class=\"tips\">(?<Name>.*?)</a>", page, "Name", "Value").Reverse().ToArray();
            Book book          = new Book();
            var  chapters      = new List <Chapter>();

            for (int i = 0; i < chaptersLinks.Length; i++)
            {
                var c = chaptersLinks[i];
                chapters.Add(new Chapter()
                {
                    DisplayName   = c.Name,
                    Url           = "https:" + c.Value,
                    Book          = book,
                    ChapterNumber = i
                });
            }
            book.Chapters = chapters.ToArray();
            book.Url      = bookUrl;

            //Get other book details
            var imgUrl = ParseHelper.Parse("<div class=\"cover\">\\s+<img .*? src=\"(?<Value>.*?)\"", page, "Value").First();

            book.CoverImage = await DownloadHelper.DownloadImageAsync(imgUrl);

            book.Title = ParseHelper.Parse("<div id=\"title\">\\s+<h1 .*?>\\s*(?<Value>.*?)\\s*</h1>", page, "Value").First();

            try
            {
                book.Description = ParseHelper.Parse("<p class=\"summary\">(?<Value>(.|\\s)*?)</p>", page, "Value").First();
                book.Description = System.Web.HttpUtility.HtmlDecode(book.Description);
                book.Description = book.Description.Replace("<br />", "\n");

                book.Genres = ParseHelper.Parse("<a href=\"//mangafox.me/search/genres/.*?/\">(?<Name>.*?)</a>", page, "Name").ToArray();
            } catch (Exception e)
            {
            }

            return(book);
        }
        public override async Task <Chapter> GetPageUrls(Chapter chapter)
        {
            string page = await DownloadHelper.DownloadStringAsync(chapter.Url);

            var pageLinks     = ParseHelper.Parse("{\"id\":[0-9]+,\"url\":\"(?<Value>http:.+?)\"}", page, "Value");
            var resolvedPages = pageLinks.Select(p => p.Replace("\\/", "/")).ToArray();

            var pages = resolvedPages.Select((url, i) =>
            {
                return(new Page()
                {
                    Chapter = chapter,
                    PageNumber = i,
                    Url = url
                });
            }).ToArray();

            chapter.Pages = pages;
            return(chapter);
        }
        public override async Task <Chapter> GetPageUrls(Chapter chapter)
        {
            string page = await DownloadHelper.DownloadStringAsync(chapter.Url);

            var pageLinks     = ParseHelper.Parse("<option value=\"(?<Value>.*?)\".*>\\d+</option>", page, "Value");
            var resolvedPages = pageLinks.Select(p => new Uri(new Uri(chapter.Url), p).AbsoluteUri).ToArray();

            var pages = new Page[resolvedPages.Length];

            await Task.WhenAll(resolvedPages.Select((url, i) => Task.Run(async() =>
            {
                var imagePage = await DownloadHelper.DownloadStringAsync(url);
                pages[i]      = new Page()
                {
                    Chapter    = chapter,
                    PageNumber = i,
                    Url        = ParseHelper.Parse("<img src=\"(?<Value>.*?)\" onload=", imagePage, "Value").First()
                };
            })));

            chapter.Pages = pages;
            return(chapter);
        }
        public override async Task <Chapter> GetPageUrls(Chapter chapter)
        {
            string page = await DownloadHelper.DownloadStringAsync(chapter.Url);

            var pageLinks     = ParseHelper.Parse(@"<option value=""(?<Value>[^""]+)""(| selected=""selected"")>\d+</option>", page, "Value");
            var resolvedPages = pageLinks.Select(p => new Uri(new Uri(chapter.Url), p).AbsoluteUri).ToArray();

            var pages = new Page[resolvedPages.Length];

            await Task.WhenAll(resolvedPages.Select((url, i) => Task.Run(async() =>
            {
                var imagePage = await DownloadHelper.DownloadStringAsync(url);
                pages[i]      = new Page()
                {
                    Chapter    = chapter,
                    PageNumber = i,
                    Url        = ParseHelper.Parse(@"<img id=""img"" width=""\d+"" height=""\d+"" src=""(?<Value>[^""]+)""", imagePage, "Value").First()
                };
            })));

            chapter.Pages = pages;
            return(chapter);
        }
        public override async Task <Chapter> GetPageUrls(Chapter chapter)
        {
            await CheckDecryptor(chapter.Url);

            string page = await DownloadHelper.DownloadStringAsync(chapter.Url);

            var encryptedPages = ParseHelper.Parse("lstImages.push\\(wrapKA\\(\"(?<Value>.[^\"]*)\"\\)\\)", page, "Value");
            var pageLinks      = encryptedPages.Select(e => decryptor.DecryptFromBase64(e)).ToArray();
            var pages          = new List <Page>();

            for (int i = 0; i < pageLinks.Length; i++)
            {
                var pageLink = pageLinks[i];
                pages.Add(new Page()
                {
                    Chapter    = chapter,
                    PageNumber = i,
                    Url        = new Uri(new Uri(chapter.Url), pageLink).AbsoluteUri
                });
            }

            chapter.Pages = pages.ToArray();
            return(chapter);
        }
        public override async Task <Page> DownloadPage(Page page)
        {
            page.Image = await DownloadHelper.DownloadImageAsync(page.Url);

            return(page);
        }