2011-08-09 32 views
0

所以我有一个脚本,通过一个URL作为get参数传递,因此试图将该页面的内容写入文件。在未经过验证的页面上,它工作正常,但当我尝试在需要验证的页面上使用它时,它会中断。PHP cURL到已经登录的认证站点

具体来说,这些是我已经登录到的页面,所以我假定做一个标准的cURL请求,所有我当前设置的cookie都可以工作,但事实并非如此。最初,我收到了一个302响应,但如果将'FOLLOWLOCATION'设置为true,我最终会在该网站的登录页面而不是我想要的页面。

$client = curl_init(); 

//curl_setopt($client, CURLOPT_HEADER, true); 
curl_setopt($client, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($client, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($client, CURLOPT_URL, $pageToLoad);  

/* Supposedly libcurl loads all cookies auto-magically if you don't set CURL_COOKIESESSION 
if (isset($_SERVER['HTTP_COOKIE'])) { 
    curl_setopt($client, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']); 
} 
*/ 

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

我有我需要设置一个cookiejar文件,这个工作(“下沉”,因为我的脚本没有开发服务器上的写权限)下沉的感觉,但你有什么想法?

编辑: 那么,是那种白痴的,原来我有一些写访问......反正,我的主目录,在那里我已经验证了我的脚本可以写做了一个临时文件夹:

$fname = '/home/temp/cookies.txt'; 
if($save = fopen($fname, 'w')) { 
    fwrite($save, 'testing'); 
} 

运行脚本,然后低下,'测试'出现在第一行。
我已经添加了下面两行到我的卷曲要求:

curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/temp/cookies.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/home/temp/cookies.txt'); 

并没有什么在我的情况已经改变。 cookies.txt文件仍然只是说'测试',并没有存储任何cookie,'最后访问'时间也没有改变,这对我来说意味着这些行不做任何事情。

还有什么想法?我有点难过:\

+0

是的,如果您希望这种验证形式正常工作,您需要使用提供给您的任何cookie进行所有后续请求。 – Brad

+0

你有权访问请求服务器的源? – bensiu

+0

不,我没有访问请求的服务器 – wolv2012

回答

0

于是我拿出原始卷曲码我曾和来自不同项目的一些Zend的特定代码复制,并似乎在大多数工作部分(不太确定为什么......)。我遇到的唯一其他问题是处理CoSign(http://cosign.sourceforge.net/)和使用代理cookie。感谢那些提供答案的人!

1

是的,你需要同时设置CURLOPT_COOKIEFILECURLOPT_COOKIEJAR选项。 '文件'版本是从哪里加载cookie。该jar是curl对象终止时应该保存cookie的地方。它们可以是相同的文件。

如果您没有在服务器上的写权限创建一个实际的文件(很奇怪,如果你没有,至少写上的/ tmp或同等烫发),则可以使用php://memorywrapper使用内存文件。

+0

cookiefile部分一直困惑着我。如果libcurl自动附加所有当前的cookie,为什么cookie文件是必需的?或者,它是否使libcurl加载在curl会话期间保存在cookiejar中的cookie? – wolv2012

+0

命令行curl可以将你的cookie文件写入标准的地方(例如'〜/ .cookies'或其他),但是在PHP curl中,所有的投注都是关闭的(应该在哪一个基于web的进程写一个永久文件?),你必须每次手动指定cookie文件的位置。 –

1

这里是我为这样的任务心爱的模式:

$loginUrl = 'http://www.remote_site.de/login.php'; 
$loginFields = array('username' => 'username', 'password' => 'password'); 

getUrl($loginUrl, 'post', $loginFields); 
//now you're logged in and a session cookie was generated 

$remote_page_content = getUrl('http://www.remote_site.de/some_page.php'); 


    function getUrl($url, $method='', $vars='') { 
    $ch = curl_init(); 
    if ($method == 'post') { 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); 
    } 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); 
    $buffer = curl_exec($ch); 
    curl_close($ch); 
    return $buffer; 
    } 
+0

是的。 cookiejar和cookiefile似乎是我需要的。谢谢! – wolv2012