public override async Task <AutoHintItems> GetAutoHintItemsAsync(SearchPara para, CancellationToken token) { if (AutoHintNet == null) { AutoHintNet = new NetSwap(Settings, HomeUrl); AutoHintNet.SetReferer(HomeUrl); } var re = new AutoHintItems(); if (SubListIndex == 0 || SubListIndex == 5) { var url = $"{HomeUrl}/rpc/cps.php?keyword={ para.Keyword}"; var json = await AutoHintNet.Client.GetStringAsync(url); dynamic jlist = JsonConvert.DeserializeObject(json); if (jlist?.candidates != null) { foreach (var obj in jlist.candidates) { var item = new AutoHintItem(); item.Word = $"{obj.tag_name}"; re.Add(item); } } } return(re); }
public override async Task <AutoHintItems> GetAutoHintItemsAsync(SearchPara para, CancellationToken token) { if (AutoHintNet == null) { AutoHintNet = new NetSwap(Settings, HomeUrl); } AutoHintNet.SetReferer(HomeUrl); //http://mjv-art.org/pictures/autocomplete_tag POST var re = new AutoHintItems(); //no result with length less than 3 if (para.Keyword.Length < 3) { return(re); } var mcontent = new MultipartFormDataContent("---------------" + DateTime.Now.Ticks.ToString("x")); mcontent.Add(new StringContent($"Content-Disposition: form-data; name=\"tag\"\r\n\r\n{para.Keyword}")); var url = $"{HomeUrl}/pictures/autocomplete_tag"; var response = await AutoHintNet.Client.PostAsync(url, mcontent, token); // todo 这里post数据失败,希望有大神能够解决 if (!response.IsSuccessStatusCode) { return(new AutoHintItems()); } var txt = await response.Content.ReadAsStringAsync(); //JSON format response //{"tags_list": [{"c": 3, "t": "suzumiya <b>haruhi</b> no yuutsu"}, {"c": 1, "t": "suzumiya <b>haruhi</b>"}]} var tagList = ((new System.Web.Script.Serialization.JavaScriptSerializer()).DeserializeObject(txt) as Dictionary <string, object>)?["tags_list"] as object[]; for (var i = 0; i < tagList.Length && i < 8; i++) { var tag = tagList[i] as Dictionary <string, object>; if (tag["t"].ToString().Trim().Length > 0) { re.Add(new AutoHintItem { Word = tag["t"].ToString().Trim().Replace("<b>", "").Replace("</b>", ""), Count = "N/A" }); } } return(re); }
public override async Task <AutoHintItems> GetAutoHintItemsAsync(SearchPara para, CancellationToken token) { var list = new AutoHintItems(); var client = new NetSwap(Settings).Client; switch (SiteType) { case SiteTypeEnum.Xml: { var xmlstr = await client.GetStringAsync(GetHintQuery(para)); var xml = new XmlDocument(); xml.LoadXml(xmlstr); var root = xml.SelectSingleNode("tags"); if (root == null) { return(list); } foreach (XmlElement child in root.ChildNodes) { list.Add(new AutoHintItem { Word = child.GetAttribute("name"), Count = child.GetAttribute("count") }); } return(list); } case SiteTypeEnum.Json: { var jsonstr = await client.GetStringAsync(GetHintQuery(para)); dynamic jsonlist = JsonConvert.DeserializeObject(jsonstr); foreach (var item in jsonlist) { list.Add(new AutoHintItem { Word = $"{item.name}", Count = $"{item.post_count}" }); } return(list); } default: return(null); } }
public async Task <ImageItems> GetRealPageImagesAsyncFromJson(SearchPara para, CancellationToken token) { var client = new NetSwap(Settings).Client; var query = GetPageQuery(para); var jsonRes = await client.GetAsync(query, token); var jsonStr = await jsonRes.Content.ReadAsStringAsync(); return(await Task.Run(() => { token.ThrowIfCancellationRequested(); var imageitems = new ImageItems(); dynamic list = JsonConvert.DeserializeObject(jsonStr); if (list == null) { return imageitems; } foreach (var item in list) { token.ThrowIfCancellationRequested(); var img = new ImageItem(this, para); img.Width = (int)item.image_width; img.Height = (int)item.image_height; img.Id = (int)item.id; img.Score = (int)item.score; img.Author = $"{item.uploader_name}"; var tagsstr = $"{item.tag_string}"; foreach (var tag in tagsstr.Split(' ')) { if (!string.IsNullOrWhiteSpace(tag)) { img.Tags.Add(tag.Trim()); } } img.IsExplicit = $"{item.rating}" == "e"; img.DetailUrl = GetDetailPageUrl(img); img.Urls.Add(new UrlInfo("缩略图", 1, $"{item.preview_file_url}", GetThumbnailReferer(img))); img.Urls.Add(new UrlInfo("预览图", 2, $"{item.large_file_url}", GetThumbnailReferer(img))); img.Urls.Add(new UrlInfo("原图", 4, $"{item.file_url}", img.DetailUrl)); //img.Net = Net; imageitems.Add(img); } return imageitems; }, token)); }
public async Task LoginAsync(CancellationToken token) { Net = new NetSwap(Settings, HomeUrl); Net.SetTimeOut(20); var index = new Random().Next(0, _user.Length); var content = new FormUrlEncodedContent(new Dictionary <string, string> { { "login", _user[index] }, { "password", _pass[index] } }); var respose = await Net.Client.PostAsync($"{HomeUrl}/login/submit", content, token); // http://mjv-art.org/login/submit if (respose.IsSuccessStatusCode) { IsLogon = true; } else { App.Log("https://anime-pictures.net 网站登陆失败"); return; } }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { if (!IsLogin) { Net = new NetSwap(Settings, HomeUrl); const string loginUrl = "http://yuriimg.com/account/login"; string boundary = $"---------------{DateTime.Now.Ticks:x}", //开始边界符 pboundary = $"--{boundary}", //分隔边界符 endBoundary = $"--{boundary}--\r\n", // 结束边界符 postData = $"{pboundary}\r\nContent-Disposition: form-data; name=\"username\"\r\n\r\n{User}\r\n{pboundary}\r\nContent-Disposition: form-data; name=\"password\"\r\n\r\n{Pass}\r\n{endBoundary}"; var respose = await Net.Client.PostAsync(loginUrl, new StringContent(postData), token); if (respose.IsSuccessStatusCode) { IsLogin = true; } else { return(new ImageItems()); } //retData = Sweb.Post(loginUrl, postData, Settings.Proxy, shc); //cookie = Sweb.GetURLCookies(HomeUrl); //if (retData.Contains("-2")) //{ // throw new Exception("密码错误"); //} //else if ((!cookie.Contains("otome_"))) //{ // throw new Exception("登录时出错"); //} } var url = $"{HomeUrl}/post/{para.PageIndex}.html"; // string url = "http://yuriimg.com/show/ge407xd5o.jpg"; if (para.Keyword.Length > 0) { //http://yuriimg.com/search/index/tags/?/p/?.html url = $"{HomeUrl}/search/index/tags/{para.Keyword}/p/{para.PageIndex}.html"; } var pageSource = await Net.Client.GetAsync(url, token); var pageStr = await pageSource.Content.ReadAsStringAsync(); var list = new ImageItems(); var dococument = new HtmlDocument(); dococument.LoadHtml(pageStr); var imageItems = dococument.DocumentNode.SelectNodes("//*[@class='image-list cl']"); if (imageItems == null) { return(list); } foreach (var imageItem in imageItems) { var imgNode = imageItem.SelectSingleNode("./div[1]/img"); var tags = imgNode.Attributes["alt"].Value; var img = new ImageItem(this, para); img.Height = Convert.ToInt32(imageItem.SelectSingleNode(".//div[@class='image']").Attributes["data-height"].Value); img.Width = Convert.ToInt32(imageItem.SelectSingleNode(".//div[@class='image']").Attributes["data-width"].Value); img.Author = imageItem.SelectSingleNode("//small/a").InnerText; img.Description = tags; img.Id = StringToInt(imgNode.Attributes["id"].Value); img.DetailUrl = HomeUrl + imgNode.Attributes["data-href"].Value; img.Score = Convert.ToInt32(imageItem.SelectSingleNode(".//span[@class='num']").InnerText); img.Site = this; img.Net = null; img.Urls.Add(new UrlInfo("缩略图", 1, imgNode.Attributes["data-original"].Value.Replace("!single", "!320px"), HomeUrl)); foreach (var tag in tags.Split(' ')) { //if (tag.Contains("画师:")) continue; if (!string.IsNullOrWhiteSpace(tag)) { img.Tags.Add(tag.Trim()); } } img.GetDetailAction = async() => { try { var html = await Net.Client.GetStringAsync(img.DetailUrl); var doc = new HtmlDocument(); doc.LoadHtml(html); var showIndexs = doc.DocumentNode.SelectSingleNode("//div[@class='logo']"); var imgDownNode = showIndexs.SelectSingleNode("//div[@class='img-control']"); var nodeHtml = showIndexs.OuterHtml; img.Date = TimeConvert(nodeHtml); img.Source = nodeHtml.Contains("pixiv page") ? showIndexs.SelectSingleNode(".//a[@target='_blank']").Attributes["href"].Value : Regex.Match(nodeHtml, @"(?<=源地址).*?(?=</p>)").Value.Trim(); img.Urls.Add(new UrlInfo("缩略图", 1, doc.DocumentNode.SelectSingleNode("//figure[@class=\'show-image\']/img").Attributes["src"].Value, HomeUrl)); var previww = doc.DocumentNode.SelectSingleNode("//figure[@class=\'show-image\']/img").Attributes["src"].Value; string file; if (Regex.Matches(imgDownNode.OuterHtml, "href").Count > 1) { file = HomeUrl + imgDownNode.SelectSingleNode("./a[1]").Attributes["href"].Value; //item.FileSize = Regex.Match(imgDownNode.SelectSingleNode("./a[1]").InnerText, @"(?<=().*?(?=))").Value; } else { file = HomeUrl + imgDownNode.SelectSingleNode("./a").Attributes["href"].Value; //item.FileSize = Regex.Match(imgDownNode.SelectSingleNode("./a").InnerText, @"(?<=().*?(?=))").Value; } img.Urls.Add(new UrlInfo("原图", 4, file, HomeUrl)); img.Urls.Add(new UrlInfo("预览图", 2, previww.Length > 0 ? previww : file, HomeUrl)); } catch (Exception ex) { App.Log(ex); } }; list.Add(img); } token.ThrowIfCancellationRequested(); return(list); }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { string query; const string api = "https://api.vc.bilibili.com/link_draw/v2"; var type = Lv3ListIndex == 0 ? "new" : "hot"; var count = para.Count > 20 ? 20 : para.Count; switch (SubListIndex) { default: query = $"{api}/Doc/list?category=all&type={type}&page_num={para.PageIndex - 1}&page_size={count}"; break; case 1: query = $"{api}/Photo/list?category=cos&type={type}&page_num={para.PageIndex - 1}&page_size={count}"; break; case 2: query = $"{api}/Photo/list?category=sifu&type={type}&page_num={para.PageIndex - 1}&page_size={count}"; break; } var net = new NetSwap(Settings); var jsonres = await net.Client.GetAsync(query, token); var jsonstr = await jsonres.Content.ReadAsStringAsync(); return(await Task.Run(() => { dynamic listobj = JsonConvert.DeserializeObject(jsonstr); var items = new ImageItems(); if (listobj?.data?.items == null) { return items; } foreach (var item in listobj.data.items) { var img = new ImageItem(this, para); img.Author = $"{item.user?.name}"; img.Id = (int)item.item.doc_id; var i0 = item.item?.pictures[0]; if (i0?.img_width != null) { img.Width = (int)i0.img_width; } if (i0?.img_height != null) { img.Height = (int)i0.img_height; } if (img.Width > 0 && img.Height > 0) { var turl = img.Width > img.Height ? $"{i0?.img_src}@512w_{(int) (512d * img.Height / img.Width)}h_1e" : $"{i0?.img_src}@{(int) (512d * img.Width / img.Height)}w_512h_1e"; img.Urls.Add(new UrlInfo("缩略图", 1, $"{turl}", HomeUrl)); } else { img.Urls.Add(new UrlInfo("缩略图", 1, $"{i0?.img_src}@512w_512h_1e", HomeUrl)); } img.Urls.Add(new UrlInfo("原图", 4, $"{i0?.img_src}")); img.DetailUrl = $"https://h.bilibili.com/{img.Id}"; img.Title = $"{item.item?.title}"; var list = (JArray)item.item.pictures; if (list.Count > 1) { foreach (var pic in item.item.pictures) { var child = new ImageItem(this, para); child.Urls.Add(new UrlInfo("缩略图", 1, $"{pic.img_src}@512w_512h_1e", HomeUrl)); child.Urls.Add(new UrlInfo("原图", 4, $"{pic.img_src}")); if (pic.img_width != null) { child.Width = (int)pic.img_width; } if (pic.img_height != null) { child.Height = (int)pic.img_height; } img.ChilldrenItems.Add(child); } } items.Add(img); } return items; }, token)); }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { if (!IsLogon) { await LoginAsync(token); } // pages source //http://mjv-art.org/pictures/view_posts/0?lang=en var url = $"{HomeUrl}/pictures/view_posts/{para.PageIndex - 1}?lang=en"; if (para.Keyword.Length > 0) { //http://mjv-art.org/pictures/view_posts/0?search_tag=suzumiya%20haruhi&order_by=date&ldate=0&lang=en url = $"{HomeUrl}/pictures/view_posts/{para.PageIndex - 1}?search_tag={para.Keyword}&order_by=date&ldate=0&lang=en"; } var pageres = await Net.Client.GetAsync(url, token); var pageString = await pageres.Content.ReadAsStringAsync(); // images var imgs = new ImageItems(); var doc = new HtmlDocument(); doc.LoadHtml(pageString); var pre = "https:"; var listnode = doc.DocumentNode.SelectNodes("//*[@id='posts']/div[@class='posts_block']/span[@class='img_block_big']"); if (listnode == null) { return(imgs); } foreach (var node in listnode) { var img = new ImageItem(this, para); //img.Net = Net; img.Site = this; var imgnode = node.SelectSingleNode("a/picture/img"); var idattr = imgnode.GetAttributeValue("id", "0"); var reg = Regex.Replace(idattr, @"[^0-9]+", ""); int.TryParse(reg, out var id); img.Id = id; var src = imgnode.GetAttributeValue("src", ""); if (!string.IsNullOrWhiteSpace(src)) { img.Urls.Add(new UrlInfo("缩略图", 1, $"{pre}{src}", url)); } var resstrs = node.SelectSingleNode("div[@class='img_block_text']/a")?.InnerText.Trim().Split('x'); int.TryParse(resstrs[0], out var width); int.TryParse(resstrs[1], out var height); img.Width = width; img.Height = height; var scorestr = node.SelectSingleNode("div[@class='img_block_text']/span")?.InnerText.Trim(); int.TryParse(Regex.Match(scorestr ?? "0", @"[^0-9]+").Value, out var score); img.Score = score; var detail = node.SelectSingleNode("a").GetAttributeValue("href", ""); if (!string.IsNullOrWhiteSpace(detail)) { img.DetailUrl = $"{HomeUrl}{detail}"; img.GetDetailAction = async() => { var detialurl = img.DetailUrl; var net = new NetSwap(Settings); net.SetTimeOut(25); try { var detailPageStr = await net.Client.GetStringAsync(detialurl); var subdoc = new HtmlDocument(); subdoc.LoadHtml(detailPageStr); var downnode = subdoc.DocumentNode?.SelectSingleNode("//*[@id='rating']/a[@class='download_icon']"); var fileurl = downnode?.GetAttributeValue("href", ""); if (!string.IsNullOrWhiteSpace(fileurl)) { img.Urls.Add(new UrlInfo("原图", 4, $"{HomeUrl}{fileurl}", detialurl)); } } catch (Exception e) { App.Log(e); } }; } imgs.Add(img); } token.ThrowIfCancellationRequested(); return(imgs); }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { // page source var url = $"{HomeUrl}/?page={para.PageIndex}"; if (Net == null) { Net = new NetSwap(Settings); } if (!string.IsNullOrWhiteSpace(para.Keyword)) { url = $"{HomeUrl}/search/process/"; //multi search string data; switch (SubListIndex) { default: data = $"tags={para.Keyword}&source=&char=&artist=&postcontent=&txtposter="; break; case 1: data = $"tags=&source={para.Keyword}&char=&artist=&postcontent=&txtposter="; break; case 2: data = $"tags=&source=&char=&artist={para.Keyword}&postcontent=&txtposter="; break; case 3: data = $"tags=&source=&char={para.Keyword}&artist=&postcontent=&txtposter="; break; } //e-shuushuu需要将关键词转换为tag id,然后进行搜索 todo 这里要测试 var net = new NetSwap(Settings); net.HttpClientHandler.AllowAutoRedirect = false; //prevent 303 var res = await net.Client.GetAsync(url, token); var loc = res.Headers.Location; //http://e-shuushuu.net/search/results/?tags=2 if (!string.IsNullOrEmpty(loc.OriginalString)) { //非完整地址,需要前缀 url = $"{loc}&page={para.PageIndex}"; } else { App.ShowMessage("没有搜索到关键词相关的图片(每个关键词前后需要加双引号如 \"sakura\")"); return(new ImageItems()); } } var pageString = await Net.Client.GetStringAsync(url); // images var images = new ImageItems(); var doc = new HtmlDocument(); doc.LoadHtml(pageString); //retrieve all elements via xpath var nodes = doc.DocumentNode.SelectNodes("//div[@class='image_thread display']"); if (nodes == null) { return(images); } foreach (var imgNode in nodes) { var item = new ImageItem(this, para); var id = imgNode.Attributes["id"].Value; int.TryParse(id.Substring(1), out var ido); item.Id = ido; var imgHref = imgNode.SelectSingleNode(".//a[@class='thumb_image']"); var fileUrl = imgHref.Attributes["href"].Value; if (fileUrl.StartsWith("/")) { fileUrl = HomeUrl + fileUrl; } var previewUrl = imgHref.SelectSingleNode("img").Attributes["src"].Value; if (previewUrl.StartsWith("/")) { previewUrl = HomeUrl + previewUrl; } item.Urls.Add(new UrlInfo("缩略图", 1, previewUrl, HomeUrl)); var meta = imgNode.SelectSingleNode(".//div[@class='meta']"); var date = meta.SelectSingleNode(".//dd[2]").InnerText; var fileSize = meta.SelectSingleNode(".//dd[3]").InnerText; var dimension = meta.SelectSingleNode(".//dd[4]").InnerText; try { //706x1000 (0.706 MPixel) var dms = dimension.Substring(0, dimension.IndexOf('(')).Trim(); item.Width = int.Parse(dms.Substring(0, dms.IndexOf('x'))); item.Height = int.Parse(dms.Substring(dms.IndexOf('x') + 1)); } catch { /*..*/ } try { var tags = meta.SelectSingleNode(".//dd[5]").InnerText.Replace("\t", "").Replace("\n", ""); var regex = new Regex("\"([^\"]*)\""); foreach (Match match in regex.Matches(tags)) { if (string.IsNullOrWhiteSpace(match.Value)) { continue; } item.Tags.Add(match.Value); } } catch { /*..*/ } var detail = $"{HomeUrl}/image/{ido}"; item.DetailUrl = detail; item.Urls.Add(new UrlInfo("原图", 4, fileUrl, detail)); item.Site = this; images.Add(item); } return(images); }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { var net = new NetSwap(Settings); var client = net.Client; var size = ""; if (para.IsFilterResolution) { var s = para.MinWidth > para.MinHeight ? para.MinWidth : para.MinHeight; size = $"{s}"; } var orient = ""; switch (para.Orientation) { default: case ImageOrientation.None: break; case ImageOrientation.Portrait: orient = "p"; break; case ImageOrientation.Landscape: orient = "l"; break; } var query = $"{HomeUrl}/new.json?tags={para.Keyword.ToEncodedUrl()}&size={size}&orient={orient}&page={para.PageIndex}"; var jsonres = await client.GetAsync(query, token); var jsonstr = await jsonres.Content.ReadAsStringAsync(); var imageitems = new ImageItems(); dynamic json = JsonConvert.DeserializeObject(jsonstr); if (json?.images == null) { return(imageitems); } foreach (var image in json.images) { var img = new ImageItem(this, para); var id = (int)image.id; img.Id = id; var sub = $"https://{id % 10}.s.kawaiinyan.com/i"; img.Author = $"{image.user_name}"; img.Source = $"{image.adv_link}"; img.Score = (int)image.yes; var tags = $"{image.tags}"; foreach (var s in tags.Split(',')) { if (string.IsNullOrWhiteSpace(s)) { continue; } img.Tags.Add(s); } var small = $"{image.small}"; img.Urls.Add(new UrlInfo("缩略图", 1, $"{sub}{UrlInner($"{id}")}/small.{small}")); var orig = $"{image.orig}"; var big = $"{image.big}"; if (!string.IsNullOrWhiteSpace(orig)) { img.Urls.Add(new UrlInfo("原图", 4, $"{sub}{UrlInner($"{id}")}/orig.{orig}")); } else if (!string.IsNullOrWhiteSpace(big)) { img.Urls.Add(new UrlInfo("原图", 4, $"{sub}{UrlInner($"{id}")}/big.{big}")); } img.DetailUrl = $"{HomeUrl}/image?id={id}"; img.Site = this; imageitems.Add(img); } token.ThrowIfCancellationRequested(); return(imageitems); }
public async Task <ImageItems> GetRealPageImagesAsyncFromXml(SearchPara para, CancellationToken token) { var client = new NetSwap(Settings).Client; var query = GetPageQuery(para); var xmlres = await client.GetAsync(query, token); var xmlstr = await xmlres.Content.ReadAsStreamAsync(); return(await Task.Run(() => { var xml = XDocument.Load(xmlstr); var imageitems = new ImageItems(); if (xml.Root == null) { return imageitems; } foreach (var post in xml.Root.Elements()) { token.ThrowIfCancellationRequested(); var img = new ImageItem(this, para); int.TryParse(post.Attribute("id")?.Value, out var id); img.Id = id; var tags = post.Attribute("tags")?.Value ?? ""; foreach (var tag in tags.Split(' ')) { if (!string.IsNullOrWhiteSpace(tag)) { img.Tags.Add(tag.Trim()); } } int.TryParse(post.Attribute("width")?.Value, out var width); img.Width = width; int.TryParse(post.Attribute("height")?.Value, out var height); img.Height = height; img.Author = post.Attribute("author")?.Value; img.Source = post.Attribute("source")?.Value; img.IsExplicit = post.Attribute("rating")?.Value.ToLower() != "s"; img.DetailUrl = GetDetailPageUrl(img); img.Site = this; double.TryParse(post.Attribute("created_at")?.Value, out var creatat); if (creatat > 0) { img.CreatTime = new DateTime(1970, 1, 1, 0, 0, 0, 0) + TimeSpan.FromSeconds(creatat); } int.TryParse(post.Attribute("score")?.Value, out var score); img.Score = score; ulong.TryParse(post.Attribute("file_size")?.Value, out var filesize); img.Urls.Add(new UrlInfo("缩略图", 1, UrlPre + post.Attribute("preview_url")?.Value, GetThumbnailReferer(img))); img.Urls.Add(new UrlInfo("预览图", 2, UrlPre + post.Attribute("sample_url")?.Value, GetThumbnailReferer(img))); img.Urls.Add(new UrlInfo("Jpeg图", 3, UrlPre + post.Attribute("jpeg_url")?.Value, GetThumbnailReferer(img))); img.Urls.Add(new UrlInfo("原图", 4, UrlPre + post.Attribute("file_url")?.Value, img.DetailUrl) { Md5 = post.Attribute("md5")?.Value, BiteSize = filesize, }); imageitems.Add(img); } return imageitems; }, token)); }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { if (Net == null) { Net = new NetSwap(); } //http://worldcosplay.net/api/photo/list?page=3&limit=2&sort=created_at&direction=descend var url = $"{HomeUrl}/api/photo/list?page={para.PageIndex}&limit={para.Count}&sort=created_at&direction=descend"; if (para.Keyword.Length > 0) { //http://worldcosplay.net/api/photo/search?page=2&rows=48&q=%E5%90%8A%E5%B8%A6%E8%A2%9C%E5%A4%A9%E4%BD%BF url = $"{HomeUrl}/api/photo/search?page={para.PageIndex}&rows={para.Count}&q={para.Keyword}"; } // images var imgs = new ImageItems(); var res = await Net.Client.GetAsync(url, token); var str = await res.Content.ReadAsStringAsync(); dynamic json = JsonConvert.DeserializeObject(str); if (json?.list == null) { return(imgs); } foreach (var jitem in json.list) { var img = new ImageItem(this, para); img.Author = $"{jitem.member?.nickname}"; img.DetailUrl = $"{HomeUrl}{jitem.photo?.url}"; img.Id = (int)(jitem.photo?.id ?? 0d); img.Urls.Add(new UrlInfo("缩略图", 1, $"{jitem.photo?.thumbnail_url_display}", HomeUrl)); img.Urls.Add(new UrlInfo("大图", 3, $"{jitem.photo?.large_url}", img.DetailUrl)); int.TryParse($"{jitem.photo?.good_cnt}", out var score); img.Score = score; DateTime.TryParse($"{jitem.photo?.created_at}", out var date); img.CreatTime = date; var twidth = (int)(jitem.photo?.thumbnail_width ?? 0d); var theight = (int)(jitem.photo?.thumbnail_height ?? 0d); if (twidth > 0 && theight > 0) //缩略图的尺寸 175级别 大图 740级别 { if (twidth > theight) { img.Height = 740 * theight / twidth; img.Width = 740; } else { img.Width = 740 * twidth / theight; img.Height = 740; } } img.Title = $"{jitem.photo?.subject}"; img.IsExplicit = jitem.photo?.viewable ?? false; imgs.Add(img); } return(imgs); }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { if (Net == null) { // login Net = new NetSwap(Settings, HomeUrl); var accIndex = new Random().Next(0, _user.Length); var content = new FormUrlEncodedContent(new Dictionary <string, string> { { "username", _user[accIndex] }, { "password", _pass[accIndex] } }); // Net.Client.DefaultRequestHeaders.Accept.ParseAdd("application/json"); await Net.Client.PostAsync("http://my.minitokyo.net/login", content, token); } // page source string query; if (string.IsNullOrWhiteSpace(para.Keyword)) { query = $"http://gallery.minitokyo.net/{Type}?order=id&display=extensive&page={para.PageIndex}"; } else { var pageres = await Net.Client.GetAsync($"{HomeUrl}/search?q={para.Keyword}", token); var page = await pageres.Content.ReadAsStringAsync(); var urlindex = page.IndexOf("http://browse.minitokyo.net/gallery?tid=", StringComparison.Ordinal); var url = page.Substring(urlindex, page.IndexOf('"', urlindex) - urlindex - 1) + (Type.Contains("wallpapers") ? "1" : "3"); url += "&order=id&display=extensive&page=" + page; query = url.Replace("&", "&"); } var imgs = new ImageItems(); var doc = new HtmlDocument(); var streamres = await Net.Client.GetAsync(query, token); using (var pagestream = await streamres.Content.ReadAsStreamAsync()) { doc.Load(pagestream); } //retrieve all elements via xpath var wallNode = doc.DocumentNode.SelectSingleNode("//ul[@class='wallpapers']"); var imgNodes = wallNode.SelectNodes(".//li"); if (imgNodes == null) { return(imgs); } for (var i = 0; i < imgNodes.Count - 1; i++) { var item = new ImageItem(this, para); //最后一个是空的,跳过 var imgNode = imgNodes[i]; var detailUrl = imgNode.SelectSingleNode("a").Attributes["href"].Value; item.DetailUrl = detailUrl; var id = detailUrl.Substring(detailUrl.LastIndexOf('/') + 1); item.Id = int.Parse(id); var imgHref = imgNode.SelectSingleNode(".//img"); var sampleUrl = imgHref.Attributes["src"].Value; item.Urls.Add(new UrlInfo("缩略图", 1, sampleUrl, HomeUrl)); //http://static2.minitokyo.net/thumbs/24/25/583774.jpg preview //http://static2.minitokyo.net/view/24/25/583774.jpg sample //http://static.minitokyo.net/downloads/24/25/583774.jpg full var previewUrl = "http://static2.minitokyo.net/view" + sampleUrl.Substring(sampleUrl.IndexOf('/', sampleUrl.IndexOf(".net/", StringComparison.Ordinal) + 5)); var fileUrl = "http://static.minitokyo.net/downloads" + previewUrl.Substring(previewUrl.IndexOf('/', previewUrl.IndexOf(".net/", StringComparison.Ordinal) + 5)); item.Urls.Add(new UrlInfo("原图", 4, fileUrl, HomeUrl)); // \n\tMasaru -\n\tMasaru \n\tSubmitted by\n\t\tadri24rukiachan\n\t4200x6034, 4 Favorites\n var info = imgNode.SelectSingleNode(".//div").InnerText; var infomc = Regex.Match(info, @"^\n\t(?<title>.*?)\s-\n.*?\n\t.*?by\n\t\t(?<author>.*?)\n\t(?<size>\d+x\d+),\s(?<score>\d+)\s"); var title = infomc.Groups["title"].Value; item.Title = title; item.Author = infomc.Groups["author"].Value; var size = infomc.Groups["size"].Value; if (!string.IsNullOrWhiteSpace(size)) { try { item.Width = int.Parse(size.Substring(0, size.IndexOf('x'))); item.Height = int.Parse(size.Substring(size.IndexOf('x') + 1)); } catch { /*..*/ } } int.TryParse(infomc.Groups["score"].Value, out var score); item.Score = score; item.Site = this; imgs.Add(item); } token.ThrowIfCancellationRequested(); return(imgs); }
public async Task GetDetailAction(string pageUrl, ImageItem img, NetSwap net, SearchPara para) { try { var subpage = await net.Client.GetStringAsync(pageUrl); var subdoc = new HtmlDocument(); subdoc.LoadHtml(subpage); img.Net = Net.CreatNewWithRelatedCookie(); var strRex = Regex.Match(subpage, $@"(?<=(?:{img.Id}:.)).*?(?=(?:.}},user))"); dynamic jobj = JsonConvert.DeserializeObject(strRex.Value); if (jobj == null) { return; } int.TryParse($"{jobj.likeCount}", out var score); img.Score = score; int.TryParse($"{jobj.width}", out var width); img.Width = width; int.TryParse($"{jobj.height}", out var height); img.Height = height; int.TryParse($"{jobj.pageCount}", out var pageCount); img.Urls.Add(new UrlInfo("原图", 4, $"{jobj.urls?.original}", pageUrl)); img.Author = $"{jobj.userName}"; int.TryParse($"{jobj.likeCount}", out var like); if (like > 0) { img.Score = like; } var tags = jobj.tags; try { if (img.Tags.Count == 0) { foreach (var tag in tags) { dynamic v = ((JProperty)tag).Value; img.Tags.Add($"{v.tag}"); } } } catch (Exception e) { App.Log(e); } var title = $"{jobj.illustTitle}"; if (!string.IsNullOrWhiteSpace(title)) { img.Title = title; } img.Description = $"{jobj.illustComment}"; if (pageCount > 1) { for (var i = 0; i < pageCount; i++) { var subimg = new ImageItem(this, para); var rex = new Regex(@"(?<=.*)p\d+(?=[^/]*[^\._]*$)"); subimg.Net = Net.CreatNewWithRelatedCookie(); subimg.Urls.Add(new UrlInfo("原图", 4, rex.Replace(img.DownloadUrlInfo.Url, $"p{i}"), pageUrl.Replace("mode=medium", "mode=manga"))); img.ChilldrenItems.Add(subimg); } } } catch (Exception e) { App.Log(e); } }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { if (Net == null) { Net = new NetSwap(Settings, HomeUrl); Net.HttpClientHandler.AllowAutoRedirect = true; Net.SetTimeOut(40); } if (!IsLogin) { await LoginAsync(token); } if (!IsLogin) { return(new ImageItems()); } // page var word = para.Keyword; var page = para.PageIndex; var query = ""; var xmodestr = para.IsShowExplicit ? "" : "&mode=safe"; if (Lv3ListIndex == 1) { xmodestr = "&mode=r18"; } var r18 = Lv3ListIndex == 1 ? "_r18" : ""; switch (SearchType) { case SearchTypeEnum.TagOrNew: if (string.IsNullOrWhiteSpace(word)) // empty { // https://www.pixiv.net/new_illust.php?type=all&p=2 query = $"{HomeUrl}/new_illust{r18}.php?type=all&p={page}"; } else { query = $"{HomeUrl}/search.php?s_mode=s_tag&word={word.ToEncodedUrl()}&order=date_d&p={page}{xmodestr}"; } break; case SearchTypeEnum.Author: // 作者 member id //word = "4338012"; // test if (!int.TryParse(word.Trim(), out var memberId)) { App.ShowMessage("参数错误,必须在关键词中指定画师 id(纯数字)"); return(new ImageItems()); } // https://www.pixiv.net/member_illust.php?id=4338012&p=1 query = $"{HomeUrl}/member_illust.php?id={word.Trim()}&p={page}"; query = word; break; case SearchTypeEnum.Day: query = $"{HomeUrl}/ranking.php?mode=daily{r18}&p={page}&format=json"; break; case SearchTypeEnum.Week: // https://www.pixiv.net/ranking.php?mode=weekly&p=1&format=json query = $"{HomeUrl}/ranking.php?mode=weekly{r18}&p={page}&format=json"; break; case SearchTypeEnum.Month: query = $"{HomeUrl}/ranking.php?mode=monthly&p={page}&format=json"; break; } // ----------------images--------------------------- var imgs = new ImageItems(); switch (SearchType) { case SearchTypeEnum.TagOrNew: if (string.IsNullOrWhiteSpace(word)) { await SearchByNew(imgs, query, para, token); } else { await SearchByTag(imgs, query, para, token); } break; case SearchTypeEnum.Day: case SearchTypeEnum.Week: case SearchTypeEnum.Month: await SearchByRank(imgs, query, para, token); break; case SearchTypeEnum.Author: await SearchByAuthor(imgs, query, para, token); break; } token.ThrowIfCancellationRequested(); return(imgs); }
public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token) { // logon if (!IsLogon) { Net = new NetSwap(Settings, HomeUrl); var index = new Random().Next(0, _user.Length); var loginurl = "https://www.zerochan.net/login"; var response = await Net.Client.PostAsync(loginurl, new StringContent($"ref=%2F&login=Login&name={_user[index]}&password={_pass[index]}"), token); if (response.IsSuccessStatusCode) { IsLogon = true; } } if (!IsLogon) { return(new ImageItems()); } // get page source var pageString = ""; var url = HomeUrl + (para.Keyword.Length > 0 ? $"/search?q={para.Keyword}&" : "/?") + $"p={para.PageIndex}"; if (!_beforeWord.Equals(para.Keyword, StringComparison.CurrentCultureIgnoreCase)) { // 301 var respose = await Net.Client.GetAsync(url, token); if (respose.IsSuccessStatusCode) { _beforeUrl = respose.Headers.Location.AbsoluteUri; } else { App.ShowMessage("搜索失败,请检查您输入的关键词"); return(new ImageItems()); } pageString = await respose.Content.ReadAsStringAsync(); _beforeWord = para.Keyword; } else { //Net.Client.DefaultRequestHeaders.Referrer = new Uri(beforeUrl); url = string.IsNullOrWhiteSpace(para.Keyword) ? url : _beforeUrl + "?p=" + para.PageIndex; var res = await Net.Client.GetAsync(url, token); pageString = await res.Content.ReadAsStringAsync(); } // images var imgs = new ImageItems(); var doc = new HtmlDocument(); doc.LoadHtml(pageString); //retrieve all elements via xpath HtmlNodeCollection nodes; try { nodes = doc.DocumentNode.SelectSingleNode("//ul[@id='thumbs2']").SelectNodes(".//li"); } catch { App.ShowMessage("没有搜索到图片"); return(new ImageItems()); } foreach (var imgNode in nodes) { var img = new ImageItem(this, para); var strId = imgNode.SelectSingleNode("a").Attributes["href"].Value; int.TryParse(strId.Substring(1), out var id); var fav = imgNode.SelectSingleNode("a/span")?.InnerText; if (!string.IsNullOrWhiteSpace(fav)) { int.TryParse(Regex.Replace(fav, @"[^0-9]+", ""), out var score); img.Score = score; } var imgHref = imgNode.SelectSingleNode(".//img"); var previewUrl = imgHref?.Attributes["src"]?.Value; //http://s3.zerochan.net/Morgiana.240.1355397.jpg preview //http://s3.zerochan.net/Morgiana.600.1355397.jpg sample //http://static.zerochan.net/Morgiana.full.1355397.jpg full //先加前一个,再加后一个 范围都是00-49 //string folder = (id % 2500 % 50).ToString("00") + "/" + (id % 2500 / 50).ToString("00"); var sampleUrl = ""; var fileUrl = ""; if (!string.IsNullOrWhiteSpace(previewUrl)) { sampleUrl = previewUrl?.Replace("240", "600"); fileUrl = Regex.Replace(previewUrl, "^(.+?)zerochan.net/", "https://static.zerochan.net/").Replace("240", "full"); } var resandfilesize = imgHref?.Attributes["title"].Value; var dimension = resandfilesize?.Substring(0, resandfilesize.IndexOf(' ')); var fileSize = resandfilesize?.Substring(resandfilesize.IndexOf(' ')).Trim(); var title = imgHref?.Attributes["alt"].Value; int width = 0, height = 0; try { //706x1000 width = int.Parse(dimension.Substring(0, dimension.IndexOf('x'))); height = int.Parse(dimension.Substring(dimension.IndexOf('x') + 1)); } catch { } //convert relative url to absolute if (!string.IsNullOrWhiteSpace(fileUrl) && fileUrl.StartsWith("/")) { fileUrl = $"{HomeUrl}{fileUrl}"; } if (sampleUrl != null && sampleUrl.StartsWith("/")) { sampleUrl = HomeUrl + sampleUrl; } //img.FileSize = fileSize?.ToUpper(); img.Description = title; img.Title = title; img.Id = id; img.Urls.Add(new UrlInfo("缩略图", 1, previewUrl, HomeUrl)); img.Urls.Add(new UrlInfo("预览图", 2, sampleUrl, HomeUrl)); img.Urls.Add(new UrlInfo("原图", 4, fileUrl, img.DetailUrl)); img.Width = width; img.Height = height; img.DetailUrl = $"{HomeUrl}/{id}"; if (fileSize != null) { //img.FileSize = new Regex(@"\d+").Match(img.FileSize).Value; //var fs = Convert.ToInt32(img.FileSize); //img.FileSize = (fs > 1024 ? (fs / 1024.0).ToString("0.00MB") : fs.ToString("0KB")); } imgs.Add(img); } token.ThrowIfCancellationRequested(); return(imgs); }