PHP cURL持有会话cookie

时间:2015-04-17 12:01:08

标签: php session curl cookies

所以这很奇怪。我正在制作一个cURL登录脚本,我需要将我的cookie完全发送给cURL。但似乎cURL在内存中保留了旧cookie,即使cookie文件被完全截断也是如此。

在下面的输出中,请注意我尝试点击amazon.co.uk,但我以前来自amazon.com的Cookie仍然位于Cookie文件的顶部。这足以让亚马逊不让我登录。所以我需要新鲜的饼干。

现在,您看到的第一个cookie输出是起点。发生了什么每次我刷新页面。 即使最终的Cookie输出不是这个。它只是amazon.co.uk个Cookie。

其他Cookie是"工作"是因为在登录页面上,(你看到"需要干净的会话"。我正在呼叫curl_setopt($ch, CURLOPT_COOKIESESSION, true);只从文件中正确发送cookie。

但是在那之后,当我不再打电话时,它会回到这些存储的cookie。我不能每次都打电话给COOKIESESSION,因为我需要它记住要求请求的cookie。

所以基本上,我只需要一种方法来清除cookie的cURL内存,或者沿着这条线的东西。然后在你说'#34;删除文件"你可以从输出中看到我正在清除cookie文件。

string(125706) "
string(78) "https://sellercentral.amazon.co.uk/gp/fba/core/data/collections/shipments.html"
string(12) "need to init"
string(1704) "# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.amazon.com TRUE    /   FALSE   1429875358  session-id-time 1429858800l
.amazon.com TRUE    /   FALSE   1429875358  session-id  181-0028548-4275101
.amazon.com TRUE    /   FALSE   1429875532  ubid-main   191-9297218-7050950
.amazon.com TRUE    /   FALSE   1429875358  session-token   cL5vcznqgzk2RwhZIFZjSepKiznVnNcdv1Uh/FiLV8i0QuxpPEEx5D94imjktXu69QOdfQuQX8chNhvB8sR9KI4ZgJBWWlMnFOepyO6/+wtH9GOtH+1WMZQKHp8fqGJlpMtT8XMwKUx+hnuYRPnheq54s5Q1fQX5HJ4wS3KE4UVHAady2H4ugSsIi+O33zL1d3eWN4TnbX4nxiHqIqFs4Q8GGCYVEwOrbcB1KH3FCohbrwQPXNN7igf6jQXI++h0N0dJTv781sU=
.amazon.com TRUE    /   FALSE   2059990558  x-main  "i6iLU3A?45qEpvgw@NNzGTsxqqOvwryX"
.amazon.com TRUE    /   TRUE    2059990557  at-main 5|7HZSLL/JbN/aGiGYXo/uxjxNFyLucyEmxBCKkR4QoU06R5NF4I1eNekoJpsyE2hkx5FrSI3dP5DuaolT5D48jdz6NLwDmYdKzovka+5DJTHuRuVmzBVVkW2g40uhZlRlaHJmewKWCjmoyi+azkQswRDRmfyAICX+hBrRfUwJRwQqeOhQGc6dujYHDBiv8nxcQFciY9G+7au3zYAGof+CepYeiWk4xuQmBLobVAci10frgDxdgV7OdJOSVaHz2UtykTQ+F4V4hNzFwclsv9ranLMSM5KH9tys
.amazon.com TRUE    /   TRUE    0   sess-at-main    "GR5GAfuX5U+vC3ayUz3LIUs7+o414SBlsEA1rVMyvvA="
.amazon.com TRUE    /   FALSE   2059990557  lc-main en_US
.amazon.co.uk   TRUE    /   FALSE   1429875575  session-id-time 1429858800l
.amazon.co.uk   TRUE    /   FALSE   1429875575  session-id  276-1602919-0207204
.amazon.co.uk   TRUE    /   FALSE   1429876234  ubid-acbuk  277-6716334-7531852
.amazon.co.uk   TRUE    /   FALSE   1429875881  session-token   gVQymTdZsxCD0I/aObEZCLmujDKZGjQ48lGc34xaW6i45XVIonC1YK014YrFqVvNG2qurp1xmGrtCHcuVQx2tSQ7LlYpr+srdgyKvj/pCcW6CxR0azqQsU9wYW3BxXqZnQDQnqVmYaGpY0eB19BOTShppMKGnPhzMkgy/UFVuoeGsngx0tz8iWFMy6qTZFqibPoMvFmpsdsL8GhbVn6sy++vUUBeQhVgyzktWEfjRXdzZw32t/SOCA==
"
string(21) "unexpected login page"
string(78) "https://sellercentral.amazon.co.uk/gp/fba/core/data/collections/shipments.html"
string(12) "need to init"
string(0) ""
string(25) "no cookies, need to login"
string(51) "https://sellercentral.amazon.co.uk/gp/homepage.html"
string(0) ""
string(28) "on login, need clean session"
string(44) "https://sellercentral.amazon.co.uk/ap/widget"
string(270) "# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.amazon.co.uk   TRUE    /   FALSE   1429876317  session-id-time 1429858800l
.amazon.co.uk   TRUE    /   FALSE   1429876317  session-id  278-1385775-5645645
"
string(112) "https://sellercentral.amazon.co.uk/gp/utilities/set-rainier-prefs.html?ie=UTF8&url=&marketplaceID=A1F83G8C2ARO7P"
string(1212) "# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.amazon.co.uk   TRUE    /   FALSE   1429876318  session-id-time 1429858800l
.amazon.co.uk   TRUE    /   FALSE   1429876318  session-id  278-1385775-5645645
.amazon.co.uk   TRUE    /   FALSE   1429876318  ubid-acbuk  279-4986453-7111520
.amazon.co.uk   TRUE    /   FALSE   1429876318  session-token   YpneIOOGKiqQ8x/E/soTTmUAym3tXUWGtjXKYWnAONOkcHENmQxMDD3zTWjgtLN9b/em0xBTPoYMpECUcR38rZlf2Vu1a2TOBNsi2hpTjageCvIM9noPlEq0TBrgdOEfGl354j0+dIfTHM4ObUF2nzY2UBubZoi3X77MBcpLel+rjjCFeTCwhmNFbru5dyalIRn1UyVAdsB3PIEk+saDDbf2HRMUFP7hdaCaBhKwb5tpyvpA1xrk2XJXm2dre2FE1MKsgWFwt1c=
.amazon.co.uk   TRUE    /   FALSE   2059991518  x-acbuk 3IkDIKmc71d9lKFefDy7ATw1QKYl8545
.amazon.co.uk   TRUE    /   TRUE    2059991518  at-acbuk    "5|/QlP2Fp+YlPLm1O0znctkujc6sMDGnEGxbqVjtrNehg2P98QG1vCFOkKxChCaUJzPmQSS4C/87WM0XC30721BVwFLpKRa9FIS9sUtlZJh8m07RHhC2vBspsYjZ710LfM/cHCHKXdBmXlHZ8CLNO55ff4oYRI5NnaFKu8dx2xSBdwAzYydTqlQhrOKE0RAolHBJgIVngWDlw42kDY79FOciZP7ray/qSR/eceAPfJfzIV0t/vKC/vWpNlOQBs/FTmvWmEMZtSoAUWlgPeIiUw+g=="
.amazon.co.uk   TRUE    /   TRUE    0   sess-at-acbuk   "9EziH1irfB0flBfODA2zw+lVgvo4OmENH4XM3kxEnpg="
.amazon.co.uk   TRUE    /   FALSE   2059991518  lc-acbuk    en_US

1 个答案:

答案 0 :(得分:1)

更新

遇到问题时,我经常将FOLLOWLOCATION设为false:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

如果有重定向,您可以看到正在发生的事情,并且需要获取在重定向网址的响应标头中设置的Cookie,然后FOLLOWLOCATION必须设置为false。

当curl网址转到重定向curl_getinfo时,会获得重定向位置网址。

$status = intval(curl_getinfo($ch,CURLINFO_HTTP_CODE));
if ($status > 299 && $status < 400){
  $url= curl_getinfo($ch,CURLINFO_REDIRECT_URL );
}
// update cookies, do not clear `cookies()`;

当它变得困难时,我使用这些选项来获取响应和响应标头。响应标题将返回curl_exec()数据。请求标题将由curl_getinfo()

返回
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, true);


