0

私は、これはnodejsアプリをcasperjs使用しています:https://github.com/narainsagar/node-casperjs-aws-lambdaexports.handlerの中にラップされたときに、このコードがLambdaでエラーになるのはなぜですか?

を私はローカルで動作するように私のコードを得そしてラムダにアップロードするとき、私は私がしてからデータを渡すことができるようにexports.handler内の私のコードをラップする必要がありましたAPIゲートウェイからの関数。 (私はすでにこのアプリケーションを使用していない他の関数でこれを行います。)exports.handlerの中に自分のコードを置くと失敗します。私はラムダ内のテストイベントにイベントデータを追加してテストし、ハードコーディングを試みました。私のコードがexports.handlerの中にあると、どちらも失敗します。 exports.handlerがこのコードを壊しているのはなぜですか?

操作コードW/O exports.handler:exports.handler内部失敗

var ua = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1' 
var casper = require('casper').create({ 
    viewportSize: {width: 768, height: 1024}, 
    userAgent: ua 
}); 
var login = {email: '[email protected]', pw: 'fakepw'} 
var usrObj = { 
    succ: {}, 
    err: [] 
}; 

//exit function 
function exit() { 
    setTimeout(function() { 
     casper.exit(); 
     casper.bypass(1); 
    }, 10); 
} 
//success & error message function 
function message(dat) { 
    if (dat === 'credentials') { 
     console.log('Error: Login credentials are missing'); 
     return exit(); 
    } 
    else if (dat) { 
     console.log(dat); 
     return exit(); 
    } 

    if (usrObj['err'].length > 0) { 
     console.log('Error not empty...'); 
     console.log(usrObj.err); 
     return exit(); 
    } 
    else if (usrObj['succ']) { 
     console.log('Success not empty...'); 
     console.log(JSON.stringify(usrObj.succ)); 
     return exit(); 
    } 

} 

//trim login credentials 
login.email = login.email.trim(); 
login.pw = login.pw.trim(); 

if (login.email && login.pw) { 

    casper.start('https://vimeo.com/log_in'); 
    casper.waitForSelector('form#login_form', 
     function success() { 
      this.echo(this.getCurrentUrl()); 
      this.sendKeys('form#login_form input[name="email"]', login.email); 
      this.sendKeys('form#login_form input[name="password"]', login.pw); 
      this.click('form#login_form input[type=submit][value="Log in with email"]'); 
     }, 
     function fail() { 
      message('Error with Vimeo [page not loading]') 
     } 
    ); 
    casper.waitForSelector('#page_header>h1>a', 
     function success() { 
      this.echo(this.getCurrentUrl()); 
      usrObj['succ']['uname'] = this.getHTML('span.topnav_user_name'); 
      usrObj['succ']['profile'] = this.getElementAttribute('li.topnav_user_profile>a', 'href'); 
      var test = []; 
      if (!usrObj.succ.uname) {test.push('Username not retrieved')} 
      if (!usrObj.succ.profile) {test.push('Profile link not retrieved')} 
      if (test.length > 0) {message(test.join('<br />'));} 
      //else {message();} 
     }, 
     function fail() { 
      message('Login not successful'); 
     } 
    ); 
    casper.thenOpen('https://vimeo.com/staceydavidgearz', 
     function success() { 
      this.echo('Stacey David Profile: ' + this.getTitle()); 
      this.echo(this.getCurrentUrl()); 
      var finish = function() { 
       usrObj['succ']['foll'] = true; 
       message(); 
      } 
      //var foll = this.getHTML('button[data-fatal-attraction="container:profile_page|component:follow"] > span'); 
      var foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox'); 
      if (foll === '0 0 10 10') { 
       this.click('button[data-fatal-attraction="container:profile_page|component:follow"]'); 
       setTimeout(function() { 
        foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox'); 
        if (foll === '0 0 10 10') { 
         message('Can\'t follow SD'); 

        } 
        else {finish();} 
       }, 250); 
      } 
      else { 
       finish(); 
      } 
     }, 
     function fail() { 
      message('Not going to Stacey David profile page.'); 
     } 
    ); 

    casper.run(); 
} 
else {message('credentials');} 

コード:

var ua = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'; 

var casper = require('casper').create({ 
    viewportSize: {width: 768, height: 1024}, 
    userAgent: ua//, 
    //verbose: true, 
    //logLevel: 'debug' 
}); 

