Я использую 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. Ничего не работает.
У кого-то есть идея, как решить эту проблему? Спасибо вам большое!
Каспер использует 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
Я также пытаюсь сделать то же самое, и я обнаружил, что клик работает с 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
});
});
Но я также не могу выйти на экран "Пароль", если с этой помощью вы можете прийти с любой идеей, дайте мне знать.