通过下面一张图看下要实现的功能,具体详情如下所示:
现在我就来介绍些软件的其它功能。希望大家有所受益。
模拟人为搜索商品
在刷单的时候,不能直接拿到一个商品网址就进入购买页面吧,得模拟人为搜索。
在这一个过程中有两个难点:
1)商品列表的异步加载 ; 2)翻页并且截图;
在园子里,我就不在关公面前耍大刀了。
直接上关键代码:
i:搜索商品,并且翻页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
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:因为每个页面都是异常加载的,选择适当的时机对网页进行截图
截取整个网页:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
/*
因为包含了控件,如果在了线程里调用,必须用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();
}
}
|
截取网页的某个区域:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/// <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();
}
}
|
在这代码里有很多有趣的片段。有心的朋友会发现。