代码:
// That works pretty well
curl -d "user%5Blogin%5D=some%40email.pl&user%5Bpass%5D=testpass&user%5Bmemory%5D=on&user%5Bsubmit%5D=Login" -L -c cookie.txt http://turbobit.net/user/login
//But this PHP code doesn't
$headers = array('Content-Type' => 'application/x-www-form-urlencoded', 'Referer' => 'http://turbobit.net/');
$postdata = array('user%5Blogin%5D' => 'some%40email.pl', 'user%5Bpass%5D' => 'test', "user%5Bsubmit%5D" => 'Login', 'user%5Bmemory%5D' => 'on');
$cookie = "/srv/http/test/regexturbobit/cookie.txt";
$c = curl_init('http://tutbobit.net/user/login');
curl_setopt ($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt ($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($c, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($c, CURLOPT_COOKIEJAR, $cookie);
$output=curl_exec($c);
curl_close($c);
print_r($output);
它只是没有显示任何内容甚至不保存cookie ...
答案 0 :(得分:2)
尝试:
$postdata = 'user%5Blogin%5D=some%40email.pl&user%5Bpass%5D=testpass&user%5Bmemory%5D=on&user%5Bsubmit%5D=Login';
您不应该在postdata数组中使用URLencoded键,因为它们将再次进行URL编码。或者你可以这样做:
$postdata = array(
'user[login]' => 'some@email.pl',
'user[pass]' => 'test',
// the rest of the vars here...
);
但请注意,传递$postdata
的数组不会发送网址编码的请求,它会发送multipart/form-data
编码的请求。来自PHP docs:
<强> CURLOPT_POSTFIELDS 强>
要在HTTP“POST”操作中发布的完整数据。至 发布文件,在文件前添加@ 并使用完整的路径。这可以 作为urlencoded字符串传递 'para1 = val1&amp; para2 = val2&amp; ...'或作为 数组,字段名称为键和 字段数据作为值。如果价值是 数组,Content-Type标题将是 设置为multipart / form-data。
因此,如果传递数组,则值和键不应该是URLEncoded。
答案 1 :(得分:1)
当您将数据作为哈希数组提供时,POST将不再是“正常”POST,而是将其作为多部分formpost。
Multipart formposts(RFC1867)与命令行使用的正常-d非常不同。
一个很好的技巧是使用“--libcurl example.c”附加到curl命令行,以查看可用于运行相同操作的C源代码。
答案 2 :(得分:0)