2017-01-31 3 views
0

У меня проблема с PhantomJS, которая представляет собой изображения, которые, по-видимому, являются более старой версией текущего сайта. Это Google Alerts. Мне нужно изменить опцию «Доставить на» и установить «RSS», но в глазах PhantomJS сайт не имеет этой опции.Изменение userAgent с PhantomJS не решает проблему старого сайта

Image of Google Alerts rendered by PhantomJS

Я получил предложение модифицировать userAgent, но я пробовал много способов, и там ничем не отличается от оказанного результата.

page.settings.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' 

Весь мой сценарий.

'use strict' 

var page = require('webpage').create(), 
    isLoaded, 
    controller, 
    isSubmitted = false 

page.viewportSize = { width: 1920, height: 1080 } 
page.settings.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' 

page.open('https://www.google.com/alerts', function() { 

    isLoaded = true 
}) 

page.onLoadStarted = function() { 
    log('Loading page...') 
} 

page.onLoadFinished = function(status) { 
    log('Page has loaded.') 

    if (status !== 'success') { 
    log('The page has failed to load.') 
    exit() 
    } else { 
    if (isSubmitted) { 
     log('Submitted!') 
     clear() 
     exit() 
    } else { 
     controller = setInterval(function() { 
     if (isLoaded) { 
      isLoaded = false 
      fillUpInputField('input', 'PhantomJS') 
     } else { 
      selectRSSOption() 
     } 
     }, 1500) 
    } 
    } 
} 

page.onError = function(msg, trace) { 
    log(msg) 

    trace.forEach(function(item) { 
    log(' ', item.file, ':', item.line) 
    }) 
} 

// ------------------------------------------------------------------------------------------------- 
// Methods 
// ------------------------------------------------------------------------------------------------- 
function exit() { 
    phantom.exit() 
} 

function log(str) { 
    console.log(str) 
} 

function render(name) { 
    page.render(name + '.png') 
} 

function fillUpInputField(selector, query) { 
    page.evaluate(function(selector) { 
    document.querySelector(selector).focus() 
    }, selector) 
    page.sendEvent('keypress', query) 

    render('fill_up_form.png') 
    log('Rendered fill_up_form.png') 
} 

function selectRSSOption() { 
    page.evaluate(function() { 
    document.querySelector('.show_options').click() 
    }) 

    render('show_options.png') 
    log('Rendered show_options.png') 
} 
+0

Вы пытались использовать фантом, чтобы сделать несколько скриншотов, чтобы подтвердить свое подозрение? – OregonTrail

+0

Да, конечно, загруженное мной изображение берется с 'render' из PhantomJS. Проверьте www.google.com/alerts, заполните вход, нажмите «показать параметры», и вы увидите разницу: есть один дополнительный параметр, который не отображается в показанном здесь изображении. – mfgabriel92

ответ

1

Причина этого несоответствия довольно прост: Оповещения Google не имеет опции «доставка» до тех пор, пока пользователь не будет подписан в учетную запись Google.

Попробуйте открыть страницу в режиме инкогнито в том же Chrome:

enter image description here

Итак, для того, чтобы заставить его работать в PhantomJS вам необходимо войти в Google первым. Используйте аргумент CLI --cookies-file.txt, чтобы перенести куки между сценариями, чтобы вы могли входить только один раз в месяц.

/path/to/phantomjs --cookies-file=cookies.txt /script/to/run.js 
+0

Ах! Это связано с тем, что пользователь не вошел в систему. Это приложение будет использоваться другими людьми. Рекомендуете ли вы так же, как и файлы cookie для входа в оповещения? – mfgabriel92

+0

Все зависит от архитектуры вашего приложения, пожалуйста, расскажите об этом подробнее. Будет ли PhantomJS использоваться так, как есть? Или внутри настольного приложения? Или на сервере в качестве бэкэнд-сервиса? Я не уверен, но, может быть, лучше открыть еще один вопрос, чтобы обсудить все это. – Vaviloff

+0

Это приложение для Facebook, построенное с помощью NodeJS. Он имеет API-интерфейс AdonisJS, и там будет находиться операция для выполнения этой задачи. Я узнал модуль Horseman, который запускает PhantomJS с узлом. – mfgabriel92

Смежные вопросы