Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PhantomJS持久cookie和Javascript_Javascript_Node.js_Cookies_Phantomjs - Fatal编程技术网

PhantomJS持久cookie和Javascript

PhantomJS持久cookie和Javascript,javascript,node.js,cookies,phantomjs,Javascript,Node.js,Cookies,Phantomjs,一天中的大部分时间我都在苦苦挣扎。简而言之,我正试图通过Node.js模块使用PhantomJS登录Amazon。我的问题的简短版本是,亚马逊给我一条消息,说使用该网站需要cookies 这是我目前的资源 最后一个问题特别有趣,因为第一个答案是针对用户代理的(我至少尝试了3或4次,结果相同),而第二个答案指向我认为可能是我的问题。简而言之,Amazon可能试图通过javascript设置测试cookie,然后检查cookie是否设置成功,以确定用户是否允许cookie。我可以成功地确认我

一天中的大部分时间我都在苦苦挣扎。简而言之,我正试图通过Node.js模块使用PhantomJS登录Amazon。我的问题的简短版本是,亚马逊给我一条消息,说使用该网站需要cookies

这是我目前的资源

最后一个问题特别有趣,因为第一个答案是针对用户代理的(我至少尝试了3或4次,结果相同),而第二个答案指向我认为可能是我的问题。简而言之,Amazon可能试图通过javascript设置测试cookie,然后检查cookie是否设置成功,以确定用户是否允许cookie。我可以成功地确认我的cookie文件正在创建中,并且Amazon已经在文件中设置了cookie,但是在提交登录表单时,这些显然是不够的,因为在下一页我会被cookie警告阻止。这让我相信最后一个问题中的用户是对的——我的页面的Javascript没有启动,尽管我试图确保它是正确的

最后,my page.render显示一条Amazon消息,说我需要继续启用Cookie。这是我的密码

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
  phantom = require('phantom'),
  // Admin = mongoose.model('Admin'),
  Item = mongoose.model('Item'),
  config = require('../config/config');


/*
 * Check function.
 */
