Пример #1
0
        /// <summary>
        /// 获取某个作品的相关作品
        /// </summary>
        /// <param name="parame"></param>
        /// <returns></returns>
        public List <string> GetRelatedWorksIds(RequestParameEntity parame)
        {
            var itemUrl = parame.ListUrl;
            var id      = parame.ID;
            var result  = new List <string>();

            //获取相关作品请求参数
            var limitUrl = $"https://www.pixiv.net/ajax/illust/{id}/recommend/init?limit=18";

            var limitHtml = DownHelp.GetHtmlString(limitUrl, Encoding.UTF8, 5);

            if (limitHtml == "")
            {
                AddErrorMsg(string.Format("获取URL:{0} 的html失败!\r\n", limitUrl));
                return(null);
            }
            AddSuccessMsg(string.Format("获取URL:{0} 的html成功!\r\n", limitUrl));

            var firstIds = GetRelatedWorks(limitHtml, RegexHelp.Other.GetFirstIds);

            result.AddRange(firstIds);

            var regNext = new Regex(RegexHelp.Other.GetNextIdsParent, RegexOptions.Singleline);
            var mNext   = regNext.Match(limitHtml);

            if (mNext != null && mNext.Groups["Main"].Value != "")
            {
                var secondIds = GetRelatedWorks(mNext.Groups["Main"].Value, RegexHelp.Other.GetNextIds);
                result.AddRange(secondIds);
            }

            return(result);
        }
Пример #2
0
        /// <summary>
        /// 获取单个图片
        /// </summary>
        /// <param name="itemUrl"></param>
        /// <param name="html"></param>
        public void GetSigImage(string itemUrl, string html, string savePath)
        {
            var imgR = new Regex(RegexHelp.Other.GetSingleImage, RegexOptions.Singleline);
            var imgM = imgR.Match(html);

            if (imgM == null || imgM.Groups["Url"].Value == "")
            {
                AddErrorMsg(string.Format("获取URL:{0} 的图片失败!\r\n", itemUrl));
                return;
            }

            var imgUrl = HtmlHelp.NeedHost(itemUrl, imgM.Groups["Url"].Value);

            lock (Multithreading.ObjLockExistFile)
            {
                if (File.Exists(savePath + "/" + Path.GetFileName(imgUrl)))
                {
                    if (form.ChkNeglect.Checked)
                    {
                        AddErrorMsg(string.Format("跳过已存在的图片:{0}!\r\n", imgUrl));
                    }
                    return;
                }
            }

            AddSuccessMsg(string.Format("正在下载图片:{0} \r\n", imgUrl));

            var  filePath = savePath + "/" + Path.GetFileName(imgUrl);
            bool b        = DownHelp.DownImage(imgUrl, filePath, 1024, itemUrl, 5);

            if (b)
            {
                AddSuccessMsg(string.Format("下载图片:{0} 成功\r\n", imgUrl));
            }
            else
            {
                var txt = string.Format("下载图片:{0} 失败\r\n Url:{1}\r\n", imgUrl, itemUrl);
                AddErrorMsg(txt);
                HtmlHelp.SaveStringToTxt(txt, "FaildMsg.txt");
            }
        }
