не удается войти в Gmail по неизвестной причине - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь войти в мою почту с кукловодом, чтобы снизить риск повторения

вот мой код

    await page.goto('https://accounts.google.com/AccountChooser?service=mail&continue=https://mail.google.com/mail/', {timeout: 60000})
        .catch(function (error) {
            throw new Error('TimeoutBrows');
        });

    await page.waitForSelector('#identifierId' , { visible: true });
    await page.type('#identifierId' , 'myemail');
    await Promise.all([
        page.click('#identifierNext') ,
        page.waitForSelector('.whsOnd' , { visible: true })
    ])
    await page.type('#password .whsOnd' ,  "mypassword");
    await page.click('#passwordNext');
    await  page.waitFor(5000);

но я всегда получаю это сообщение

enter image description here

Я даже пытался просто открыть окно входа с помощью кукловода и вручную заполнить форму входа, но даже это не удалось.

Я что-то упустил?

Когда я смотрю в консоль, сразу после входа в систему происходит сбой вызова ajax.

Request URL: https://accounts.google.com/_/signin/challenge?hl=en&TL=APDPHBCG5lPol53JDSKUY2mO1RzSwOE3ZgC39xH0VCaq_WHrJXHS6LHyTJklSkxd&_reqid=464883&rt=j
Request Method: POST
Status Code: 401 
Remote Address: 216.58.213.13:443
Referrer Policy: no-referrer-when-downgrade


)]}'

[[["er",null,null,null,null,401,null,null,null,16]
,["e",2,null,null,81]
]]

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Цель вопроса - войти в Gmail. Я поделюсь другим методом, который не включает заполнение полей электронной почты и пароля в сценарии кукловода и работает в режиме headless: true.

Метод

  • Войдите в свой gmail, используя обычный браузер (предпочтительно в Google Chrome)
  • Экспорт всех файлов cookie для вкладки Gmail
  • Используйте page.setCookie для импорта файлов cookie в ваш экземпляр кукловода

Войти в Gmail

Это не должно быть ежу понятно.

Экспорт всех файлов cookie

Я буду использовать расширение под названием Редактировать этот файл cookie , однако вы можете использовать другие расширения или ручные методы для извлечения файлов cookie.

Щелкните значок браузера, а затем нажмите кнопку Экспорт .

Импорт файлов cookie в экземпляр кукловода

Мы сохраняем файлы cookie в файле cookies.json, а затем импортируем их с использованием функции page.setCookie до навигации . Таким образом, когда страница Gmail загружается, она сразу же получает информацию для входа.

Код может выглядеть следующим образом.

const puppeteer = require("puppeteer");
const cookies = require('./cookies.json');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  // Set cookies here, right after creating the instance
  await page.setCookie(...cookies);
  // do the navigation, 
  await page.goto("https://mail.google.com/mail/u/0/#search/stackoverflow+survey", {
    waitUntil: "networkidle2",
    timeout: 60000
  });
  await page.screenshot({ path: "example.png" });
  await browser.close();
})();

Результат:

Примечания:

Это не спрашивалось, но я должен упомянуть следующее для будущих читателей.

  • Срок действия файлов cookie : файлы cookie могут быть недолговечными и вскоре после этого истекать, работать на разных устройствах по-разному. Выход из системы на исходном устройстве также приведет к выходу из кукловода, так как он делится файлами cookie.
  • Двухфакторный : Я еще не уверен насчет аутентификации 2FA. Он не спрашивал меня о 2FA, вероятно, потому что я вошел в систему с того же устройства.
1 голос
/ 16 июня 2019

Я проверил ваш код, и он кажется правильным, несмотря на некоторые селекторы. Кроме того, мне пришлось добавить пару тайм-аутов, чтобы все заработало. Однако мне не удалось воспроизвести вашу проблему, поэтому я просто опубликую код, который работал для меня.

const puppeteer = require('puppeteer');

(async () => {

    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();

    await page.goto('https://accounts.google.com/AccountChooser?service=mail&continue=https://mail.google.com/mail/', {timeout: 60000})
        .catch(function (error) {
            throw new Error('TimeoutBrows');
        });

    await page.screenshot({path: './1.png'});
    ...

})();

Обратите внимание, что я запускаю браузер в обычном, а не в автономном режиме. Если вы посмотрите на скриншот с этой позиции, вы увидите, что это правильная форма входа в Google Google login form after the first step

Остальная часть кода отвечает за ввод пароля

const puppeteer = require('puppeteer');

(async () => {

    ...
    await page.waitForSelector('#identifierId', {visible: true});
    await page.type('#identifierId', 'my@email');
    await Promise.all([
        page.click('#identifierNext'),
        page.waitForSelector('.whsOnd', {visible: true})
    ]);

    await page.waitForSelector('input[name=password]', {visible: true});
    await page.type('input[name=password]', "my.password");

    await page.waitForSelector('#passwordNext', {visible: true});
    await page.waitFor(1000);
    await page.click('#passwordNext');
    await page.waitFor(5000);

})();

Обратите также внимание на некоторые отличия от вашего кода - поле выбора пароля отличается. Мне пришлось добавить await page.waitForSelector('#passwordNext', {visible: true}); и небольшой тайм-аут после этого, чтобы кнопка могла быть успешно нажата.

Я протестировал весь код выше, и он успешно работал. Пожалуйста, дайте мне знать, если вам все еще нужна помощь или у вас проблемы с моим примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...