Casperjs Google Login (V2) не работает

1

Я использую casperjs (поэтому phantomjs посередине) для доступа к некоторым утилитам google, но, прежде чем обращаться к ним, мы должны войти в Google. Для проверки подлинности V1 google мы используем следующий скрипт:

var casper = require('casper').create();
url = 'https://accounts.google.com/ServiceLogin?passive=1209600&continue=https%3A%2F%2Faccounts.google.com%2FManageAccount&followup=https%3A%2F%2Faccounts.google.com%2FManageAccount&flowName=GlifWebSignIn&flowEntry=ServiceLogin&nojavascript=1#identifier';
casper.start(url, function() {

  this.fillSelectors('form#gaia_loginform', {
    'input[name="Email"]': 'your@email',
  }); //Fills the email box with email
  this.click("#next");

  this.wait(500, function() { //Wait for next page to load
    this.waitForSelector("#Passwd", //Wait for password box
      function success() {
        console.log("SUCCESS...");
        this.fillSelectors('form#gaia_loginform', {
          'input[name="Passwd"]': 'yourPassw',
        }); //Fill password box with PASSWORD
        this.click("#signIn"); //Click sign in button
        this.wait(500, function() {}); //Wait for it fully sigin
        casper.thenOpen('http://utility.google.com/', function() {
            this.wait(2000, function() {
                this.capture('media/status.png', undefined, {
                    format: 'png',
                    quality: 100'enter code here'
                });
            });
        });
      },
      function fail() {
        console.log("FAIL...");
      }
    );
  });
});
casper.run();

Мы изменили способ манипулирования формой и заполнения полей, и она работает до сих пор. Проблема с аутентификацией V2 заключается в том, что запуск событий мыши невозможен, это означает, что мы не можем щелкнуть, используя this.click("# next") и this.click("# signIn"). Я пробовал делать сообщения по форме, используя различные события мыши, а также пытался манипулировать непосредственно событиями jsaction. Ничего не работает.

У кого-то есть идея, как решить эту проблему? Спасибо вам большое!

Теги:
web-scraping
phantomjs
google-login
casperjs

2 ответа

0

Каспер использует PhantomJS, а сам Phantom не может войти в учетную запись google. Кажется, что любая функция ES6, не поддерживаемая в phantomjs, терпит неудачу.

Возможно, вам больше повезет с бета-версией phantomjs 2.5. Во всяком случае, phantomjs устарел в пользу хром без головы. Как сказал призрачный сопровождающий Виталий Слободин https://groups.google.com/forum/#!topic/phantomjs/9aI5d-LDuNE

Хорошая новость заключается в том, что вы можете запускать хром в режиме без /opt/google/chrome/chrome --headless --disable-gpu --repl: /opt/google/chrome/chrome --headless --disable-gpu --repl и делать все, что хотите.

Вы можете заменить --repl на --remote-debugging-port=9224 чтобы управлять им в любом удаленном коде, например, в узле... Есть библиотеки для управления им, как phantomjs. Высокий уровень (например, фантом): https://github.com/GoogleChrome/puppeteer и более низкие уровни, чтобы иметь больше контроля: https://github.com/cyrus-and/chrome-remote-interface#clientdomainmethodparams-callback

В настоящее время мне не повезло с кукловодом, но с chrome-remote-интерфейсом я смог войти в аккаунт google.

const CDP = require('chrome-remote-interface');
const argv = require('minimist')(process.argv.slice(2));
const file = require('fs');

// CLI Args
const url = argv.url || 'https://accounts.google.com';
const format = argv.format === 'jpeg' ? 'jpeg' : 'png';
const viewportWidth = argv.viewportWidth || 1440;
const viewportHeight = argv.viewportHeight || 900;
let delay = argv.delay || 0;
const userAgent = argv.userAgent;
const fullPage = argv.full;