Пример #3
0
        /// <summary>
        /// 获取指定作品的动画
        /// </summary>
        public void GetCanvasZipFile(string itemUrl, string savePath, string pid)
        {
            //可以获取zip的url
            var zipHtmlUrl = string.Format("https://www.pixiv.net/ajax/illust/{0}/ugoira_meta", pid);

            var html = DownHelp.GetHtmlString(zipHtmlUrl, Encoding.UTF8, 5);
            var fReg = new Regex(RegexHelp.Other.GetAnimation, RegexOptions.Singleline);
            var fM   = fReg.Match(html);

            if (fM == null || fM.Groups["Url"].Value == "")
            {
                AddErrorMsg(string.Format("获取 {0} 的动画失败!\r\n", itemUrl));
                return;
            }

            //zip的Url路径
            var fileUrl = fM.Groups["Url"].Value.Replace("\\/", "/");

            //zip文件名
            var fileName = savePath + "/" + Path.GetFileName(fileUrl);

            lock (Multithreading.ObjLockExistFile)
            {
                if (File.Exists(fileName))
                {
                    if (form.ChkNeglect.Checked)
                    {
                        AddErrorMsg(string.Format("文件{0}已存在,已忽略!\r\n", fileName));
                    }
                    return;
                }
            }

            //获取文件总大小
            var total = HtmlHelp.GetFileContenLength(fileUrl, itemUrl);

            if (total == 0)
            {
                AddErrorMsg(string.Format("获取 {0} 的大小失败!\r\n", fileUrl));
                return;
            }

            //分批获取文件
            var b = HtmlHelp.DownFile(fileUrl, fileName, itemUrl, 299999, total);

            if (b)
            {
                AddSuccessMsg(string.Format("下载 {0} 的文件成功!\r\n", fileUrl));
            }
            else
            {
                AddErrorMsg(string.Format("下载 {0} 的文件失败!\r\n Url:{1}\r\n", fileUrl, itemUrl));
                if (File.Exists(fileName))
                {
                    File.Delete(fileName);
                }
                return;
            }

            //获取delay
            var dr    = new Regex(RegexHelp.Other.GetDelay, RegexOptions.Singleline);
            var dm    = dr.Match(html);
            var delay = "50";

            if (dm != null && dm.Groups["Delay"].Value != "")
            {
                delay = dm.Groups["Delay"].Value;
            }

            var dic = new Dictionary <string, string>()
            {
                { "SavePath", savePath },
                { "FileUrl", fileUrl },
                { "FileName", fileName },
                { "Delay", delay }
            };

            while (!mut.UnZipFile(dic, UnZipFile))
            {
                Thread.Sleep(5000);
            }
        }
Пример #4
0
        /// <summary>
        /// 遍历列表页面,获取所有子项目,并自动获取下一页
        /// </summary>
        /// <param name="listUrl"></param>
        /// <param name="type"></param>
        /// <param name="doWork"></param>
        private void EachListPage(string listUrl, DownContentType type, Action <string> doWork)
        {
            try
            {
                while (mut.IsContinue)
                {
                    if (isSingle)
                    {
                        form.Invoke(new Action(() => { form.RtxtSuccess.Text = ""; form.TxtCurrListUrl.Text = listUrl; }));
                    }

                    AddSuccessMsg(string.Format("正在获取URL:{0} 的html!\r\n", listUrl));

                    var html = DownHelp.GetHtmlString(listUrl, Encoding.UTF8, 5);
                    if (html == "")
                    {
                        AddErrorMsg(string.Format("获取URL:{0} 的html失败!\r\n", listUrl));
                        return;
                    }

                    AddSuccessMsg(string.Format("获取URL:{0} 的html成功!\r\n", listUrl));

                    Regex pReg = new Regex(RegexHelp.GetRegex(type, RegexType.ListParentRegex), RegexOptions.Singleline);
                    var   pm   = pReg.Match(html);
                    if (pm == null || pm.Value == "")
                    {
                        AddErrorMsg(string.Format("获取URL:{0} 的父容器失败!\r\n", listUrl));
                        return;
                    }

                    var pHtml = pm.Value;

                    Regex lReg = new Regex(RegexHelp.GetRegex(type, RegexType.ListRegex), RegexOptions.Singleline);
                    var   lms  = lReg.Matches(pHtml);
                    if (lms == null || lms.Count <= 0)
                    {
                        AddErrorMsg(string.Format("获取URL:{0} 子项目失败!\r\n", listUrl));
                        return;
                    }

                    foreach (Match item in lms)
                    {
                        if (!mut.IsContinue)
                        {
                            return;
                        }

                        var itemUrl = item.Groups["Url"].Value;

                        doWork(itemUrl);
                    }

                    if (!mut.IsContinue)
                    {
                        return;
                    }

                    Regex nReg = new Regex(RegexHelp.GetRegex(type, RegexType.NextListRegex), RegexOptions.Singleline);
                    var   nm   = nReg.Match(html);
                    if (nm == null || nm.Groups["Next"].Value == "")
                    {
                        AddErrorMsg(string.Format("没有在:{0} 中获取到下一页!\r\n", listUrl));
                        form.Invoke(new Action(() =>
                        {
                            if (form.RadAllFollow.Checked && type == DownContentType.AllFollow)
                            {
                                form.LblOtherText.Text = string.Format("关注的{0}公开的画师已没有一下页!", getType == "show" ? "" : "非");
                            }
                            else if (form.RadSingle.Checked && type == DownContentType.SinglePainter)
                            {
                                form.LblOtherText.Text = "当前画师作品已没有一下页!";
                            }
                            else if (form.RadCollection.Checked && type == DownContentType.OwnCollection)
                            {
                                if (getType == "show" || getType == "hide")
                                {
                                    form.LblOtherText.Text = string.Format("收藏的{0}公开的作品已没有一下页!", getType == "show" ? "" : "非");
                                }
                                else
                                {
                                    form.LblOtherText.Text = string.Format("画师{0}收藏的作品已没有一下页!", getType);
                                }
                            }
                            else if (form.RadCollection.Checked && type == DownContentType.GetSearch)
                            {
                                form.LblOtherText.Text = string.Format("搜索的内容已没有一下页!");
                            }
                        }));
                        return;
                    }

                    var nextUrl = HtmlHelp.NeedHost(listUrl, nm.Groups["Next"].Value);
                    //EachListPage(nextUrl, type, doWork);
                    listUrl = nextUrl;
                    AddSuccessMsg(string.Format("正在获取下一页:{0}!\r\n", listUrl));
                }
            }
            catch (Exception ex)
            {
                AddErrorMsg(ex.Message + "\r\n");
                HtmlHelp.SaveStringToTxt(ex.Message + "\r\n" + ex.StackTrace + "\r\n\r\n", "Error.txt");
            }
        }