module.exports.check= function() {
  var loadInProgress = false,
    interval = '',
    testindex = 0,
    cookiePath = __dirname + 'cookies.txt',
    url = 'https://www.amazon.com/ap/signin?_encoding=UTF8&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Faffiliate%2Dprogram.amazon.com%2Fhome',
    tag = config.defaultAffiliateTag,
    periodType = 'preSelected',
    preSelectedPeriod = 'yesterday',
    // url2 is for order data
    url2 = 'https://affiliate-program.amazon.com/home/reports/table.json?query%5Btype%5D=orders&query%5Bstart_date%5D=2016-05-28&query%5Bend_date%5D=2016-06-26&query%5Btag_id%5D=189318233&query%5Bdevice_type%5D=all&query%5Blast_accessed_row_index%5D=0&query%5Bcolumns%5D=title%2Casin%2Ccategory%2Cclicks%2Cconversion%2Cseller%2Cdqty%2Cnqty%2Cqty&query%5Bskip%5D=0&query%5Bsort%5D=asin&query%5Blimit%5D=25&store_id=XXXX',
    // url3 is for earnings data
    url3 = 'https://affiliate-program.amazon.com/home/reports/table.json?query%5Btype%5D=earnings&query%5Bstart_date%5D=2016-05-28&query%5Bend_date%5D=2016-06-26&query%5Btag_id%5D=189318233&query%5Bdevice_type%5D=all&query%5Blast_accessed_row_index%5D=0&query%5Bcolumns%5D=title%2Casin%2Cseller%2Cprice%2Crate%2Cqty%2Crevenue%2Cearnings%2Cdevicetype&query%5Bskip%5D=0&query%5Bsort%5D=asin&query%5Blimit%5D=25&store_id=XXXX';

  phantom.create([/* '--debug=true', */ '--ignore-ssl-errors=true', '--ssl-protocol=any', '--web-security=false', '--cookies-file=' + cookiePath]).then(function(ph) {
    ph.createPage().then(function(page) {

      page.on('onLoadStarted', function() {
        loadInProgress = true;
      });

      page.on('onLoadFinished', function(response) {
        if (response === 'success') {
          loadInProgress = false;
        } else {
          console.log('Phantom page failed to load.');
        }
      });

      page.on('onError', function(msg, trace) {
        var msgStack = ['ERROR: ' + msg];
        if (trace && trace.length) {
          msgStack.push('TRACE:');
          trace.forEach(function(t) {
            msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
          });
        }
        console.error(msgStack.join('\n'));
      });

      page.on('onResourceError', function(resourceError) {
        console.log('= onResourceError()');
        console.log('  - unable to load url: "' + resourceError.url + '"');
        console.log('  - error code: ' + resourceError.errorCode + ', description: ' + resourceError.errorString);
        loadInProgress = false;
      });

      var steps = [
        // Step 1
        function() {
          // Load the initial login page.
          console.log('--- JAVASCRIPT ---')

          // This is where I try to ensure my page has Javascript Enabled.
          // val outputs true here.
          page.setting('javascriptEnabled').then(function(val) {
            console.log('val: ' + val);
            page.setting('settings.userAgent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36');
            loadInProgress = true;
            page.open(url);
          })
        },
        // Step 2
        function() {
          // Update username/password.
          page.evaluate(function() {
            document.getElementById('ap_email').value = 'XXXX';
            document.getElementById('ap_password').value = 'XXXX';
          });
        },
        // Step 3
        function() {
          // Login.
          loadInProgress = true;
          page.evaluate(function() {
            document.forms['signIn'].submit();
          });
        },
        // Step 4
        function() {
          loadInProgress = true;
          page.open(url2);
        }
      ];

      var interval = setInterval(function() {
        if (!loadInProgress && typeof steps[testindex] === 'function') {
          steps[testindex]();
          console.log('Test Index: ' + (testindex + 1));
          page.render('config/images/step' + (testindex + 1) + '.png');
          testindex++;
        }
        if (typeof steps[testindex] !== 'function') {
          clearInterval(interval);
          setTimeout(function() {
            ph.exit();
          }, 5000);
        }
      }, 50);
    });
  });
};
我得到的结果是以下输出:

    --- JAVASCRIPT ---
    Test Index: 1
    val: true
    Test Index: 2
    Test Index: 3
    Test Index: 4
    = onResourceError()
      - unable to load url: "https://sentry.amazon.com/SSO/redirect?response_typ
e=id_token&client_id=affiliate-program.amazon.com%3A443&redirect_uri=https%3A%2F
%2Faffiliate-program.amazon.com%3A443%2Fhome%2Freports%2Ftable.json%3Fquery%255B
type%255D%3Dorders%26query%255Bstart_date%255D%3D2016-05-28%26query%255Bend_date
%255D%3D2016-06-26%26query%255Btag_id%255D%3D189318233%26query%255Bdevice_type%2
55D%3Dall%26query%255Blast_accessed_row_index%255D%3D0%26query%255Bcolumns%255D%
3Dtitle%252Casin%252Ccategory%252Cclicks%252Cconversion%252Cseller%252Cdqty%252C
nqty%252Cqty%26query%255Bskip%255D%3D0%26query%255Bsort%255D%3Dasin%26query%255B
limit%255D%3D25%26store_id%3XXXX&scope=openid&nonce=5d8a3f10bb3746c799
a05a927b0204f3c0629d5c8c5646bb49ccdcd93f07247e&sentry_handler_version=TomcatSSOF
ilter-1.1-1"
      - error code: 5, description: Operation canceled
    Phantom page failed to load.

有人能告诉我我可能遗漏了什么吗?

这似乎是PhantomJS 2.1.1(由NPM模块实现的版本)或NPM模块本身的问题

