1

基本上,我有一个登录网站并下载文件的脚本。非常坦率的。不幸的是,我的代码中缺少一些阻止它正常工作的东西。

当我运行它时,我会返回一个输出到我的文件的 html 页面,这正是我在没有登录的情况下尝试访问文件链接时在浏览器中得到的内容;访问被拒绝,您必须登录等。

但是,如果我通过注释掉文件下载请求来自行运行脚本的第一部分,然后重新运行整个脚本,我就可以按我应该的方式下载文件,所以我知道它正在运行感觉。当我运行整个脚本时,它似乎不想让我登录。

// Log me in

curl_setopt($handle, CURLOPT_URL, $login_url); 
curl_setopt($handle, CURLOPT_REFERER, $admin_url);
curl_setopt($handle, CURLOPT_COOKIEJAR, $Cookie_Location);
curl_setopt($handle, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt($handle, CURLOPT_TIMEOUT, 60); 
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); 

// Grab the file

curl_setopt($handle, CURLOPT_URL, $csv_loc);
curl_setopt($handle, CURLOPT_FILE, $csv_handle); 

echo $response = curl_exec($handle);

curl_close($handle);

所以我可以登录,然后重新运行脚本并下载文件,但我不能同时做这两个。我尝试了各种不同的附加 curl 选项,例如 COOKIEJAR 和 COOKIEFILE,以及 FOLLOWLOCATION 和 REFERER,这是我对我的代码为什么不起作用的唯一预感。我的“抓取文件”代码中的某些内容要么破坏了我的登录,要么表现得就像我没有登录一样。

编辑:已解决。

我决定包括解决方案,以便其他人避免我犯的同样错误。

我需要做的就是分开我的请求,就像这样;

// Log me in

curl_setopt($handle, CURLOPT_URL, $login_url); 
curl_setopt($handle, CURLOPT_REFERER, $admin_url);
curl_setopt($handle, CURLOPT_COOKIEJAR, $Cookie_Location);
curl_setopt($handle, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt($handle, CURLOPT_TIMEOUT, 60); 
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); 

echo $response = curl_exec($handle);

// Grab the file

curl_setopt($handle, CURLOPT_URL, $csv_loc);
curl_setopt($handle, CURLOPT_FILE, $csv_handle);

curl_exec($handle);

curl_close($handle);

首先 curl_exec 将我登录到该站点,然后第二个获取并下载我的文件。然后我只是关闭手柄。

4

1 回答 1

3

如果这正是您正在使用的代码,那么:

// Log me in
curl_setopt($handle, CURLOPT_URL, $login_url); 

// Grab the file
curl_setopt($handle, CURLOPT_URL, $csv_loc);

echo $response = curl_exec($handle);
curl_close($handle);

您正在重新定义您的 URL。您不能在一个请求中向一个 URL(登录)和一个 GET(获取文件)发送 POST,您需要为此发送 2 个单独的请求。

除非您的登录表单立即将文件作为响应返回给您。

于 2013-01-01T18:25:35.930 回答