实例化

1
2
3
4
5
ChromiumWebBrowser webview = new ChromiumWebBrowser("http://cdcs.qgil.net/login");
webview.Dock = DockStyle.Fill;
webview.FrameLoadEnd += Browser_FrameLoadEnd;
webview.RequestHandler = new WinFormsRequestHandler();//request请求的具体实现
gb_QG.Controls.Add(webview);

页面加载完成之后

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
/// <summary>
/// 页面加载结束
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
this.BeginInvoke(new Action(async () =>
{
switch (e.Url)
{
//联代登录
case "http://uniscoqd.sdland-sea.com/login":
for (int i = 0; i < LDwebview.GetBrowser().GetFrameIdentifiers().Count; i++)
{
IFrame frame = LDwebview.GetBrowser().GetFrame(LDwebview.GetBrowser().GetFrameIdentifiers()[i]);
if (frame.Url == "http://uniscoqd.sdland-sea.com/login")
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("function tempFunction() {");
//sb.AppendLine(" return document.body.innerHTML; ");
sb.AppendLine(" return document.getElementsByTagName('html')[0].innerHTML; ");
sb.AppendLine("}");
sb.AppendLine("tempFunction();");
var task01 = frame.EvaluateScriptAsync(sb.ToString());
task01.ContinueWith(t =>
{
if (!t.IsFaulted)
{
var response = t.Result;
if (response.Success == true)
{
if (response.Result != null)
{
string resultStr = response.Result.ToString();
//解析html
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(resultStr);
HtmlNode _HtmlNode = htmlDoc.DocumentNode.SelectSingleNode("//img[@class='login-code-img']");
var _csrf = _HtmlNode.Attributes["src"].Value;
//保存验证码
var ImageUrl = Base64ToImage(_csrf, "UploadFile\\CDLD\\", "cdcs_qgil_net");
//识别验证码
var ImageCodeJson = CJY_RecognizeFile(ImageUrl, "15275228345", MD5String("feilian777"), "96001", "6001", "0", "0", "");
var ImageCodeData = JsonConvert.DeserializeObject<ImageCodeRoot>(ImageCodeJson);
if (ImageCodeData.err_no == 0)
{
//登录成功之后账号密码赋值
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('.el-input__inner').forEach(function(item, index){if(index==0){item.value='18663935558'}else if(index==1){item.value='Qd2025data'}else{item.value='" + ImageCodeData.pic_str + "'}})");
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('.el-input__inner').forEach(function(item, index){item.dispatchEvent(new Event('input'))})");
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('button')[0].click()");
}
}
}
}
});
}
}
break;
}
}));
}

拦截请求

新建类WinFormsRequestHandler

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
public class WinFormsRequestHandler : RequestHandler
{
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
//NOTE: In most cases you examine the request.Url and only handle requests you are interested in
if (request.Url.ToLower().Contains("login".ToLower()))
{
using (var postData = request.PostData)
{
if (postData != null)
{
var elements = postData.Elements;

var charSet = request.GetCharSet();

foreach (var element in elements)
{
if (element.Type == PostDataElementType.Bytes)
{
var body = element.GetBody(charSet);
}
}
}
}
}
return new WinFormResourceRequestHandler();
}

}

