Я пытаюсь зарегистрироваться на сайте с помощью 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 (Precondition Failed) обычно используется
когда эти предпосылки не выполняются.
(источник: Когда уместно ответить ошибкой HTTP 412?)
Итак, я добавил эти заголовки
<?php
function register() {
$curl = curl_init();
$post = "name=username&email=".urlencode("[email protected]")."&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());
?>
но это не работает Как я могу решить это?
Как правило, если вы взаимодействуете с веб-сайтом, который выполняет аутентификацию, вам понадобятся параметры 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 тоже булевы