login.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. const webdriver = require('selenium-webdriver');
  2. const { Options } = require('selenium-webdriver/chrome');
  3. const { Command } = require('selenium-webdriver/lib/command');
  4. const { saveFile } = require('../tools/save-file');
  5. const fs = require('fs');
  6. const { get } = require('superagent');
  7. const caps = webdriver.Capabilities.chrome();
  8. const options = new Options();
  9. // 设置chrome.exe 位置
  10. options.setChromeBinaryPath('C:\\Users\\cr150\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe');
  11. // 设置为开发者模式,防止被各大网站识别出来使用了Selenium
  12. options.addArguments('disable-blink-features=AutomationControlled')
  13. // 淘宝账号密码
  14. const userName = '18683971105';
  15. const password = 'chengrang.';
  16. /**
  17. *
  18. * @param {obj} opts 配置
  19. * noImg: false,
  20. * strategy: eager normal none
  21. */
  22. async function login(opts = {}) {
  23. // 不加载图片, 提升速度
  24. if(opts.noImg){
  25. options.addArguments('blink-settings=imagesEnabled=false')
  26. }
  27. // 页面加载策略 eager normal none
  28. if(opts.strategy){
  29. caps.setPageLoadStrategy(opts.strategy);
  30. }
  31. let driver = new webdriver.Builder()
  32. .setChromeOptions(options)
  33. .withCapabilities(caps)
  34. .build();
  35. // await driver.get('https://login.taobao.com/')
  36. await driver.get('https://login.tmall.com')
  37. // 判断是否有cookie
  38. const cacheCookiesStr = fs.readFileSync('./cookie/cookie.json', 'utf8');
  39. if (cacheCookiesStr) {
  40. // cookie登录
  41. const cacheCookies = JSON.parse(cacheCookiesStr);
  42. for (let item of cacheCookies) {
  43. item.sameSite = 'Lax';
  44. await driver.manage().addCookie(item);
  45. }
  46. // await driver.get('https://www.taobao.com/');
  47. await driver.get('https://www.tmall.com');
  48. try {
  49. const loginEle = await driver.findElement(webdriver.By.xpath('//*[@id="login-info"]/span[1]/a[1]'));
  50. console.log('cookie登录成功');
  51. } catch (error) {
  52. // 自动登录
  53. await autoLogin(driver);
  54. }
  55. } else {
  56. // 自动登录
  57. await autoLogin(driver);
  58. }
  59. return driver;
  60. }
  61. // 自动登录
  62. async function autoLogin(driver) {
  63. await driver.get('https://login.taobao.com/member/login.jhtml?tpl_redirect_url=https%3A%2F%2Flumn.tmall.com%2Fsearch.htm%3Fspm%3Da1z10.3-b-s.w5002-15438998724.1.48a63b51L03f6W%26search%3Dy&style=miniall&enup=true&newMini2=true&full_redirect=true&sub=true&from=tmall&allp=assets_css%3D3.0.10/login_pc.css&pms=1599124573437');
  64. // 检测登录框
  65. await driver.wait(webdriver.until.elementLocated(webdriver.By.xpath('//*[@id="fm-login-id"]')), 60000, '未检测到登录框');
  66. // 获取登录元素
  67. const accountEle = await driver.findElement(webdriver.By.xpath('//*[@id="fm-login-id"]'));
  68. const passwordEle = await driver.findElement(webdriver.By.xpath('//*[@id="fm-login-password"]'));
  69. const submitBtn = await driver.findElement(webdriver.By.xpath('//*[@id="login-form"]/div[4]/button'));
  70. // 模拟输入
  71. await accountEle.sendKeys(userName)
  72. await passwordEle.sendKeys(password);
  73. await submitBtn.click();
  74. await driver.wait(webdriver.until.elementLocated(webdriver.By.xpath('//*[@id="login-info"]/span[1]/a[1]')), 60000, '登陆超时未成功');
  75. console.log('自动登录成功');
  76. // 保存cookie
  77. const cookie = await (await driver).manage().getCookies();
  78. saveFile('cookie.json', JSON.stringify(cookie, null, 4), './cookie/');
  79. return driver;
  80. }
  81. module.exports = login;