将cURL命令转换为PHP cURL(Cookies)

时间:2017-01-24 20:34:30

标签: php curl

我需要将此cURL命令转换为PHP cURL代码:

curl -v -b session_cookies.txt -L -H "Content-Type: application/x-www-form-urlencoded" -v -d 'j_username=manager-sitelogin@gmail.com&j_password=site1' "https://login.uat.site.be/openid/login.do"

我试过这个,但它似乎没有用,我的结果一直是空的:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://login.uat.site.be/openid/login.do");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "j_username=manager-sitelogin@gmail.com&j_password=site1");
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = "Content-Type: application/x-www-form-urlencoded";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_COOKIEJAR, public_path().'/session_cookies.txt');

$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);

DD($结果); 我一直得到空字符串,但它在标准curl命令中工作。

2 个答案:

答案 0 :(得分:1)

看起来你犯了这些错误:

1:您没有启用CURLOPT_FOLLOWLOCATION。试试curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

2:j_username和j_password未正确编码。 (例如,@实际应该编码为%40)尝试curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('j_username'=>'manager-sitelogin@gmail.com','j_password'=>'site1')));

还要注意你可能不应该手动设置Content-Type: application/x-www-form-urlencoded,也许它没有什么区别,但我宁愿让curl / php自动设置它,如果我是你(几乎没有错位的机会)空间或拼写错误等),根据文档:Passing an array to CURLOPT_POSTFIELDS will encode the data as multipart/form-data, while passing a URL-encoded string will encode the data as application/x-www-form-urlencoded. - 你传递的是字符串。

答案 1 :(得分:1)

1)远程站点使用HTTPS协议。因此,您必须设置CA选项:CURLOPT_CAINFO / CURLOPT_CAPATH。或者,如果您不担心man-in-the-middle attack,可以通过将CURLOPT_SSL_VERIFYPEER选项设置为false来关闭同行的验证。

2)您还没有翻译-L选项。 CURLOPT_FOLLOWLOCATION - PHP中的对应物。

3)您已将-b选项翻译错误。 -b指定一个文件来读取以前存储的cookie。它还会激活cookie引擎,这会使curl自动记录传入的cookie。 PHP CURL与此选项没有直接等价。 CURLOPT_COOKIE仅接受cookie标头的内容,而不是文件名。 CURLOPT_COOKIEJAR仅指定用于保存传入Cookie的文件名,但它不会自动传递请求。为了重现-b选项的完整效果,您必须将CURLOPT_COOKIEJARCURLOPT_COOKIEFILE选项结合使用,该选项指定要读取Cookie的文件。两个选项必须设置为相同的值。两者都期望文件的绝对路径。如果您想将Cookie存储在当前脚本的目录中,可以将$_SERVER['PHP_SELF']__FILE__dirname()功能结合使用。因此public_path()函数应该返回固定的绝对路径或者当前目录前面的相对路径。

4)正如@hanshenrik所写,POST数据应该是URL编码的,正如它所要求的内容类型(application/x-www-form-urlencoded)所假设的那样。最合适的方法是使用http_build_query函数。

5)您应该考虑使用curl_setopt_array函数而不是curl_setopt次调用。

所以代码应该(可能)看起来像这样:

$cookie_file = dirname(__FILE__). '/session_cookies.txt';
$options = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query(array(
        'j_username' => 'manager-sitelogin@gmail.com',
        'j_password' => 'site1',
    )),
    CURLOPT_COOKIEJAR => $cookie_file,
    CURLOPT_COOKIEFILE => $cookie_file,
);
$ch = curl_init();
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_URL, 'https://login.uat.site.be/openid/login.do');
$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);