隐藏

c#使用selenium过滑动验证码

发布:2021/2/20 9:46:54作者:管理员 来源:本站 浏览次数:1665

滑动验证码如下:

 

1、vs引入以下三个包(.net core 3.1):

2、c#引用:


  1. private void SeleniumVertifyCode(Uri uri)
  2. {
  3. var options = new OpenQA.Selenium.Chrome.ChromeOptions();
  4. //不显示浏览器UI窗口
  5. options.AddArgument("-headless");
  6. using IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(options);
  7. //先设置uri
  8. driver.Navigate().GoToUrl(uri);
  9. var cookie = driver.Manage().Cookies;
  10. //再添加cookie
  11. cookie.AddCookie(new Cookie("name", "value", ".com", "/", null));
  12. //再次访问验证码uri
  13. driver.Navigate().GoToUrl(uri);
  14. //反爬:设置windows.navigate.webdrive的值为undefine
  15. driver.ExecuteJavaScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
  16. //查看网页源码
  17. //var source = driver.PageSource;
  18. //找到滑块元素
  19. var slide = driver.FindElement(By.CssSelector("#nc_1_n1z"));
  20. var verifyContainer = driver.FindElement(By.CssSelector(".nc-lang-cnt"));
  21. var width = verifyContainer.Size.Width;
  22. var action = new Actions(driver);
  23. //点击并按住滑块元素
  24. action.ClickAndHold(slide).Perform();
  25. Random random = new Random();
  26. int offset = 0;
  27. //模仿人工滑动
  28. const int minOffset = 10;
  29. const int maxOffset = 30;
  30. while (width > offset)
  31. {
  32. offset += random.Next(minOffset, maxOffset);
  33. action.MoveByOffset(offset, 0).Perform();
  34. var code = driver.FindElement(By.CssSelector(".nc-lang-cnt")).Text;
  35. if (code.Contains("验证通过"))
  36. {
  37. break;
  38. }
  39. System.Threading.Thread.Sleep(offset * minOffset);
  40. }
  41. //点击验证按钮
  42. action.Click(driver.FindElement(By.CssSelector("#verify"))).Perform();
  43. //退出webdriver
  44. driver.Quit();
  45. }