командная строка cURL работает, но PHP один не - PullRequest
0 голосов
/ 26 августа 2010

Код:

// 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);

он просто ничего не показывает и даже не сохраняет куки ...

Ответы [ 3 ]

2 голосов
/ 26 августа 2010

Попробуйте:

$postdata = 'user%5Blogin%5D=some%40email.pl&user%5Bpass%5D=testpass&user%5Bmemory%5D=on&user%5Bsubmit%5D=Login';

У вас не должно быть URL-кодированных ключей в массиве постданных, поскольку они снова будут URL-кодированы.В качестве альтернативы вы можете сделать:

$postdata = array(
  'user[login]' => 'some@email.pl',
  'user[pass]' =>  'test',
  // the rest of the vars here...
);

Но учтите, что , передав массив для $postdata, не будет отправлять запрос в кодировке URL , он будет отправлять запрос с кодировкой multipart/form-data.Из PHP документов :

CURLOPT_POSTFIELDS

Полные данные для отправки в HTTP-операции «POST».Чтобы опубликовать файл, добавьте @ к имени файла и используйте полный путь.Это может быть либо передано в виде строки в кодировке urlen, например, 'para1 = val1¶2 = val2 & ...', либо в виде массива с именем поля в качестве ключа и данными поля в качестве значения.Если значение является массивом, заголовок Content-Type будет установлен на multipart / form-data.

Таким образом, если вы передаете массив, значения и ключи уже не должны кодироваться URLEncoded.

1 голос
/ 27 августа 2010

Когда вы предоставляете данные в виде хеш-массива, POST больше не будет "нормальным" POST, а вместо этого создаст многокомпонентную формпост.

Многокомпонентная формпост ( RFC1867 )они сильно отличаются от обычной -d, которую использует ваша командная строка.

Хорошая хитрость заключается в том, чтобы добавить "--libcurl example.c" в вашу командную строку curl, чтобы увидеть исходный код C, для чегоможно использовать для выполнения той же операции.

0 голосов
/ 26 августа 2010

Попробуйте использовать это: http://github.com/shuber/curl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...