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")); } }
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); }