新建类WinFormResourceRequestHandler

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
public class WinFormResourceRequestHandler : ResourceRequestHandler
{
public event Action<string> msg;
public event Action<string, object> msg2;

protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
var filter = FilterManager.CreateFilter(request.Identifier.ToString());
return filter;
}
/// <summary>
/// 加载完成之后
/// </summary>
/// <param name="chromiumWebBrowser"></param>
/// <param name="browser"></param>
/// <param name="frame"></param>
/// <param name="request"></param>
/// <param name="response"></param>
/// <param name="status"></param>
/// <param name="receivedContentLength"></param>
protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
{
try
{
var filter = FilterManager.GetFileter(request.Identifier.ToString()) as TestJsonFilter;
//这里截获返回的数据
var ResponseData = Encoding.UTF8.GetString(filter.DataAll.ToArray());
string url = request.Url;
#region 青港
//获取青港验证码
if (url.Contains("http://cdcs.qgil.net/prod-api/captchaImage"))
{
var ResponseJson = JsonConvert.DeserializeObject<captchaImageRoot>(ResponseData);
//保存验证码
var ImageUrl = Base64ToImage("data:image/png;base64," + ResponseJson.img, "UploadFile\\CDQG\\", "cdcs_qgil_net");
//识别验证码
var ImageCodeJson = CJY_RecognizeFile(ImageUrl, "15275228345", MD5String("feilian777"), "96001", "6001", "0", "0", "");
var ImageCodeData = JsonConvert.DeserializeObject<ImageCodeRoot>(ImageCodeJson);
if (ImageCodeData.err_no == 0)
{
//登录成功之后账号密码赋值
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('.el-input__inner').forEach(function(item, index){if(index==0){item.value='18663935558'}else if(index==1){item.value='Qd2025data'}else{item.value='" + ImageCodeData.pic_str + "'}})");
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('.el-input__inner').forEach(function(item, index){item.dispatchEvent(new Event('input'))})");
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('button')[0].click()");
}
}
//获取青港cookie
if (url.Contains("http://cdcs.qgil.net/prod-api/login"))
{
var resData = JsonConvert.DeserializeObject<loginRoot>(ResponseData);
if (resData.code == 200)
{
Fly_ManifestUser entity = db.Queryable<Fly_ManifestUser>().Where(p => p.Type == "QG青港").ToList().FirstOrDefault();
entity.Cookie = resData.token;
entity.CookieDate = DateTime.Now;
db.Updateable(entity).ExecuteCommand();
addLog("青港cookie更新成功------" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
#endregion

#region 外运
//获取外运验证码
if (url.Contains("https://e-sinotrans.sinotrans.com/services2/usercenter/userCenter/sendIdentifyCode"))
{
using (var postData = request.PostData)
{
if (postData != null)
{
var elements = postData.Elements;
var charSet = request.GetCharSet();
string body = string.Empty;
foreach (var element in elements)
{
if (element.Type == PostDataElementType.Bytes)
{
body = element.GetBody(charSet);
msg?.Invoke(body);
}
}
var RequestData = JsonConvert.DeserializeObject<IdentifyCodeRoot>(body);
//登录成功之后账号密码赋值
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('.el-input__inner').forEach(function(item, index){if(index==0){item.value='QDYJZX'}else if(index==1){item.value='Qd123456#'}else{item.value='" + RequestData.identifyCode + "'}})");
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('.el-input__inner').forEach(function(item, index){item.dispatchEvent(new Event('input'))})");
frame.ExecuteJavaScriptAsync(@"document.querySelectorAll('button')[0].click()");
}
}
}
//获取外运cookie
if (url.Contains("https://e-sinotrans.sinotrans.com/services2/usercenter/EsFunction/getFunctionUrls"))
{
var cookies = request.GetHeaderByName("Cookie");
Fly_ManifestUser entity = db.Queryable<Fly_ManifestUser>().Where(p => p.Type == "WY外运").ToList().FirstOrDefault();
entity.Cookie = cookies;
entity.CookieDate = DateTime.Now;
db.Updateable(entity).ExecuteCommand();
addLog("外运cookie更新成功------" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
#endregion
}
catch (Exception)
{
}


}

//protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
//{
// var Method = request.Method;
// if (request.Url.Contains("http://cdcs.qgil.net/prod-api/captchaImage"))
// {


// }
// msg?.Invoke(request.Url);
// msg?.Invoke(Method);
// //清单分页查询
// return CefReturnValue.Continue;
//}
}

新建类FilterManager

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
public class TestJsonFilter : IResponseFilter
{
public List<byte> DataAll = new List<byte>();

public FilterStatus Filter(System.IO.Stream dataIn, out long dataInRead, System.IO.Stream dataOut, out long dataOutWritten)
{
try
{
if (dataIn == null || dataIn.Length == 0)
{
dataInRead = 0;
dataOutWritten = 0;

return FilterStatus.Done;
}

dataInRead = dataIn.Length;
dataOutWritten = Math.Min(dataInRead, dataOut.Length);

dataIn.CopyTo(dataOut);
dataIn.Seek(0, SeekOrigin.Begin);
byte[] bs = new byte[dataIn.Length];
dataIn.Read(bs, 0, bs.Length);
DataAll.AddRange(bs);

dataInRead = dataIn.Length;
dataOutWritten = dataIn.Length;

return FilterStatus.NeedMoreData;
}
catch (Exception ex)
{
dataInRead = dataIn.Length;
dataOutWritten = dataIn.Length;

return FilterStatus.Done;
}
}

public bool InitFilter()
{
return true;
}

public void Dispose()
{

}
}
public class FilterManager
{
private static Dictionary<string, IResponseFilter> dataList = new Dictionary<string, IResponseFilter>();

public static IResponseFilter CreateFilter(string guid)
{
lock (dataList)
{
var filter = new TestJsonFilter();
dataList.Add(guid, filter);

return filter;
}
}

public static IResponseFilter GetFileter(string guid)
{
lock (dataList)
{
return dataList[guid];
}
}
}