Java完成仿淘寶滑動驗證碼研討代碼詳解。本站提示廣大學習愛好者:(Java完成仿淘寶滑動驗證碼研討代碼詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java完成仿淘寶滑動驗證碼研討代碼詳解正文
經由過程上面一張圖看下要完成的功效,詳細概況以下所示:
如今我就來引見些軟件的其它功效。願望年夜家有所受害。
模仿工資搜刮商品
在刷單的時刻,不克不及直接拿到一個商品網址就進入購置頁面吧,得模仿工資搜刮。
在這一個進程中有兩個難點:
1)商品列表的異步加載 ; 2)翻頁而且截圖;
在園子裡,我就不在關公眼前耍年夜刀了。
直接上症結代碼:
i:搜刮商品,而且翻頁
public bool? SearchProduct(TaskDetailModel taskDetailData) { bool? result = null; bool isIndex = true; bool isList = true; WebBrowserTask.Instance.SetProperties(); WebBrowserTask.Instance.ClearDocumentCompleted(); WebBrowserTask.Instance.DocumentCompleted += (wbSenderSearch, wbESearch) => { System.Windows.Forms.WebBrowser currentWB = wbSenderSearch as System.Windows.Forms.WebBrowser; System.Windows.Forms.HtmlDocument currentDoc = currentWB.Document; mshtml.HTMLDocument currentDom = currentDoc.DomDocument as mshtml.HTMLDocument; String wbUrl = wbESearch.Url.ToString(); if (currentWB.ReadyState == System.Windows.Forms.WebBrowserReadyState.Complete) { #region 首頁搜刮 if (wbUrl.Contains("www.taobao.com")) { if (isIndex == true) { isIndex = false; taskDetailData.DetailRemark = String.Format(@"輸出症結字""{0}""搜刮商品……", taskDetailData.TaskName); Func<bool> func = () => { bool asynctag = false; System.Threading.Thread.Sleep(5000); asynctag = true; return asynctag; }; func.BeginInvoke((ar) => { bool asyncresult = func.EndInvoke(ar); if (asyncresult) { System.Windows.Forms.HtmlElement heee = currentDoc.GetElementById("J_SearchTab"); String classname = heee.GetAttribute("classname"); System.Windows.Forms.HtmlElement hitem = heee.Children[0]; System.Windows.Forms.HtmlElementCollection heclis = hitem.Children; System.Windows.Forms.HtmlElement li1 = heclis[0]; System.Windows.Forms.HtmlElement li2 = heclis[1]; System.Windows.Forms.HtmlElement li3 = heclis[2]; foreach (System.Windows.Forms.HtmlElement li in heclis) { String liclass = li.GetAttribute("classname"); if (liclass.Contains("selected")) { System.Windows.Forms.HtmlElement q = currentDoc.GetElementById("q"); System.Windows.Forms.HtmlElement btnsearch = currentDoc.GetElementById("J_TSearchForm").Children[0].Children[0]; if (q != null && btnsearch != null) { q.Focus(); q.SetAttribute("value", taskDetailData.TaskName); btnsearch.Focus(); string savePath = Path.Combine(UserData.WorkBenchDirectory, taskDetailData.TaskDetailCode, String.Format("搜刮提交.jpg", "")); CaptureImage.CaptureWebPageArea(currentDom, savePath); btnsearch.InvokeMember("click"); } } } } }, null); } } #endregion 首頁搜刮 #region 商品列表 if (wbUrl.Contains("s.taobao.com")) { if (isList == true) { isList = false; Func<bool> func = () => { bool asynctag = false; asynctag = true; return asynctag; }; func.BeginInvoke((ar) => { bool asyncresult = func.EndInvoke(ar); if (asyncresult) { //解析每頁商品 String clickProductURL = TurningAndParsePage(currentDoc, taskDetailData); result = true; } }, null); } } #endregion 商品列表 } }; //DocumentCompleted停止 System.Windows.Application.Current.Dispatcher.Invoke(new System.Action(() => { WebBrowserTask.Instance.Navigate("https://www.taobao.com/"); })); for (int i = 0; i < 120; i++) { System.Threading.Thread.Sleep(1000); if (result != null) { break; } } return result; }
ii:由於每一個頁面都是異常加載的,選擇恰當的機會對網頁停止截圖
截取全部網頁:
/* 由於包括了控件,假如在了線程裡挪用,必需用Invoke辦法 System.Windows.Application.Current.Dispatcher.Invoke(new System.Action(() => { //htmlDoc.Window.ScrollTo(new System.Drawing.Point(5000, htmlDoc.Body.ScrollRectangle.Height)); string savePath = string.Format(@"D:\{0}.jpg", Guid.NewGuid().ToString()); CaptureImage.CaptureWebPage(webBrowserTask, savePath); }), System.Windows.Threading.DispatcherPriority.Background); */ /// <summary> /// 截取全部網頁 /// </summary> /// <param name="web"></param> /// <param name="savePath"></param> public static void CaptureWebPage(System.Windows.Forms.WebBrowser web, String savePath) { Rectangle body = web.Document.Body.ScrollRectangle; Rectangle docRectangle = new Rectangle() { Location = new Point(0, 0), Size = new Size(body.Width, body.Height) }; web.Dock = DockStyle.None; web.Width = docRectangle.Width; web.Height = docRectangle.Height; Rectangle imgRectangle = docRectangle; using (Bitmap bitmap = new Bitmap(imgRectangle.Width, imgRectangle.Height)) { IViewObject ivo = web.Document.DomDocument as IViewObject; using (Graphics g = Graphics.FromImage(bitmap)) { IntPtr hdc = g.GetHdc(); ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref imgRectangle, ref docRectangle, IntPtr.Zero, 0); g.ReleaseHdc(hdc); } bitmap.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg); bitmap.Dispose(); } }
截取網頁的某個區域:
/// <summary> /// 截取網頁的一部分 /// </summary> /// <param name="htmlDom"></param> /// <param name="savePath"></param> public static void CaptureWebPageArea(mshtml.HTMLDocument htmlDom, String savePath) { String saveDir = System.IO.Path.GetDirectoryName(savePath); if (!System.IO.Directory.Exists(saveDir)) { System.IO.Directory.CreateDirectory(saveDir); } Rectangle docRectangle = new Rectangle() { Location = new Point(0, 0), //Size = new Size(htmlDom.body.offsetWidth, htmlDom.body.offsetHeight) Size = new Size((int)System.Windows.SystemParameters.PrimaryScreenWidth, (int)System.Windows.SystemParameters.PrimaryScreenHeight) }; Rectangle imgRectangle = docRectangle; using (Bitmap bitmap = new Bitmap(imgRectangle.Width, imgRectangle.Height)) { IViewObject ivo = htmlDom as IViewObject; using (Graphics g = Graphics.FromImage(bitmap)) { IntPtr hdc = g.GetHdc(); ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref imgRectangle, ref docRectangle, IntPtr.Zero, 0); g.ReleaseHdc(hdc); } bitmap.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg); bitmap.Dispose(); } }
在這代碼裡有許多風趣的片斷。有心的同伙會發明。