命令行cURL可以工作,但php one不能

命令行cURL可以工作,但php one不能,php,authentication,curl,login,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('Co

守则:

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

试试:

$postdata = 'user%5Blogin%5D=some%40email.pl&user%5Bpass%5D=testpass&user%5Bmemory%5D=on&user%5Bsubmit%5D=Login';
postdata数组中不应该有URL编码的键,因为它们将再次进行URL编码。或者,您可以:

$postdata = array(
  'user[login]' => 'some@email.pl',
  'user[pass]' =>  'test',
  // the rest of the vars here...
);
但请注意,
$postdata
传递数组不会发送URL编码的请求,它将发送带有
多部分/表单数据编码的请求。从:

CURLOPT_POSTFIELDS

要在HTTP“post”操作中发布的完整数据。到 发布文件,在文件名前面加上@ 并使用完整路径。这两者都可以 作为URL编码的字符串传递,如 “para1=val1¶2=val2&…”或作为 将字段名作为键和 字段数据作为值。如果值是 数组,则内容类型标头将为 设置为多部分/表单数据

因此,如果您传递一个数组,则值和键不应已经进行URL编码。

请尝试:

$postdata = 'user%5Blogin%5D=some%40email.pl&user%5Bpass%5D=testpass&user%5Bmemory%5D=on&user%5Bsubmit%5D=Login';
postdata数组中不应该有URL编码的键,因为它们将再次进行URL编码。或者,您可以:

$postdata = array(
  'user[login]' => 'some@email.pl',
  'user[pass]' =>  'test',
  // the rest of the vars here...
);
但请注意,
$postdata
传递数组不会发送URL编码的请求,它将发送带有
多部分/表单数据编码的请求。从:

CURLOPT_POSTFIELDS

要在HTTP“post”操作中发布的完整数据。到 发布文件,在文件名前面加上@ 并使用完整路径。这两者都可以 作为URL编码的字符串传递,如 “para1=val1¶2=val2&…”或作为 将字段名作为键和 字段数据作为值。如果值是 数组,则内容类型标头将为 设置为多部分/表单数据


因此,如果您传递一个数组,那么值和键不应该已经进行URL编码。

尝试使用此方法:

尝试使用此方法:

当您以散列数组形式提供数据时,POST将不再是“普通”POST,而是生成一个多部分formpost

Multipart formposts()与命令行使用的普通-d格式非常不同


一个很好的技巧是在curl命令行中使用append“-libcurl example.c”来查看可用于运行相同操作的c源代码。

当您以散列数组形式提供数据时,POST将不再是“普通”POST,而是生成一个多部分formpost

Multipart formposts()与命令行使用的普通-d格式非常不同



一个很好的技巧是在curl命令行中使用append“-libcurl example.c”,以查看可用于运行相同操作的c源代码。

域名拼写错误了吗?如果
some@email.pl
…域名拼错了吗?如果
some@email.pl
…这个答案中的部分是错误的,因为这段代码也发送了错误的帖子。@Daniel:我为这两种帖子都提供了代码。第一个例子是
application/x-www-form-urlencoded
,第二个例子是
multipart/formdata
。我还包括了手册的一个摘录,解释了为什么第二个是
multipart/formdata
。而且,如果他要发布到PHP脚本中,很有可能这两种方法都能工作。一点也不,很少有服务器端脚本接受这两种方法。它们几乎总是只接受其中一种,而您的语句几乎忽略了整个PHP脚本语言。您肯定意识到大量服务器端脚本是用PHP编写的吗?大多数情况下,PHP并不关心postdata是url还是多部分编码的。这些值将以
$\u POST
的形式出现。这个答案中的部分是错误的,因为这段代码也发送了错误的帖子。@Daniel:我为这两种帖子都提供了代码。第一个例子是
application/x-www-form-urlencoded
,第二个例子是
multipart/formdata
。我还包括了手册的一个摘录,解释了为什么第二个是
multipart/formdata
。而且,如果他要发布到PHP脚本中,很有可能这两种方法都能工作。一点也不,很少有服务器端脚本接受这两种方法。它们几乎总是只接受其中一种,而您的语句几乎忽略了整个PHP脚本语言。您肯定意识到大量服务器端脚本是用PHP编写的吗?大多数情况下,PHP并不关心postdata是url还是多部分编码的。值将以
$\u POST
的形式出现。虽然您正确地认为
multipart/form data
application/x-www-form-urlencoded
是两种非常不同的postdata编码方式,但“POST将不是“正常”POST”并不完全正确。这仍然是一个HTTPPOST操作,Web服务器很可能会接受这两种操作。问题中提供的URL与
multipart/form data
posts配合得很好。您的回答甚至没有试图解释差异,因此根本不清楚您是否理解或考虑了这些差异。我认为这误导了任何阅读问题和答案的人,因此我作出了澄清。我同意我的回答可以更清楚地说明这一点。我现在就编辑它。我知道你是
libcurl
软件包的维护者,这意味着你的C技能和对RFC的了解远远超过了我。。。我想我们在基本概念上是一致的,只是在语义上争论,这不是我想做的。。。当然也不会有人认为我是最有用的图书馆之一。我一直在代码中使用libcurl
:-)
虽然您认为
多部分/表单数据
应用程序/x-www-form-urlencoded
是两种非常不同的postdata编码方式,但这一点是正确的,“POST将不是一种“正常”的P