phantomjs page evaluate callback

262
30 июля 2017, 10:44

Есть функция на phantomJS:

    var page = require('webpage').create();
var system = require("system");
var args = system.args;
var email = args[1];
var password = args[2];
var wallet_id = args[3];
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0';
function login() {
    page.open('https://site.com/login', function () { 
        page.includeJs('https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js', function () {            
            page.evaluate(function(email, password){                
                var captcha = document.querySelector('.g-recaptcha');
                //IF CAPTCHA
                if (captcha) {                  
                    var sitekey = captcha.getAttribute('data-sitekey');
                    //query params for anti-captcha
                    var task = {"type":"NoCaptchaTaskProxyless",
                    "websiteURL":"https://site.com/login",
                    "websiteKey": sitekey};
                    var clientKey = 'ключ';
                    var not_json = {'clientKey':clientKey, 'task':task};
                    var json_data = JSON.stringify(not_json);
                    setTimeout(function(){
                        $.ajax({
                            method: 'post',
                            data: json_data,
                            dataType: 'json',
                            url: 'https://api.anti-captcha.com/createTask',
                            success: function(data){
                                if (data.taskId) {
                                    var time = 0;
                                    //check anti-captcha answer for creating task
                                    var interval = setInterval(function(){                                      
                                        var j = {"clientKey":"key","taskId":data.taskId};
                                        var j = JSON.stringify(j);
                                        $.ajax({
                                            //ajax query to anticaptcha service
                                            success: function(data){
                                                if (data.status == 'ready') {
                                                    clearInterval(interval);
                                                    //HERE IS LOGGIN IN 
                                                    document.querySelector('#g-recaptcha-response').textContent = data.solution.gRecaptchaResponse;                                             
                                                    document.querySelector("[name='password']").value = password;                                                  
                                                    document.querySelector("[name='email']").value = email;                                                 
                                                    document.querySelector("[type='submit']").click();
                                                }
                                            }
                                        });
                                        time+=5;
                                    }, 5000);
                                }
                            }
                        });
                    }, 3500);
                } 
                //IF THERE S NO CAPTCHA, JUST LOGGIN IN
                else {              
                    document.querySelector("[name='password']").value = password;                                                  
                    document.querySelector("[name='email']").value = email; 
                    document.querySelector("[type='submit']").click();
                }
            }, email, password);
        });//includeJs
    }); //open
}
function wallet() {
    var url = "https://site.com/account";
    page.open(url, function (status) {
        //check #btn exists on this URL (bool) (for check user login)       
        var progressing = page.evaluate(function () {
            return document.querySelector("#btn");
        });
        //if #btn, do that
        if (progressing) {
            page.open('https://site.com/account', function (status) { 
                page.evaluate(function(){
                    //here is some action with account
                });                 
                setTimeout(function(){  
                    //print result, exit script
                    console.log('1:'+email);
                    phantom.exit();
                }, 10000); 
            });
            //if #btn doesnt exists on DOM
        } else {
            //print result, finish script
            phantom.exit();
        }
    });
}
//login in() 
login();
//timeout for wallet()
setTimeout(function(){
    wallet();
}, 150000);

Как известно из документации к phantomJS, page.evaluate = sandbox функция, из нее нельзя получить другие объекты.

Проблема данного скрипта в том, что при наличии капчи, скрипт делает запрос к сервису антикапчи, который может вернуть ответ как через 5 секунд, так и через 100. Моя задача - сделать так, чтобы на login() сделать callback функцию wallet(), сейчас же (в самом низу кода) сделано так, что сначала вызывается login(), а через 150 секунд wallet(). Это не совсем правильно, поэтому хочу узнать, как правильно это сделать? Если сделать функцию, которая будет в коде идти после page.evaluate(), то я получу сначала выполнение этой функции, а затем уже выполнение page.evaluate(), что в данной ситуации неприемлимо. Как быть, что делать?

READ ALSO
не уставливается gulp-sass

не уставливается gulp-sass

Добрый день Проблема: не могу установить gulp-sass в готовой сборке gulpгуглил, пробовал разные варианты

454
Платежные системы на сайте

Платежные системы на сайте

Ради интереса хочю спросить а какие платежные системы используют порносайты? Наколько я знаю в се сайты подобной тематики действуют не законно,...

264
При достижении цели параллаксировать

При достижении цели параллаксировать

Доброго времени суток! Ребята, помогите, возможно это банально, но я не вкурю как это сделать

229
Список языков для веб-сайта

Список языков для веб-сайта

У меня в разработке веб-сайт, основаный на переводах слов с разных языков в другиеПроблема что это будет по сути максимально открытый словарь,...

384