Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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));
        }
Ejemplo n.º 5
0
        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;
            }
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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));
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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));
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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("&amp;", "&");
            }
            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);
        }
Ejemplo n.º 14
0
        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);
            }
        }
Ejemplo n.º 15
0
        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);
        }
Ejemplo n.º 16
0
        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);
        }