命令行cURL有效,但php不行

时间:2010-08-25 22:03:56

标签: php authentication curl login

代码:

// 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 ...

3 个答案:

答案 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)

尝试使用此:http://github.com/shuber/curl