Пример #5
0
        /// <summary>
        /// 获取更多图片
        /// </summary>
        /// <param name="moreUrl">查看更多Url</param>
        public void GetMoreImage(string moreUrl, string savePath)
        {
            AddSuccessMsg(string.Format("正在获取URL:{0} 的html!\r\n", moreUrl));

            var html = DownHelp.GetHtmlString(moreUrl, Encoding.UTF8, 5);

            if (html == "")
            {
                AddErrorMsg(string.Format("获取URL:{0} 的html失败!\r\n", moreUrl));
                return;
            }

            AddSuccessMsg(string.Format("获取URL:{0} 的html成功!\r\n", moreUrl));


            //获取放大镜集合
            var mReg = new Regex(RegexHelp.Other.GetMaxButton, RegexOptions.Singleline);
            var mms  = mReg.Matches(html);

            if (mms != null && mms.Count > 0)
            {
                //获取放大后的图片
                foreach (Match m in mms)
                {
                    var mUrl = m.Groups["Url"].Value;
                    mUrl = HtmlHelp.NeedHost(moreUrl, mUrl);
                    var mHtml = DownHelp.GetHtmlString(mUrl, Encoding.UTF8, 5);

                    var mmReg = new Regex(RegexHelp.Other.GetImageWhenMax, RegexOptions.Singleline);
                    var mmm   = mmReg.Match(mHtml);
                    if (mmm == null || mmm.Groups["Url"].Value == "")
                    {
                        AddErrorMsg(string.Format("获取URL:{0} 的图片失败!\r\n", mUrl));
                        return;
                    }

                    var imgUrl = HtmlHelp.NeedHost(mUrl, mmm.Groups["Url"].Value);

                    lock (Multithreading.ObjLockExistFile)
                    {
                        if (File.Exists(savePath + "/" + Path.GetFileName(imgUrl)))
                        {
                            if (form.ChkNeglect.Checked)
                            {
                                AddErrorMsg(string.Format("跳过已存在的图片:{0}!\r\n", imgUrl));
                            }
                            continue;
                        }
                    }

                    AddSuccessMsg(string.Format("正在下载图片:{0} \r\n", imgUrl));
                    var  filePath = savePath + "/" + Path.GetFileName(imgUrl);
                    bool b        = DownHelp.DownImage(imgUrl, filePath, 1024, moreUrl, 5);

                    if (b)
                    {
                        AddSuccessMsg(string.Format("下载图片:{0} 成功\r\n", imgUrl));
                    }
                    else
                    {
                        var txt = string.Format("下载图片:{0} 失败\r\n Url:{1}\r\n", imgUrl, moreUrl);
                        AddErrorMsg(txt);
                        HtmlHelp.SaveStringToTxt(txt, "FaildMsg.txt");
                    }
                }
            }
            else
            {
                AddErrorMsg(string.Format("没有获取到放大镜集合:{0}!\r\n", moreUrl));
                return;

                //直接获取图片
                var msReg = new Regex(RegexHelp.Other.GetImageWhenNotMax, RegexOptions.Singleline);
                var imgMs = msReg.Matches(html);

                foreach (Match m in imgMs)
                {
                    var imgUrl = m.Groups["Url"].Value;
                    imgUrl = HtmlHelp.NeedHost(moreUrl, imgUrl);

                    lock (Multithreading.ObjLockExistFile)
                    {
                        if (File.Exists(savePath + "/" + Path.GetFileName(imgUrl)))
                        {
                            if (form.ChkNeglect.Checked)
                            {
                                AddErrorMsg(string.Format("跳过已存在的图片:{0}!\r\n", imgUrl));
                            }
                            continue;
                        }
                    }

                    AddSuccessMsg(string.Format("正在下载图片:{0} \r\n", imgUrl));

                    var  filePath = savePath + "/" + Path.GetFileName(imgUrl);
                    bool b        = DownHelp.DownImage(imgUrl, filePath, 1024, moreUrl, 5);

                    if (b)
                    {
                        AddSuccessMsg(string.Format("下载图片:{0} 成功\r\n", imgUrl));
                    }
                    else
                    {
                        var txt = string.Format("下载图片:{0} 失败\r\n Url:{1}\r\n", imgUrl, moreUrl);
                        AddErrorMsg(txt);
                        HtmlHelp.SaveStringToTxt(txt, "FaildMsg.txt");
                    }
                }
            }
        }
