1

我在弄清楚如何运行多个 cURL 请求时遇到了一些困难,而且我不完全确定我做错了什么。可能是我编写的通过网络表单登录的代码不正确,但很难自行测试,因为我确实需要先运行第一个查询才能执行此操作。

这是我第一次查询的代码;

$handle = curl_init();

$login_user = 'user';
$login_pass = 'pass';

$username = 'username';
$password = 'password';

$postdata = "username=".$username."&password=".$password; 

curl_setopt($handle, CURLOPT_URL, 'http://somewebsiteexample.php');
curl_setopt($handle, CURLOPT_USERPWD, $login_user . ":" . $login_pass );
curl_setopt($handle, CURLOPT_POST, true);

curl_setopt($handle, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);

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

echo '<pre>';
print_r($response);
?>

这让我通过了基本的 http 身份验证。现在我需要能够通过将请求发布到 webform php 页面来登录该站点。

我已经看到很多如何做到这一点的例子,但只是他们自己的,而不是作为第二个 cURL 请求。

我拥有完成每个单独请求所需的所有信息,但我不确定如何将这两个请求组合在一起。我是否在同一个 cURL 会话中执行此操作?

我觉得我确实需要执行单独的 curl 初始化请求,并且我需要使用 CURLOPT_COOKIEJAR 通过 cookie 存储来自第一个请求的登录信息。(或者我可以在同一个 curl_init() 中运行我的第二个查询吗?)

如果是这种情况,我如何存储基本的 http 身份验证请求,以便下次初始化 curl 时,我已经登录到可以 POST 到 webform 的网站?一旦我知道如何执行多个 cURL 请求,我可能会弄清楚其余的部分。

我对 cURL 还很陌生(我仍然经常在网页上使用 file_get_contents()),所以我也有点不确定哪些 cURL 选项对于通过 webform 登录是绝对必要的。有些看起来很明显,而另一些则不然。这可能是我自己可以弄清楚的,但是很难找到一个可靠的使用 cURL 登录的教程,其中详细介绍了每个 CURLOPT 常量在该特定上下文中的作用。

php.net 手册有很多信息,虽然它确实告诉您各种 cURL 选项的关系,但它没有提供其具体用法的具体示例。如果有另一个资源站点可以让我更深入地解释 cURL,那也将不胜感激。

4

2 回答 2

3

登录是通过 cookie 处理的(假设它们不是通过 URL 参数处理的)。您需要做的是存储在对登录查询的响应中收到的 cookie,并在每次请求时将 cookie 发回。如果您使用存储接收到的 cookie 并CURLOPT_COOKIEJAR为每个请求加载cookie,cURL 可以为您自动执行此操作。只需将两个选项设置为同一个文件。CURLOPT_COOKIEFILE

于 2012-12-07T12:23:30.253 回答
2

您需要研究 curl 的调试方式。Curl 自然不会追踪任何东西,你需要在请求之后调用 for curl_error($curl)and curl_errno($curl),但是在资源关闭之前调用curl_close($curl).

您还需要跟踪curl_getinfo($curl)有关请求和响应的详细信息。确保您的空白页不是由脚本中的语法错误引起的。

下一部分。添加CURLOPT_COOKIEJARCURLOPT_COOKIEFILE用于 cookie 处理。在同一个 curl 资源上执行第二个请求,curl_close($curl)在所有请求完成后运行。Curl 保存了请求之间的大部分设置,所以不用担心。

我还建议添加用户代理和引用设置,以使您的请求看起来更自然。

于 2012-12-07T18:09:42.083 回答