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
ChromeOptions options = new ChromeOptions();
//是否现实浏览器:true显示,false不显示
bool ifShowBrowser = this._ConfigItem.ifShowBrowser;
if (!ifShowBrowser) options.AddArgument("-headless");
//设置浏览器大小避免无头模式下元素越界异常
options.AddArgument("--window-size=1920,1050");
//减少headless模式下日志
options.AddArgument("log-level=3");
//绕过检测
// 启用 Stealth 模式
options.AddArgument("--disable-blink-features=AutomationControlled");
options.AddArgument("--disable-blink-features=AutomationControlledCrOS");

// 添加 Stealth 用户代理字符串
options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.111 Safari/537.36");

// 添加 Stealth WebGL 配置
options.AddArgument("--disable-webgl");
options.AddArgument("--disable-extensions");
options.AddArgument("--disable-plugins");
//实例化一个谷歌浏览器
//设置cmd窗口不弹出来
ChromeDriverService service = ChromeDriverService.CreateDefaultService(System.AppDomain.CurrentDomain.BaseDirectory.ToString());
service.HideCommandPromptWindow = !ifShowBrowser;
ChromeDriver driver = new ChromeDriver(service, options);
////以青港登录为例,完成自动登录,浏览器中打开青港,可以换成任意你要测试的网站,可以人工打开网站去输入账号密码看看
//driver.Navigate().GoToUrl("http://cdcs.qgil.net/index");
////获取cookie
//var _cookie = driver.Manage().Cookies;
////在获取的cookie中添加token和sidebarStatus
//_cookie.AddCookie(new OpenQA.Selenium.Cookie("sidebarStatus", "0"));
//_cookie.AddCookie(new OpenQA.Selenium.Cookie("Admin-Token", entity.Cookie));
driver.Navigate().GoToUrl("http://cdcs.qgil.net/index");
Thread.Sleep(2000);//2秒后还是这个url表示token没有失效继续可以使用,失效了就重新登录
if (driver.Url != "http://cdcs.qgil.net/index")
{
//设置超时等待(隐式等待)时间设置10秒(不用管)
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15);
//找到用户名输入,如果有ID,直接By.Id("元素Id")就行,这些看相关链接文档都有介绍,下面是用不同方式获取页面元素
//元素的XPath可以从浏览器里面F12 代码检查中直接拷贝出来,不会就信息我
driver.FindElement(By.TagName("input")).SendKeys(this._ConfigItem.QG_Account);
//找到密码输入
driver.FindElement(By.XPath("//*[@id=\"app\"]/div[1]/form/div[2]/div/div/input")).SendKeys(this._ConfigItem.QG_Password);
//找到按钮点击
driver.FindElement(By.XPath("//*[@id=\"app\"]/div[1]/form/div[4]/div[1]/div/div/button")).Click();
//定义鼠标事件
Actions tuozhuai = new Actions(driver);
Thread.Sleep(1000);//滑块背景有时候刷新过快受到影响
//找到滑块图片,取出滑块的base64数据
var huakuai = driver.FindElement(By.XPath("//*[@id=\"app\"]/div[1]/form/div[3]/div/div[2]/div/div[2]/div/div/div/img")).GetAttribute("src").Replace("data:image/png;base64,", "");
//找到背景,取出背景base64数据
var beijing = driver.FindElement(By.XPath("//*[@id=\"app\"]/div[1]/form/div[3]/div/div[2]/div/div[1]/div/img")).GetAttribute("src").Replace("data:image/png;base64,", "");
//多次调用青港接口的情况会出现屏蔽,导致滑块返回的base64为空,正常不会,因此没有做判断
#region 图片切割,因为背景图片上好多的凹槽块,云码识别大部分会识别失败,为了提高识别率只切割出来滑块对应的那一条背景进行识别
//获取滑块图第一个像素点的y的偏移量
int offsetY = getHeight(huakuai, "\\UploadFile\\CDQG\\");
//把背景切割后重新放置于beijing里面--截取滑块对应位置的同高度一段背景图片
beijing = ImgHelper.CapturelmageByBase64(beijing, 0, offsetY - 1, offsetY + ".png", 310, 49, "\\UploadFile\\CDQG\\");
#endregion
//调用云码识别,计算滑动的距离
var dic = new Dictionary<string, string>() {
{ "token","Ax7TSY8X"},
{ "slide_image",huakuai},
{ "background_image",beijing},
{ "type","20111"}
};
var response = Post_customApi("https://www.jfbym.com/api/YmServer/customApi", dic, new Dictionary<string, string>());
//找到滑块拖拽返回的像素数
var huakuaidiv = driver.FindElement(By.ClassName("verify-move-block"));
//var result = xs.Match("{\"msg\":\"识别成功\",\"code\":10000,\"data\":{\"code\":0,\"data\":\"145\",\"time\":0.018527507781982422,\"unique_code\":\"8380dab870ca389c425842e14731048f\"}}");
//定义正则表达式,匹配滑块识别返回的偏移量"data":"偏移量"
Regex xs = new Regex("\"data\":\"[0-9]+\"");
if (!string.IsNullOrEmpty(response))
{
var result = xs.Match(response);
if (result.Success)
{
var yidongjuli = result.Groups[0].ToString().Split(':')[1].Replace("\"", "");
//开始拖拽
tuozhuai.DragAndDropToOffset(huakuaidiv, Convert.ToInt32(yidongjuli) + 10, 0).Build().Perform();
//最长10秒的判断时间,判断是否进入主页,进入表示登录成功,则跳出循环向下走 //10秒后判断url是否变化如果进入则获取token,否则再次登录
for (int i = 0; i < 5; i++)
{
Thread.Sleep(2000);//等待10秒

if (driver.Url == "http://cdcs.qgil.net/index") break;
}
if (driver.Url == "http://cdcs.qgil.net/index")
{
//url发生了跳转表示登录成功
var Cookies = driver.Manage().Cookies;
//拿到token更新存储到数据库
var cookie = Cookies.GetCookieNamed("Admin-Token").Value;
if (!string.IsNullOrEmpty(cookie))
{
List<Fly_ManifestUser> List = db.Queryable<Fly_ManifestUser>().Where(p => p.Type == "QG青港" && p.Account == this._ConfigItem.QG_Account).ToList();
foreach (var item in List)
{
item.Cookie = cookie;
item.CookieDate = DateTime.Now;
db.Updateable(item).ExecuteCommand();
}
addLog("青港cookie更新成功------" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "QG-青港");
}
}
}
}
}
//请求后关闭后台及浏览器
driver.Quit();
driver.Dispose();
service.Dispose();