我使用Horseman和PhantomJS 2.0.0完全重写了脚本,并很快使其正常工作。对于未来的子孙后代,以下是工作实现。我对Horseman只有一天的了解,而且我已经喜欢上了比我使用过的任何其他幻影包装更干净的链式实现

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
  Horseman = require('node-horseman'),
  phPath = __dirname + '\\phantomjs-2.0.0-windows\\bin\\phantomjs.exe',
  Item = mongoose.model('Item'),
  config = require('../config/config');


/*
 * Check function.
 */
module.exports.updateItems = function() {
  var cookiePath = __dirname + 'cookies.txt',
    url = 'https://www.amazon.com/ap/signin?_encoding=UTF8&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Faffiliate%2Dprogram.amazon.com%2Fhome',
    tag = config.defaultAffiliateTag,
    periodType = 'preSelected',
    preSelectedPeriod = 'yesterday',
    // url2 is for order data
    url2 = 'https://affiliate-program.amazon.com/home/reports/table.json?query%5Btype%5D=orders&query%5Bstart_date%5D=2016-05-28&query%5Bend_date%5D=2016-06-26&query%5Btag_id%5D=189318233&query%5Bdevice_type%5D=all&query%5Blast_accessed_row_index%5D=0&query%5Bcolumns%5D=title%2Casin%2Ccategory%2Cclicks%2Cconversion%2Cseller%2Cdqty%2Cnqty%2Cqty&query%5Bskip%5D=0&query%5Bsort%5D=asin&query%5Blimit%5D=25&store_id=XXXX',
    // url3 is for earnings data
    url3 = 'https://affiliate-program.amazon.com/home/reports/table.json?query%5Btype%5D=earnings&query%5Bstart_date%5D=2016-05-28&query%5Bend_date%5D=2016-06-26&query%5Btag_id%5D=189318233&query%5Bdevice_type%5D=all&query%5Blast_accessed_row_index%5D=0&query%5Bcolumns%5D=title%2Casin%2Cseller%2Cprice%2Crate%2Cqty%2Crevenue%2Cearnings%2Cdevicetype&query%5Bskip%5D=0&query%5Bsort%5D=asin&query%5Blimit%5D=25&store_id=XXXX';

  var horseman = new Horseman({
    cookiesFile: cookiePath,
    ignoreSSLErrors: true,
    sslProtocol: 'any',
    webSecurity: false,
    timeout: 15000,
    phantomPath: phPath
  });

  horseman
    .userAgent('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36')
    .authentication('XXXX', 'XXXX')
    .on('consoleMessage', function(msg) {
      console.log(msg);
    })
    .on('error', function(msg, trace) {
      var msgStack = ['ERROR: ' + msg];
      if (trace && trace.length) {
        msgStack.push('TRACE:');
        trace.forEach(function(t) {
          msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
        });
      }
      console.error(msgStack.join('\n'));
    })
    .open(url)
    .screenshot('config/images/step1.png')
    .waitForSelector('#ap_email')
    .value('#ap_email', 'XXXX')
    .waitForSelector('#ap_password')
    .value('#ap_password', 'XXXX')
    .screenshot('config/images/step2.png')
    .click('#signInSubmit')
    .waitForNextPage()
    .screenshot('config/images/step3.png')
    .open(url2)
    .screenshot('config/images/step4.png')
    .plainText()
    .then(function(txt) {
      console.log('Page results: ');
      console.dir(txt);
      return;
    })
    .open(url3)
    .screenshot('config/images/step5.png')
    .plainText()
    .then(function(txt) {
      console.log('Page results: ');
      console.dir(txt);
      return;
    })
    .close();
};

祝你好运

我最近也遇到了同样的问题,简单的解决办法是将用户添加到新创建的网页中。如果您使用的是模块,那么下面是代码


page.setting(“userAgent”,“此处为您的用户代理”)

很有趣!如果必须有if/then/else逻辑决策,如何处理骑士链接脚本?@Vaviloff提出了一个很好的问题。Horseman有一个
do
函数(),它允许您在不破坏链的情况下运行任意函数。据我所知,结果将传递给链中的下一个函数,因此您将运行
.do(function(){return stuff;})相当圆滑。