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