2015-10-12 9 views
6

को मैं इस वेबसाइट की खोज और गूगल लेकिन सिर्फ यह पता लगाने की कि यह कैसे काम करने के लिए प्राप्त करने के लिए नहीं कर पा रहे है। मैं एक PHP स्क्रिप्ट का उपयोग करके popads.net में लॉगिन करने की कोशिश कर रहा हूं, इसलिए मैं अपनी वेबसाइटों के लिए अपनी कमाई को एक पृष्ठ पर संकलित कर सकता हूं। लेकिन यह वेबसाइट मुझे परेशानी दे रही है। क्या कोई देख सकता है कि मैं क्या गलत कर रहा हूं?लॉग इन PopAds.net

<?php 
 
//username and password of account 
 
$username = 'myusername'; 
 
$password = 'mypassword'; 
 

 
//set the directory for the cookie using defined document root var 
 
$path = DOC_ROOT."/ctemp"; 
 

 
//login form action url 
 
$url="https://www.popads.net/users/login"; 
 
$postinfo = "data[User][username]=".$username."&data[User][password]=".$password; 
 

 
$cookie_file_path = $path."/cookie.txt"; 
 

 
$ch = curl_init(); 
 
curl_setopt($ch, CURLOPT_HEADER, false); 
 
curl_setopt($ch, CURLOPT_NOBODY, false); 
 
curl_setopt($ch, CURLOPT_URL, $url); 
 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
 

 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); 
 
//set the cookie the site has for certain features, this is optional 
 
curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0"); 
 
curl_setopt($ch, CURLOPT_USERAGENT, 
 
    "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"); 
 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
 
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']); 
 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 
 

 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
 
curl_setopt($ch, CURLOPT_POST, 1); 
 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo); 
 
curl_exec($ch); 
 

 
//page with the content I want to grab 
 
curl_setopt($ch, CURLOPT_URL, "https://www.popads.net/users/dashboard"); 
 
//do stuff with the info with DomDocument() etc 
 
$html = curl_exec($ch); 
 
echo $html; 
 
curl_close($ch);

+0

डाउनलोड WireShark है और एक नियमित रूप से लॉगिन कर सकते हैं। सुनिश्चित करें कि आप अनुरोध को कैप्चर करते हैं और इसे अपने PHP में फिर से चलाते हैं;) – GuyT

उत्तर

2

संपादित 03/26/2017

कुछ बिंदु पर, PopAds generate a check value लिए क्लाइंट पक्ष जावास्क्रिप्ट का उपयोग करने के लिए बंद कर दो सर्वर साइड एक AJAX अनुरोध से लिया गया वैरिएबल का उपयोग । यह बहुत आसान PHP में दोहराने के लिए लग रहा है लेकिन जब से जे एस आसानी से बदला जा सकता है, के चूहे-बिल्ली का खेल नहीं है और हमारे लिए जे एस को संभालने के लिए एक इंजन का उपयोग करते हैं।

यहाँ में प्रवेश करें और हम क्या जरूरत है पाने के लिए एक CasperJS स्क्रिप्ट चलाने के लिए कुछ PHP कोड है। सबसे पहले, आपको संगीतकार का उपयोग करके phpcasperjs/phpcasperjs इंस्टॉल करना होगा। तुम भी स्थापित NodeJS की आवश्यकता होगी, और स्थापित करने के लिए निर्देशिका निम्नलिखित मॉड्यूल जहां इस स्क्रिप्ट को चलाने के लिए योजना: npm install phantomjs ; npm install casperjs

<?php 

require_once 'vendor/autoload.php'; 

use Browser\Casper; 

define('POPADS_EMAIL', '[email protected]'); 
define('POPADS_PASS', 'your password'); 

$casper = new Casper(__DIR__ . '/node_modules/casperjs/bin/'); 

//$casper->setOptions(['engine' => 'slimerjs']); 
//$casper->setDebug(true); 

// change the UA! 
$casper->setUserAgent('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'); 

// navigate to google web page 
$casper->start('https://www.popads.net/'); 

// wait for text if needed for 3 seconds 
$casper->waitForText('Reset password', 5000); 

//data[User][username] 
//data[User][password] 


$casper->fillFormSelectors(
    'form.didEnabled', 
    array(
     'input#UserUsername' => POPADS_EMAIL, 
     'input#UserPassword' => POPADS_PASS, 
    ), 
    true 
); 

$casper->waitForText('</body>', 5000); 

$casper->capturePage(__DIR__ . '/login.jpg'); 

// run the casper script 
$casper->run(); 

// need to debug? just check the casper output 
//$output = $casper->getOutput(); 

$output = $casper->getHTML(); 

if (strpos($output, 'PopAds - Dashboard') !== false) { 
    echo "Logged in!"; 
} else { 
    echo "Login failed."; 

    var_dump($output); 
} 

यहाँ एक काम कर उदाहरण है। मैंने कोड में कुछ नोट्स जोड़े। यह अब काम नहीं करता है, संदर्भ के लिए छोड़ दिया।

