2016-02-12 61 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,浏览,你是真正的世界用户)