2016-02-12 200 views
-1

我需要創建一個腳本,用於發出HTTP請求並模擬瀏覽器在管理cookie時的行爲。這意味着它可以訪問該'頁面'設置的所有cookie(所以服務器設置cookie,異步客戶端設置cookie,每個域的cookie)。如何實現網站的cookies刮板?

我的意思是,使用控制檯檢查頁面,我可以查看該頁面上所有域的所有Cookie。

enter image description here

我想辦法做到這一點從我的代碼。 我幾乎可以肯定,我必須以某種方式運行頁面的JavaScript和模擬DOM行爲(思考在node.js腳本中使用jsDom)。

但是,但是。仍然有許多疑問。任何關於如何通過模擬瀏覽器行爲攔截所有cookie的建議?

任何有關如何實施它的建議將非常感激。

爲那些誰擁有時間
我對如何實現它的一個奇怪的想法: 會是有意義的超負荷處理HTTP響應XHR對象的函數的原型(我的意思做類似的東西:this),檢查所有客戶端加載的cookie?
我需要它在任何頁面上工作,甚至那些不使用本機XMLHttpRequest對象的頁面。對此有何建議?

回答

1

瀏覽器只是發送HTTP請求到服務器,你不一定需要加載一個DOM。如果您可以對您要發送的請求進行逆向工程,則可以輕鬆地嘲笑網頁或工作流程的行爲。當您使用PHP的cURL發送請求時,您需要將cookie存儲在cookie jar中以維護跨請求的cookie。像這樣的東西應該讓你開始:

function load($url, $postData = array()) 
{ 
    $useragent = "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36"; 

    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($curl, CURLOPT_HEADER, FALSE); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 
    curl_setopt($curl, CURLOPT_ENCODING, 'UTF-8'); 
    curl_setopt($curl, CURLOPT_USERAGENT, $useragent); 
    curl_setopt($curl, CURLOPT_POST, !empty($postData)); 
    if(!empty($postData)) curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); 
    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieFile); 
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookieFile); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); 
    $page = curl_exec ($curl); 
    curl_close ($curl); 

    return $page; 
} 

如果你想運行一個無頭的瀏覽器維持餅乾cookie罐,我會建議像PhantomJS。然後,您可以加載頁面和頁面的上下文中執行代碼:

"use strict"; 
var page = require('webpage').create(); 

page.onConsoleMessage = function(msg) { 
    console.log(msg); 
}; 

page.open("http://phantomjs.org/", function(status) { 
    if (status === "success") { 
     page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 
      page.evaluate(function() { 
       console.log("$(\".explanation\").text() -> " + $(".explanation").text()); 
      }); 
      phantom.exit(0); 
     }); 
    } else { 
     phantom.exit(1); 
    } 
}); 

的代碼可以在Github上找到:https://github.com/ariya/phantomjs/blob/master/examples/phantomwebintro.js

+0

但JavaScript的也可以設置Cookie,不它呢? 在這種情況下,我需要模擬DOM行爲 – Morrisda

+0

是的,JavaScript可以設置cookie。但是,您可以反向設置設置了哪些cookie,並根據請求手動設置它們。我只是指出,像刮環境一樣的瀏覽器可能會很昂貴,而且不具有可擴展性。 –

+0

我真的不需要它是可擴展的,但精確。 有關如何實施您的解決方案的任何建議? (反向生成cookie設置) – Morrisda

0

一些研究之後,我鑽進了以下結論:

餅乾設置通過服務器,將響應的標題設置爲客戶端的請求,並從客戶端的JavaScript中設置。 由服務器設置的Cookie在設置時很容易被檢測到。但客戶端cookie不太容易被檢測到,因爲您必須模擬dom並執行頁面的JavaScript。 因此,如果您想檢查設置到網站中的所有cookie,唯一的方法是運行javascript並模擬DOM,然後檢查發送的每個異步請求。

我建議你phantom.js或者乾脆使用Chrome遠程調試協議(簡單地得到了谷歌瀏覽器的cookies,瀏覽,你是真正的世界用戶)