2010-03-11 128 views
19

如何才能在卷曲保持会话?如何在cURL中保持会话在php中?

我有一个代码发送一个网站的登录详细信息,并成功登录 我需要在该网站维持会话继续。

这里是我的代码,用于登录到该网站使用卷曲

<?php 
     $socket = curl_init(); 
     curl_setopt($socket, CURLOPT_URL, "http://www.XXXXXXX.com"); 
    curl_setopt($socket, CURLOPT_REFERER, "http://www.XXXXXXX.com"); 
    curl_setopt($socket, CURLOPT_POST, true); 
    curl_setopt($socket, CURLOPT_USERAGENT, $agent); 
    curl_setopt($socket, CURLOPT_POSTFIELDS, "form_logusername=XXXXX&form_logpassword=XXXXX"); 
    curl_setopt($socket, CURLOPT_COOKIESESSION, true); 
    curl_setopt($socket, CURLOPT_COOKIEJAR, "cookies.txt"); 
    curl_setopt($socket, CURLOPT_COOKIEFILE, "cookies.txt"); 
    $data = curl_exec($socket); 
    curl_close($socket); 
    ?> 

回答

2

既然你指的是cookie.txt的文件,而无需任何引用到一个文件夹我的第一个猜想是,你试图写入不可写的文件夹中的文件。所以首先检查一下你是否真的找到了一个cookies.txt文件,以及它是否包含你期望的会话cookie。

+0

感谢您的快速重播 文件夹包含cookie.txt的文件,会议,这是writble与权限777 – 2010-03-11 12:22:16

+0

它是空的吗? Curl将会话cookie视为未过期。如果不是,请先尝试截断它。你也应该设置CURLOPT_FOLLOWLOCATION以确保你完成登录 – symcbean 2010-03-11 14:21:59

0

我可能会移动代码到一个函数。成功登录后,您现在已将会话与cookie.txt文件中的cookie相关联。在后续请求中,请继续使用该cookie文件,并且您应该在该站点上有有效的会话。

11

这里是我发现做到这一点link的最佳方式:

文本波纹管是blogpost的内容的“混音”版本:

$useragent = $_SERVER['HTTP_USER_AGENT']; 
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/'; 

session_write_close(); 

$ch = curl_init(); 
$ch = curl_init($rssFeedLink); 
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_USERAGENT, $useragent); 
curl_setopt($ch, CURLOPT_COOKIE, $strCookie); 

$response = curl_exec($ch); 
curl_close($ch); 

是什么session_write_close()办?它结束当前会话并存储会话数据。显然,PHP不喜欢多个脚本在会话中玩耍,所以它会锁定它。把session_write_close放在你的当前会话中,以便你可以检索并使用它。

,如果你不使用session_write_close()一个新的会话ID,将产生的,而不是使用当前会话ID。

PHPSESSID应替换为会话变量的名称。据OWSAP recommandations它应该是更普遍喜欢ANID

有时你需要发送一个用户代理与岗位,所以我包括CURLOPT_USERAGENT参数。

8

这是你如何用CURL

//initial request with login data 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php'); 
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36'); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name'); //could be empty, but cause problems on some hosts 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp'); //could be empty, but cause problems on some hosts 
$answer = curl_exec($ch); 
if (curl_error($ch)) { 
    echo curl_error($ch); 
} 

//another request preserving the session 

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile'); 
curl_setopt($ch, CURLOPT_POST, false); 
curl_setopt($ch, CURLOPT_POSTFIELDS, ""); 
$answer = curl_exec($ch); 
if (curl_error($ch)) { 
    echo curl_error($ch); 
} 

我已经看到了这个在ImpressPages