exports.handler = function (event, context) { 

    var login = {}; 
    var usrObj = { 
     succ: {}, 
     err: [] 
    }; 
    //exit function 
    var exit = function() { 
     setTimeout(function() { 
      casper.page.close(); 
      casper.exit(); 
      casper.bypass(1); 
     }, 10); 
    }; 
    //success & error message function 
    var message = function(dat) { 
     if (dat === 'credentials') { 
      usrObj['err'].push('Error: Login credentials are missing'); 
     } 
     else if (dat) { 
      usrObj['err'].push(dat); 
     } 

     if (usrObj['err'].length > 0) { 
      console.log('Error not empty...'); 
      console.log(JSON.stringify(usrObj.err)); 
      context.fail(JSON.stringify(usrObj.err)); 
      return exit(); 
     } 
     else if (usrObj['succ']) { 
      console.log('Success not empty...'); 
      console.log(JSON.stringify(usrObj.succ)); 
      context.succeed(JSON.stringify(usrObj.succ)); 
      return exit(); 
     } 
    }; 

    //trim login credentials 
    login.email = event.email; 
    login.pw = event.pw; 

    if (login.email && login.pw) { 

     casper.start('https://vimeo.com/log_in'); 
     casper.waitForSelector('form#login_form', 
      function success() { 
       this.echo(this.getCurrentUrl()); 
       this.sendKeys('form#login_form input[name="email"]', login.email); 
       this.sendKeys('form#login_form input[name="password"]', login.pw); 
       this.click('form#login_form input[type=submit][value="Log in with email"]'); 
      }, 
      function fail() { 
       message('Error with Vimeo [page not loading]') 
      } 
     ); 
     casper.waitForSelector('#page_header>h1>a', 
      function success() { 
       this.echo(this.getCurrentUrl()); 
       usrObj['succ']['uname'] = this.getHTML('span.topnav_user_name'); 
       usrObj['succ']['profile'] = this.getElementAttribute('li.topnav_user_profile>a', 'href'); 
       var test = []; 
       if (!usrObj.succ.uname) {test.push('Username not retrieved')} 
       if (!usrObj.succ.profile) {test.push('Profile link not retrieved')} 
       if (test.length > 0) {message(test.join('<br />'));} 
       //else {message();} 
      }, 
      function fail() { 
       message('Login not successful'); 
      } 
     ); 
     casper.thenOpen('https://vimeo.com/staceydavidgearz', 
      function success() { 
       this.echo('Stacey David Profile: ' + this.getTitle()); 
       this.echo(this.getCurrentUrl()); 
       var finish = function() { 
        usrObj['succ']['foll'] = true; 
        message(); 
       } 
       var foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox'); 
       if (foll === '0 0 10 10') { 
        this.click('button[data-fatal-attraction="container:profile_page|component:follow"]'); 
        setTimeout(function() { 
         foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox'); 
         if (foll === '0 0 10 10') { 
          message('Can\'t follow SD'); 

         } 
         else {finish();} 
        }, 250); 
       } 
       else { 
        finish(); 
       } 
      }, 
      function fail() { 
       message('Not going to Stacey David profile page.'); 
      } 
     ); 

     casper.run(); 
    } 
    else {message('credentials');} 
}; 

ラムダ反応:

ボディ

[] 

ログ:

Calling casperJS: /var/task/node_modules/casperjs/bin/casperjs [ '/var/task/casperjs-script.js' ] { PHANTOMJS_EXECUTABLE: '/var/task/phantomjs' } 
child process exited with code 1 
+0

は私がcasper.handlerするexports.handlerを変更し、それまでの時間がなくなります。私がログをすぐに上に置く前に、 – TDave00

+0

このアプリのindex.jsファイルを掘り下げた後に発見したもの。 http://stackoverflow.com/questions/42152784/how-to-retrieve-event-data-of-exports-handler-from-another-script – TDave00

答えて

0

casperコンポーネントで依存関係「node_modules」もアップロードしてください。 ラムダ実行でrequireのコンポーネントが見つからないため、エラーが発生します。

+0

そのアプリは、すべての依存関係を圧縮してアップロードします。私がexports.handlerの中に自分のコードをラップしていないときに働いていると言ったので、それは依存関係の問題だとは思わない。 – TDave00

+0

アイデアですが、casper.jsが実行可能ファイルを「/ var/task/phantomjs」の「http://phantomjs.org/download.html」からインストールしようとしています。この理由から、すべての依存関係ラムダ実行時にlambaコンテナに実行ファイルがインストールされていないと、エラー –

+0

が表示されます。ログ全体: 'START RequestId:963d81c2-ef0f-11e6-9512-b12f2c1aac99バージョン:$ LATEST 2017-02-09T21:34:51。289Z \t 963d81c2-ef0f-11e6-9512-b12f2c1aac99 \t casperJS:/ var/task/node_modules/casperjs/bin/casperjs ['/var/task/casperjs-script.js']の呼び出し{PHANTOMJS_EXECUTABLE: '/ var/task/phantomjs'} 2017-02-09T21:34:52.513Z \t 963d81c2-ef0f-11e6-9512-b12f2c1aac99 \t子プロセスは、コード1つの ENDのRequestIdで終了:963d81c2-ef0f-11e6-9512-b12f2c1aac99 REPORTのRequestId:963d81c2- ef0f-11e6-9512-b12f2c1aac99 \t期間:1247.28 MS \t銘打た期間:1300ミリ秒\tメモリサイズ:256メガバイト使用さ\t最大メモリー:43メガバイト\t ' – TDave00

0

このリンクに従ってください:https://github.com/narainsagar/node-casperjs-aws-lambda/issues/6#issuecomment-279177650

こんにちは、あなたはキャスパーの引数のサポートを経由してスクラッパースクリプトにデータを渡すことができます:

は、このようなindex.jsファイル内runCasper機能のいくつかの変更を行います。

var childArgs = [ 
path.join(__dirname, scriptName), 
***@***.***', 
'--password=12345' 
]; 

とあなたのキャスパー・スクリプトの中で、あなたは下のこの ようなパラメータデータを取得することができます。

var utils = require('utils'); 

utils.dump(casper.cli.get('email')); 
utils.dump(casper.cli.get('password')); 
// OR 
// utils.dump(casper.cli.raw.get('email')); 
// utils.dump(casper.cli.raw.get('password')); 

・ホープ、このことができます。..

乾杯、

ナレイン

関連する問題