Пример #6
0
        /// <summary>
        /// 根据作品的网址获取作品
        /// </summary>
        /// <param name="itemUrl">作品url</param>
        public void GetWorksItem(object objParame)
        {
            try
            {
                var parame   = (RequestItemParameEntity)objParame;
                var itemUrl  = parame.ItemUrl;
                var savePath = parame.SavePath;
                var index    = itemUrl.IndexOf("id=");
                if (index < 0)
                {
                    AddErrorMsg(string.Format("获取URL:{0} 的id失败!\r\n", itemUrl));
                    return;
                }
                //作品id
                var pid = itemUrl.Substring(index + 3);

                if (isSingle)
                {
                    form.Invoke(new Action(() => { form.TxtItemUrl.Text = itemUrl; }));
                }

                AddSuccessMsg(string.Format("正在获取URL:{0} 的html!\r\n", itemUrl));

                //获取作品页的html
                var html = DownHelp.GetHtmlString(itemUrl, Encoding.UTF8, 5);
                if (html == "")
                {
                    AddErrorMsg(string.Format("获取URL:{0} 的html失败!\r\n", itemUrl));
                    return;
                }
                AddSuccessMsg(string.Format("获取URL:{0} 的html成功!\r\n", itemUrl));

                //获取作品的类型
                var tReg = new Regex(RegexHelp.Other.GetIllustType, RegexOptions.Singleline);
                var tm   = tReg.Match(html);
                if (tm == null || tm.Groups["T"].Value == "")
                {
                    AddErrorMsg(string.Format("获取URL:{0} 的类型失败!\r\n", itemUrl));
                    return;
                }
                var t = tm.Groups["T"].Value;

                if (t == "2")
                {
                    //动图
                    GetCanvasZipFile(itemUrl, savePath, pid);
                }
                else
                {
                    //单图或多图
                    //获取图片数量,以判别时单张还是多张
                    var pReg = new Regex(RegexHelp.Other.GetItemPageCount, RegexOptions.Singleline);
                    var pm   = pReg.Match(html);
                    if (pm == null || pm.Groups["P"].Value == "")
                    {
                        AddErrorMsg(string.Format("获取URL:{0} 的作品的子页数失败!\r\n", itemUrl));
                        return;
                    }
                    var pageCount = int.Parse(pm.Groups["P"].Value);

                    //判断是只有单个还是有查看更多
                    if (pageCount > 1)
                    {
                        var moreUrl = "https://www.pixiv.net/member_illust.php?mode=manga&illust_id=" + pid;

                        GetMoreImage(moreUrl, savePath);
                    }
                    else
                    {
                        GetSigImage(itemUrl, html, savePath);
                    }
                }

                Thread.Sleep(Sleep);
            }
            catch (Exception e)
            {
                AddErrorMsg(e.Message + "\r\n");
            }
            finally
            {
                if (!isSingle)
                {
                    mut.RemoveDThread();
                }
            }
        }