// Start the Chrome Debugging Protocol
CDP(async function(client) {
  // Extract used DevTools domains.
  const {DOM, Emulation, Network, Page, Runtime} = client;

  // Enable events on domains we are interested in.
  await Page.enable();
  await DOM.enable();
  await Network.enable();

  // If user agent override was specified, pass to Network domain
  if (userAgent) {
    await Network.setUserAgentOverride({userAgent});
  }

  // Set up viewport resolution, etc.
  const deviceMetrics = {
    width: viewportWidth,
    height: viewportHeight,
    deviceScaleFactor: 0,
    mobile: false,
    fitWindow: false,
  };
  await Emulation.setDeviceMetricsOverride(deviceMetrics);
  await Emulation.setVisibleSize({width: viewportWidth, height: viewportHeight});

  // Navigate to target page
  await Page.navigate({url});

  // Wait for page load event to take screenshot
  Page.loadEventFired(async () => {
    // If the 'full' CLI option was passed, we need to measure the height of
    // the rendered page and use Emulation.setVisibleSize
    if (fullPage) {
      const {root: {nodeId: documentNodeId}} = await DOM.getDocument();
      const {nodeId: bodyNodeId} = await DOM.querySelector({
        selector: 'body',
        nodeId: documentNodeId,
      });
      const {model: {height}} = await DOM.getBoxModel({nodeId: bodyNodeId});

      await Emulation.setVisibleSize({width: viewportWidth, height: height});
      // This forceViewport call ensures that content outside the viewport is
      // rendered, otherwise it shows up as grey. Possibly a bug?
      await Emulation.forceViewport({x: 0, y: 0, scale: 1});
    }

    let expr="document.querySelector('input[type=email]').value='[email protected]';";
    expr+="document.querySelectorAll('div[role=button]')[0].click();";
    setTimeout
    let x=await Runtime.evaluate({expression: expr});
    console.log('******' + JSON.stringify(x));
    setTimeout(async function(){
    expr="document.querySelector('input[type=password]').value='YOUR_PASSWORD';";
    expr+="document.querySelectorAll('div[role=button]')[1].click()";
    x=await Runtime.evaluate({expression: expr});
    console.log('******' + JSON.stringify(x));
    x=await ( async function() {
            let expr="document.querySelector('input[type=password]')";
            return Runtime.evaluate({expression: expr});
    })()
    console.log('**' + JSON.stringify(x));
    }, 2000);
delay=5000
    setTimeout(async function() {
      const screenshot = await Page.captureScreenshot({format});
      const buffer = new Buffer(screenshot.data, 'base64');
      file.writeFile('output.png', buffer, 'base64', function(err) {
        if (err) {
          console.error(err);
        } else {
          console.log('Screenshot saved');
        }
        client.close();
      });
    }, delay);
  });
}).on('error', err => {
  console.error('Cannot connect to browser:', err);
});

Ссылки: https://medium.com/@dschnr/using-headless-chrome-as-an-automated-screenshot-tool-4b07dffba79a

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#browserwsendpoint

https://developers.google.com/web/updates/2017/04/headless-chrome

0

Я также пытаюсь сделать то же самое, и я обнаружил, что клик работает с this.click('#identifierNext'); и загрузчики Google начинают работать. если вы используете следующий код после нажатия на скриншоты, вы можете увидеть загрузчик, но после этого вместо перехода на экран "Пароль" он возвращается на экран электронной почты.

Код скриншота

this.wait(200, function(){
    this.capture('1.jpg',{
        top: 0,
        left: 0,
        width: 4608, 
        height: 3456,
        quality:20
    });
});
this.wait(100, function(){
    this.capture('2.jpg',{
        top: 0,
        left: 0,
        width: 4608, 
        height: 3456,
        quality:20
    });
});
this.wait(100, function(){
    this.capture('3.jpg',{
        top: 0,
        left: 0,
        width: 4608, 
        height: 3456,
        quality:20
    });
});
this.wait(100, function(){
    this.capture('4.jpg',{
        top: 0,
        left: 0,
        width: 4608, 
        height: 3456,
        quality:20
    });
});

Но я также не могу выйти на экран "Пароль", если с этой помощью вы можете прийти с любой идеей, дайте мне знать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню