2013-05-17 136 views
0

我一直在嘗試一段時間現在使用cURL登錄到eBay.co.uk. Cookie正在設置,發佈數據正在正確發送,但我不確定cookie文件正在被重新讀取,甚至無法正確設置,因爲我從eBay收到一個頁面,說我需要啓用cookie我的瀏覽器。cURL登錄ebay.co.uk

這裏是我使用的捲曲類:

class Curl { 
    private $ch; 
    private $cookie_path; 
    private $agent; 

    public function __construct($userId) { 
     $this->cookie_path = dirname(realpath(basename($_SERVER['PHP_SELF']))).'/cookies/' . $userId . '.txt'; 
     $this->agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)"; 
    } 

    private function init() { 
     $this->ch = curl_init(); 
    } 

    private function close() { 
     curl_close ($this->ch); 
    } 

    private function setOptions($submit_url) { 
     curl_setopt($this->ch, CURLOPT_URL, $submit_url); 
     curl_setopt($this->ch, CURLOPT_USERAGENT, $this->agent); 
     curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1); 
     //curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookie_path);   
     curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookie_path); 
    } 

    public function curl_cookie_set($submit_url) { 
     $this->init(); 
     $this->setOptions($submit_url); 
     $result = curl_exec ($this->ch); 
     $this->close(); 
     return $result; 
    } 

    public function curl_post_request($referer, $submit_url, $data) { 
     $this->init(); 
     $this->setOptions($submit_url); 
     $post = http_build_query($data); 
     curl_setopt($this->ch, CURLOPT_POST, 1); 
     curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); 
     curl_setopt($this->ch, CURLOPT_REFERER, $referer); 
     $result = curl_exec ($this->ch); 
     $this->close(); 
     return $result; 
    } 

    public function curl_clean() { 
     // cleans and closes the curl connection 
     if (file_exists($this->cookie_path)) { 
      unlink($this->cookie_path); 
     } 
     if ($this->ch != '') { 
      curl_close ($this->ch); 
     } 
    }  
} 

這裏是測試腳本,登錄細節是暴殄天物帳戶,因此隨時與他們進行測試:

$curl = new Curl(md5(1)); //(md5($_SESSION['userId'])); 
$referer = 'http://ebay.co.uk'; 
$submit_url = "http://signin.ebay.co.uk/aw-cgi/eBayISAPI.dll"; 

$data['userid'] = "VitoGambino-us"; 
$data['pass'] = "P0wqw12vi"; 
$data['MfcISAPICommand'] = 'SignInWelcome'; 
$data['siteid'] = '0'; 
$data['co_partnerId'] = '2'; 
$data['UsingSSL'] = '0'; 
$data['ru'] = ''; 
$data['pp'] = ''; 
$data['pa1'] = ''; 
$data['pa2'] = ''; 
$data['pa3'] = ''; 
$data['i1'] = '-1'; 
$data['pageType'] = '-1'; 


$curl->curl_cookie_set($referer); 
$result = $curl->curl_post_request($referer, $submit_url, $data); 

echo $result; 

以下是cookie文件內容:

# Netscape HTTP Cookie File 
# http://curl.haxx.se/rfc/cookie_spec.html 
# This file was generated by libcurl! Edit at your own risk. 

www.ebay.co.uk FALSE / FALSE 0 JSESSIONID BDE9B23B829CA7DF2CC4D5880F5173A6 
.ebay.co.uk TRUE / FALSE 0 ebay %5Esbf%3D%23%5Ecv%3D15555%5E 
.ebay.co.uk TRUE / FALSE 1431871451 dp1 bu1p/QEBfX0BAX19AQA**53776c5b^ 
#HttpOnly_.ebay.co.uk TRUE / FALSE 0 s CgAD4ACBRl4pbYjJjZDk1YTAxM2UwYTU2YjYzYzRhYmU0ZmY2ZjcyODYBSgAXUZeKWzUxOTYzOGI5LjMuMS43LjY2LjguMC4xuMWzLg** 
.ebay.co.uk TRUE / FALSE 1400335451 nonsession CgADLAAFRlj/jMgDKACBa/DpbYjJjZDk1YTAxM2UwYTU2YjYzYzRhYmU0ZmY2ZjcyODcBTAAXU3dsWzUxOTYzOGI5LjMuMS42LjY1LjEuMC4xhVUTMQ** 
.ebay.co.uk TRUE / FALSE 1526479451 lucky9 4551358 
+0

你知道他們有一個API,對吧?你爲什麼想通過cURL訪問eBay? – silkfire

+0

我知道eBay API,我知道它非常好,我需要捲入eBay才能執行API無法執行的操作。 –

回答

2

我能弄明白。

eBay使用一種非常棘手的方法登錄。它是Cookie,隱藏字段和成功登錄後的JavaScript重定向的組合。

下面是我解決它的方法。

新修改的類:

class Curl { 
    private $ch; 
    private $cookie_path; 
    private $agent; 

    // userId will be used later to keep multiple users logged 
    // into ebay site at one time. 
    public function __construct($userId) { 
     $this->cookie_path = dirname(realpath(basename($_SERVER['PHP_SELF']))).'/cookies/' . $userId . '.txt'; 
     $this->agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)"; 
    } 

    private function init() { 
     $this->ch = curl_init(); 
    } 

    private function close() { 
     curl_close ($this->ch); 
    } 

    // Set cURL options 
    private function setOptions($submit_url) { 
     $headers[] = "Accept: */*"; 
     $headers[] = "Connection: Keep-Alive"; 
     curl_setopt($this->ch, CURLOPT_URL, $submit_url); 
     curl_setopt($this->ch, CURLOPT_USERAGENT, $this->agent); 
     curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1); 
     curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers); 
     curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookie_path);   
     curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookie_path); 
    } 

    // Grab initial cookie data 
    public function curl_cookie_set($submit_url) { 
     $this->init(); 
     $this->setOptions($submit_url); 
     curl_exec ($this->ch); 
     echo curl_error($this->ch); 
    } 

    // Grab hidden fields 
    public function get_form_fields($submit_url) { 
     curl_setopt($this->ch, CURLOPT_URL, $submit_url); 
     $result = curl_exec ($this->ch); 
     echo curl_error($this->ch); 
     return $this->getFormFields($result); 
    } 

    // Send login data 
    public function curl_post_request($referer, $submit_url, $data) { 
     $post = http_build_query($data); 
     curl_setopt($this->ch, CURLOPT_URL, $submit_url); 
     curl_setopt($this->ch, CURLOPT_POST, 1); 
     curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); 
     curl_setopt($this->ch, CURLOPT_REFERER, $referer); 
     $result = curl_exec ($this->ch); 
     echo curl_error($this->ch); 
     $this->close(); 
     return $result; 
    }  

    // Show the logged in "My eBay" or any other page 
    public function show_page($submit_url) { 
     curl_setopt($this->ch, CURLOPT_URL, $submit_url); 
     $result = curl_exec ($this->ch); 
     echo curl_error($this->ch); 
     return $result; 
    } 

    // Used to parse out form 
    private function getFormFields($data) { 
     if (preg_match('/(<form name="SignInForm".*?<\/form>)/is', $data, $matches)) { 
      $inputs = $this->getInputs($matches[1]); 
      return $inputs; 
     } else { 
      die('Form not found.'); 
     } 
    } 

    // Used to parse out hidden field names and values 
    private 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; 
    } 

    // Destroy cookie and close curl. 
    public function curl_clean() { 
     // cleans and closes the curl connection 
     if (file_exists($this->cookie_path)) { 
      unlink($this->cookie_path); 
     } 
     if ($this->ch != '') { 
      curl_close ($this->ch); 
     } 
    }  
} 

在使用中的實際代碼:

$curl = new Curl(md5(1)); //(md5($_SESSION['userId'])); 
$referer = 'http://ebay.com'; 
$formPage = 'http://signin.ebay.com/aw-cgi/eBayISAPI.dll?SignIn'; 

// Grab cookies from main page, ebay.com 
$curl->curl_cookie_set($referer); 

// Grab the hidden form fields and then set UsingSSL = 0 
// Login with credentials and hidden fields 
$data = $curl->get_form_fields($formPage); 
$data['userid'] = ""; 
$data['pass'] = ""; 
$data['UsingSSL'] = '0'; 

// Post data to login page. Don't echo this result, there's a 
// javascript redirect. Just do this to save login cookies 
$formLogin = "https://signin.ebay.com/ws/eBayISAPI.dll?co_partnerId=2&amp;siteid=3&amp;UsingSSL=0"; 
$curl->curl_post_request($referer, $formLogin, $data); 

// Use login cookies to load the "My eBay" page, viola, you're logged in. 
$result = $curl->show_page('http://my.ebay.com/ws/eBayISAPI.dll?MyeBay'); 

// take out Javascript so it won't redirect to actualy ebay site 
echo str_replace('<script', '<', $result); 

我使用一些代碼貼here,感謝drew010

+0

你最好隱藏你的用戶名和密碼credintials – Umren

+0

這是我爲此所做的一次性帳戶,所以它真的沒關係。 –

+0

任何人都知道這是否仍然有效? – nmos