$data = curl_exec($ch);
if (curl_errno($ch)){
    $data .= 'Retreive Base Page Error: ' . curl_error($ch);
}
else {
  $info = rawurldecode(var_export(curl_getinfo($ch),true));
  $data = curl_exec($ch);
  $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
  $requestHeader= substr($data,0,$skip);
  $data =  substr($data,$skip);
  $filename = parse_url($url, PHP_URL_HOST);
  $filename .= parse_url($url, PHP_URL_PATH) . '.txt';
  $fp = fopen($filename,'w');
  fwrite($fp,$info\n$data");
  fclose($fp);

  $data =  substr($data,$skip);
}

标题和HTML都存储在文件中。然后,您可以查看HTTP标头,HTML和JavaScript。有时cookie由JavaScript document.cookie设置,或者使用window.location重定向的页面,或者使用JS单击HTML表单的提交按钮。在这些情况下,可能需要刮掉饼干和/或从卷曲数据中重定向位置。


然后我使用FireFox Inspector或Chrome开发工具。

我转到网络标签页

在FireFox中,我转到“设置”并启用“#34;启用持久性日志&#34;
” 在Chrome中,我点击&#34;保存日志&#34;在网络选项卡上

然后我使用浏览器去任何我想要卷曲的地方。

现在我可以看到每个请求和响应,包括重定向,并将它们与保存标题进行比较。


当您需要标题看起来与保存的浏览器标题完全相同时:

创建一个数组以放置请求标头键值
使用您上传的Request标头中的确切内容填写Request数组 示例:

$request = array();
$request[] = "Host: www.example.com";
$request[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$request[] = "User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0";
$request[] = "Accept-Language: en-US,en;q=0.5";
$request[] = "Connection: keep-alive";
$request[] = "Cache-Control: no-cache";
$request[] = "Pragma: no-cache";

添加到卷曲:

curl_setopt($ch, CURLOPT_HTTPHEADER, $request);

很多时候,使用移动版本要容易得多。很多时候,桌面版本页面需要JavaScript而移动版本则不需要。我使用FireFox与用户代理切换器使用旧的Motorola用户代理来检索标头和HTML。然后我在curl的HTTPHEADER

中使用相同的用户代理
request[] = 'User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0

更新结束


我觉得curl的饼干有问题,所以我写了自己的例行程序 为此CURLOPT_HEADER必须为真。

 curl_setopt($ch, CURLOPT_HEADER, true);

  $data = curl_exec($ch);
  $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
  $requestHeader= substr($data,0,$skip);
  $data =  substr($data,$skip);
  $e = 0;
  while(true){
    $s = strpos($requestHeader,'Set-Cookie: ',$e);
    if (!$s){break;}
    $s += 12;
    $e = strpos($requestHeader,';',$s);
    $cookie = substr($requestHeader,$s,$e-$s) ;
    $s = strpos($cookie,'=');
    $key = substr($cookie,0,$s);
    $value = substr($cookie,$s);
    $cookies[$key] = $value;
  }

然后使用$ cookies []:

 $cookie = '';
 $show = '';
 $delim = '';
 foreach ($cookies as $k => $v){
   $cookie .= "$delim$k$v";
   $delim = '; ';
 }

然后使用$ cookie:

curl_setopt($ch, CURLOPT_COOKIE, $cookie );