如何从远程URL抓取cookie并将其发送回浏览器

时间:2013-12-04 02:00:14

标签: php android cookies

我正在构建一个简单的php代理,用于缓存响应头和对象。

我的问题是,如果我登录youtube.com然后我不会看到自己因为我已经签名并且youtube一直说登录(未签名),但如果我停止我的脚本并打开youtube.com网站然后我看到我自己签了名。我认为这是一个cookie问题。是吗?

我的脚本只需抓取响应标头并将其发送回浏览器。当我使用fopen()下载对象时,谷歌的一些网站“Play STore”& “Apple Store”继续发送HTTP 403(Forbidden),即使我通过$ _SERVER ['HTTP_USER_AGENT']捕获客户端的用户代理并将其附加到$ context function stream_context_create()..仍然没有运气!。

我在响应标题中看到了这样的标题Set-Cookie所以我想如果我使用header()将其发送回浏览器那么它就会被解决..仍然没有运气。

这是我抓取标题并将其发送回浏览器的方式:

  
    

这就是我获取客户端请求的cookie的方法     $ requested_cookie = $ _COOKIE;

  
  $requested_cookie = $_COOKIE;
  $ua=  $_SERVER['HTTP_USER_AGENT'];
  ini_set('user_agent', $ua);
  $md5_fname = md5($fname);
  $filehead = $file_path."/HTTP_HEADER/".$md5_fname.".txt";
if (file_exists($filehead)) 
{

 $handle = fopen($filehead, "r");
 $contents = fread($handle, filesize($filehead));
 $getCachedH = unserialize($contents);
 fclose($handle);
 foreach ($getCachedH as $cHead)
 {
     $sendHead = $cHead;
     $getHead = strtoupper($cHead);
     //file_put_contents("$file_path/ghassan.txt", "\n $sendHead \n" ,FILE_APPEND);
     if ( preg_match('/CONTENT-LENGTH: (\d+)/i',$getHead,$clm) ) $content_length = $clm[1];
     if ( preg_match('/CONTENT-TYPE: ([\/\w\-\d]+)/i',$getHead,$ctm) ) $content_type = $ctm[1];
     if ( preg_match('/LOCATION: (.*)/i',$cHead,$lm) ) 
     {
         $header_location = $lm[1];
         header("Location: ".$header_location);
         exit;
     }
     if ( preg_match('/^HTTP\/1\.[01] (\d\d\d)/i', $getHead, $hcm ) ) 
     {
         $http_code = $hcm[1];

     }
     header($sendHead);
  }
 }
else
{
     $opts = array(
      'http'=>array(
       'ignore_errors'=>"true",
       'method'=>"GET",
       'header'=>"Cookie: foo=bar\r\n"
       )
      );

     $context = stream_context_create($opts);
     $urlptr = fopen($_GET['url'],'rb', false, $context);
     $headers = $http_response_header;
     $http_code = $headers[0];
     if($http_code=="200")
     {
         // We grab the Response Headers and save them 
         file_put_contents($filehead, serialize($headers));
     }

     foreach ($headers as $response_header)
     {
         $sendHead = $response_header;
         $getHead = strtoupper($response_header);
         header($sendHead);
         if ( preg_match('/CONTENT-LENGTH: (\d+)/i',$getHead,$clm) ) $content_length = $clm[1];
         if ( preg_match('/CONTENT-TYPE: ([\/\w\-\d]+)/i',$getHead,$ctm) ) $content_type = $ctm[1];
        if ( preg_match('@Set-Cookie: (([^=]+)=[^;]+)@i', $sendHead , $cookm))
         {
           $sCookies = $cookm[1];
           //file_put_contents("$file_path/cookies.txt", "\n $cookm[0], $url \n" ,FILE_APPEND);
         }
         if ( preg_match('/LOCATION: (.*)/i',$sendHead,$lm) ) 
         {
             $header_location = $lm[1];
             header("Location: ".$header_location);
             exit;
         }
         if ( preg_match('/ACCEPT-RANGES: ([\w\d\-]+)/i',$getHead,$arm) ) $accept_ranges = $arm[1];
         if ( preg_match('/^HTTP\/1\.[01] (\d\d\d)/i', $getHead, $hcm ) ) 
         {
             $http_code = $hcm[1];
         } 

      }
  }
  • 是否有一个函数在一次调用中抓取响应头+对象并将它们一起存储在一个文件中?我不想在脚本的顶部使用fopen()因为Apache或Php在读取字符串时如$ handler = fopen($ urlptr,'r');然后它连接远程URL即使我没有调用字符串!这增加了延迟。

  • 当我通过我的脚本从Play商店下载文件时,如果我已经发送Android设备的用户代理,是否有通过我的php脚本访问客户端cookie的解决方案以及如何解决403禁止消息? 。

谢谢

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题。

当我抓住每个网站的远程标题时..标题已经有了Set-Cookie标题,所以我将它们重新发送回浏览器并从$ _COOKIE捕获cookie并使用fopen()添加cookie似乎解决了我所有的问题上方。

谢谢