我们如何在cURL中维护会话?
我正在使用代码发送站点的登录详细信息并成功登录 我需要在网站上维护会话才能继续。这是我用于使用cURL
登录网站的代码 <?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);
?>
答案 0 :(得分:15)
以下是我发现这样做的最佳方式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 也应替换为会话变量的名称。根据{{3}},它应该更像 anId 。
有时您需要发送一封包含CURLOPT_USERAGENT
参数的用户代理。
答案 1 :(得分:12)
这是您使用会话进行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上看过这个
答案 2 :(得分:2)
由于你所指的是一个cookies.txt文件而没有任何对文件夹的引用,我首先想到的是你试图写入一个不可写的文件夹中的文件。因此,首先检查您是否确实找到了一个cookies.txt文件,如果它包含您期望的会话cookie。
答案 3 :(得分:0)
我可能会将该代码移动到一个函数中。成功登录后,您现在拥有与cookie.txt文件中的cookie相关联的会话。在后续请求中,只需继续使用该cookie文件,您就应该在该站点上拥有有效的会话。