前言(100天做了一件事):

记得在几个月前写过一篇博客,淘宝滑动验证码研究 ,不少的园友对代码比较感兴趣。我也把源码发放给了2位比较聊的来的朋友。不过现在已经又升级了。^_^

这篇博客写了一个后记,估计当时也没什么人留意。我把这博客的后记截个图(这篇博客是3月7号写的,今天是6月27号,刚好100天)

现在我就来介绍些软件的其它功能。希望大家有所受益。

模拟人为搜索商品

在刷单的时候,不能直接拿到一个商品网址就进入购买页面吧,得模拟人为搜索。

在这一个过程中有两个难点:

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;
}

View Code

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

View Code

截取网页的某个区域:

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

View Code

在这代码里有很多有趣的片段。有心的朋友会发现。

总结

我整个软件已经开发完成。但是我就是不贴上网址。免得有人说我打广告。

哈哈

转载于:https://www.cnblogs.com/xcj26/p/5621231.html

滑动验证码研究-后续相关推荐

  1. 自动验证抢宝箱时的滑动验证码代码实现

    淘宝滑动验证码研究 引言 悠闲的时候,总会去找些事做做.前些天在登录淘宝的时候,发现了滑动验证码,虽然已经不是什么新事物,但还是产生了很大的兴趣. 传统的字符输入验证码,变为了滑动验证码,这一看就是产 ...

  2. 200行代码实现一个滑动验证码

    作者 | 崔庆才 转载自进击的Coder(ID: FightingCoder) 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还 ...

  3. java验证码图片滑动验证码_图片滑动验证码的生成

    使用Java生成图片滑动验证码 image.png 目前接到了一个新的小需求,要在登录时进行滑动图片验证. 搜了一下网上的demo,没有太多很完整的demo.就参考各种文档自己拼凑了一个出来.整理一下 ...

  4. BiliBili等网站极验滑动验证码的详细破解过程

    基于selenium自动化的滑动验证码破解 selenium python 验证码 1.环境配置(Linux) python2.7 pip安装的库:selenium , PIL Chrome浏览器 , ...

  5. 如何破解滑动验证码?

    本文通过自动化查询域名或公司的备案信息,来演示其中图片滑动验证码的破解方式,以此来思考验证码的安全性问题,思考如何设计出安全性更高的验证码. 注意:破解验证码进行网络内容抓取可能是一种违规行为,可以以 ...

  6. 爬虫python代码-Python爬虫教程:200行代码实现一个滑动验证码

    Python爬虫教程:教你用200行代码实现一个滑动验证码 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大 ...

  7. 前端 验证码隐藏怎么实现_Python爬虫教程:200行代码实现一个滑动验证码

    Python爬虫教程:教你用200行代码实现一个滑动验证码 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大 ...

  8. float js 正则 验证_爬虫篇 | 200 行代码实现一个滑动验证码

    最近整理一个爬虫系列方面的文章,不管大家的基础如何,我从头开始整一个爬虫系列方面的文章,让大家循序渐进的学习爬虫,小白也没有学习障碍. 爬虫篇 | Python使用正则来爬取豆瓣图书数据 爬虫篇 | ...

  9. 200 行代码实现一个滑动验证码

    做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大致说明下这些验证码的原理以及带大家实现一个滑动验证码. 我之 ...

最新文章

  1. sql查阅每一月的数据
  2. Filter高级开发
  3. 实验 4 [bx]和 loop 的使用
  4. css 实现章节名称不换行,多余部分用 ... 代替
  5. showdoc windows 搭建_ShowDoc的搭建
  6. 25.Yii2 自动加载
  7. python再议装饰器
  8. PHP生成短链接的方法
  9. halcon 灰度投影
  10. 年薪40万的腾讯实习生作息表流出,我才知道什么叫人间真实
  11. kubernetes pod NodeLost 分析
  12. 《杀死一只知更鸟》读书笔记精华分享
  13. 别被你的双眼所欺骗!100张神奇的视觉欺骗图
  14. php web访问数据库,百宝箱之介绍PHP Web查询数据库基本步骤
  15. 华芯片特微 M33内核 KEIL5环境配置不上问题
  16. nvidia显卡编码并发session限制破解
  17. 基于HTML(服装商城)电商项目项目的设计与实现(html前端源码和论文设计)
  18. ghost64怎么装linux,使用ghost对linux进行系统备份
  19. 计算机网络——PPP协议与HDLC协议
  20. SecPod:基于虚拟化的安全系统框架

热门文章

  1. matlab libjli.so,error while loading shared libraries: libjli.so 问题解决
  2. java 53个关键字_java的保留(53个)关键字v11.docx
  3. mysql数据库过滤空值_mysql必知必会--过 滤 数 据
  4. AcWing 1738. 蹄球(特殊基环树)
  5. Java中Spring面试基础题20190302
  6. [NLP]OpenNLP块检测器(Chunker)的使用
  7. 常用排序算法-java实现(希尔,归并)
  8. Windows和Mac下获取(当前)进程内存占用
  9. Like Sunday, Like Rain - JavaScript运算符优先级
  10. 更改VMware硬盘大小