PHP CURL 412 ошибка
Я пытаюсь зарегистрироваться на сайте, используя PHP CURL
, Все хорошо, но когда я выполняю свой код, я получаю сообщение об ошибке от хоста:
HTTP/1.1 412 Precondition Failed
Date: Mon, 15 Feb 2016 20:54:58 GMT
Server: Varnish
X-Varnish: 317635174
Content-Length: 0
Array ( [header] => 1 [body] => [res] => 1 )
Проведя некоторые исследования на этом сайте, я нашел это:
Если вы посмотрите на RFC 2616, то увидите несколько заголовков запроса, которые можно использовать для применения условий к запросу:
If-Match If-Modified-Since If-None-Match If-Range If-Unmodified-Since
Эти заголовки содержат "предварительные условия", позволяющие клиенту сообщать серверу о завершении запроса только при соблюдении определенных условий. Например, вы используете запрос PUT для обновления состояния ресурса, но вы хотите, чтобы этот PUT действовал только в том случае, если ресурс не был изменен кем-то еще со времени вашего последнего GET.Код состояния ответа 412 (Ошибка предварительного условия) обычно используется, когда эти предварительные условия не выполняются.
(источник: когда уместно ответить ошибкой HTTP 412?)
Итак, я добавил эти заголовки
<?php
function register() {
$curl = curl_init();
$post = "name=username&email=".urlencode("email@email.com")."&password=thepassword&repassword=thepassword&parrain=test";
$useragent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36';
curl_setopt($curl, CURLOPT_URL, '[the website]');
curl_setopt($curl, CURLOPT_POST, "5");
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Connection: keep-alive",
"Content-Length: 43",
"Cache-Control: max-age=0",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Upgrade-Insecure-Requests: 1",
"Content-Type: application/x-www-form-urlencoded",
"Accept-Encoding: gzip, deflate",
"Accept-Language: fr,fr-FR;q=0.8,en;q=0.6,en-US;q=0.",
"If-Match: 1",
"If-Modified-Since: 1",
"If-None-Match: 1",
"If-Range: 1",
"If-Unmodified-Since: 1"
));
curl_setopt($curl, CURLOPT_HEADER, true);
$result = curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$body = substr($result, $header_size);
curl_close($curl);
return array(
"header" => $header,
"body" => $body,
"res" => $result
);
}
print_r(register());
?>
но это не работает Как я могу решить это?
2 ответа
Как правило, если вы взаимодействуете с веб-сайтом, который выполняет аутентификацию, вам понадобятся параметры cookiejar для cURL, чтобы сохранить информацию о сеансе. Если вы не отправите информацию о сеансе обратно на хост, это, скорее всего, вызовет проблемы с вашей регистрацией.
Вот класс, который я использую для удаленной аутентификации пользователей через cURL.
/* Makes an HTTP request
* @param String $url - The URL to request
* @param Mixed $params - string or array to POST
* @param String - filename to download
*/
public static function request($url, $params = array(), $filename = "") {
// Initiate cURL
$ch = curl_init();
$curlOpts = array(
CURLOPT_URL => $url,
CURLOPT_USERAGENT =>
'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0',
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true
);
// Send the cookies if we're logged in
if (!empty(self::$cookiejar)) {
$curlOpts[CURLOPT_COOKIEJAR] = self::$cookiejar;
$curlOpts[CURLOPT_COOKIEFILE] = self::$cookiejar;
}
// If $filename exists, save content to file
if (!empty($filename)) {
$file2 = fopen($filename, 'w+') or die("Error[" . __FILE__ . ":" . __LINE__ . "] Could not open file: $filename");
$curlOpts[CURLOPT_FILE] = $file2;
}
// Send POST values if there are any
if (!empty($params)) {
$curlOpts[CURLOPT_POST] = true;
$curlOpts[CURLOPT_POSTFIELDS] = is_array($params) ?
http_build_query($params) : $params;
}
// Send the request
curl_setopt_array($ch, $curlOpts);
$answer = curl_exec($ch);
// Errors?
if (curl_error($ch)) die($url . " || " . curl_error($ch));
// Close connection and return response
curl_close($ch);
if(!empty($filename)) fclose($file2);
return $answer;
}
1: curl_setopt($ch, CURLOPT_HTTPHEADER, array());
потребности $curl
вместо $ch
,
2: curl_setopt($curl, CURLOPT_POST, "5");
не ожидает 5, нужно TRUE
или же FALSE
см. curlopt_post (php.net).
2, 1: CURLOPT_FOLLOWLOCATION
также ожидает TRUE
или же FALSE
,
Изменить: Моя ошибка, 1 и 0 тоже логические