बुनियादी प्रक्रिया है:

  • अनुरोध लॉगिन प्रपत्र पेज
  • निकालें "sid" प्रवेश फार्म से टोकन मान
  • निकालें फ़ॉर्म इनपुट
  • आबाद प्रपत्र अपनी प्रवेश जानकारी के साथ आदानों
  • लॉगिन पोस्ट अनुरोध भेजें
  • में लॉग इन होने के बाद परिणामी पृष्ठ से शेष राशि निकालें

और कोड:

<?php 

error_reporting(E_ALL);ini_set('display_errors', 1); 

// credentials 
$USERNAME = 'username'; 
$PASSWORD = 'password'; 

// login url 
$LOGINURL = 'https://www.popads.net/users/login'; 

// initialize curl 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_COOKIEFILE, ''); // empty file means curl will keep cookies for the lifetime of the handle 
// use cookiejar if you'd like to save the cookies for more than the request 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); 
curl_setopt($ch, CURLOPT_TIMEOUT, 120); 

// set URL and request (establishes cookies, gets login sid) 
curl_setopt($ch, CURLOPT_URL, $LOGINURL); 
$data = curl_exec($ch); 

// look for "sid" value on form action (required) 
preg_match('#/users/login\?sid=([\w\d]+)#', $data, $match); 
$sid  = $match[1]; 

// extract form fields from form 
$formFields = getFormFields($data); 

// set username and password 
$formFields['data[User][username]'] = $USERNAME; 
$formFields['data[User][password]'] = $PASSWORD; 

// build http post string 
$post_string = http_build_query($formFields); 

// update login url with sid value and post login form 
curl_setopt($ch, CURLOPT_URL, $LOGINURL . '?sid=' . $sid); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); 

// execute login request (should be logged in at this point) 
$result = curl_exec($ch); 

// get balance from page 
preg_match('#<h5>Current Balance:</h5>\s*<div class="overview overview_green">(.*?)</div>#is', $result, $balance); 
$balance = trim($balance[1]); 

// show balance 
echo "Your balance is $balance<br>"; 


function getFormFields($data) 
{ 
    if (preg_match('/(<form.*?id=.?UserLoginForm.*?<\/form>)/is', $data, $matches)) { 
     $inputs = getInputs($matches[1]); 

     return $inputs; 
    } else { 
     die('didnt find login form'); 
    } 
} 

function getInputs($form) 
{ 
    $inputs = array(); 

    $elements = preg_match_all('/(<input[^>]+>)/is', $form, $matches); 

    if ($elements > 0) { 
     for($i = 0; $i < $elements; $i++) { 
      $el = preg_replace('/\s{2,}/', ' ', $matches[1][$i]); 

      if (preg_match('/name=(?:["\'])?([^"\'\s]*)/i', $el, $name)) { 
       $name = $name[1]; 
       $value = ''; 

       if (preg_match('/value=(?:["\'])?([^"\'\s]*)/i', $el, $value)) { 
        $value = $value[1]; 
       } 

       $inputs[$name] = $value; 
      } 
     } 
    } 

    return $inputs; 
} 

आउटपुट:

आपकी शेष राशि $ 0.00

4

इस साइट के रूप में CSRF संरक्षण उपयोग कर रहा है, लॉगइन करने के लिए आपको सबसे पहले मूल रूप से CSRF टोकन प्राप्त और प्रवेश समाप्ति बिंदु को प्रवेश डेटा के साथ इस उत्तीर्ण करने की आवश्यकता के क्रम में। सीएसआरएफ टोकन में मुखपृष्ठ पर क्षेत्र का नाम data[_Token][key] है। साइट भी कुकी सेट कर सकते हैं जब यह सेट इस ताकि आप यदि आप इसे cURL से मिलता है कि कुकी डेटा वापस पारित करने के लिए की आवश्यकता होगी।

कहा गया है: मेरी सिफारिश अगर वे एक अधिकारी एपीआई है देखने के लिए है, और एक स्क्रैपर खुद कोडिंग से पहले, आप किसी भी नियम और शर्तें जिन्हें आप काली सूची में डाला हो सकता है breeching नहीं कर रहे हैं सुनिश्चित करें।

+0

मैंने डेटा [_Token] [key] के मूल्य को पास करने का प्रयास किया, हालांकि यह स्थिर है, जबकि मुझे लगता है कि आईडी क्या बदलती है, क्या होना चाहिए मैं गुजर रहा हूँ? – user2988034

+0

आपको उस कुकी को पास करने की आवश्यकता है जो भी सेट है, curl डिफ़ॉल्ट रूप से कुकीज़ नहीं रखेगा; आपको सत्र आईडी कैप्चर करना होगा और इसे वापस पास करना होगा। – mjsa

1

जोड़ें:

# Send previously received cookies. 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); 

CURLOPT_COOKIEJAR स्थापना केवल प्राप्त कुकीज़ बचाता है।

हटाएँ:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 

यह अगली पंक्ति जहां CURLOPT_POST सेट डुप्लिकेट।

अंत में, दूसरे पृष्ठ आप डाउनलोड कर रहे हैं (डैशबोर्ड) नियमित रूप से प्राप्त विधि के साथ दिलवाया जाना चाहिए। दूसरा curl_exec() कॉल करने से पहले इस जोड़ें:

curl_setopt($ch, CURLOPT_HTTPGET, true); 
संबंधित मुद्दे