Хорошо, чтобы понять проблему, сначала посетите
http://unblockproxy.nu/
Попробуй зайти на любой сайт, скажем (http://www.example.com/samplepage.html) поместите его в поле и нажмите кнопку «разблокировать»
После отправки запроса $ _POST сайт должен перенаправить вас на что-то вроде:
http://unblockproxy.nu/index.php?x=Mfv0KjYRb3J3JO50MgBNbplFn2sTMoqPUIu1Unqn0bqdUoq5VbA9OnO8%3D
Заголовки ответа браузера имеют вид:
HTTP/1.1 302 Found
Date: Fri, 06 Mar 2015 12:49:30 GMT
Server: Apache/2.2.15
x-powered-by: PHP/5.3.3
Location: http://unblockproxy.nu/index.php?x=Mfv0KjYRb3J3JO50MgBNbplFn2sTMoqPUIu1Unqn0bqdUoq5VbA9OnO8%3D
Cache-Control: max-age=600, private, must-revalidate
Expires: Fri, 06 Mar 2015 12:59:30 GMT
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
HTTP/1.1 200 OK
Date: Fri, 06 Mar 2015 12:49:34 GMT
Server: Apache/2.2.15
X-Powered-By: PHP/5.3.3
Content-Disposition: inline; filename="samplepage.html"Cache-Control: max-age=600, private, must-revalidate
Expires: Fri, 06 Mar 2015 12:59:34 GMT
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Это легко, теперь вы получили содержимое страницы с помощью этого веб-прокси.
Теперь я хочу сделать ту же работу с помощью curl
Моя проблема, я не знаю, как позволить curl иметь дело с Content-Disposition заголовка ответа
Вот несколько кодов для моделирования моей проблемы:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://unblockproxy.nu/index.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('x' => 'http://www.example.com/samplepage.html'));
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
$string = curl_exec($ch);
curl_close($ch);
echo $string;
Это вернет содержимое http://unblockproxy.nu/ и это не то, что я хочу (http://www.example.com/samplepage.html который занимался серфингом http://unblockproxy.nu/)
Если вы хотите взглянуть на скрипт этого сайта (только 2 PHP-файла), вы можете иди сюда
Спасибо.
Попробуй это. Это хорошо работает для меня, если я правильно понимаю ваш вопрос. Я удалил много кода, который ничего не делал. Оказывается, проблема была в том, что вы не устанавливали referer
в заголовках запроса.
Позвольте мне начать с самого начала. После отправки формы через POST
для просмотра данного веб-сайта с прокси-сервером отправляется запрос http://unblockproxy.nu/index.php. Как вы упомянули в своем вопросе, index.php
обрабатывает отправку формы и генерирует HTTP-код состояния 302 который по сути просто перенаправляет вас на другую страницу. Предполагая, что вы отправляете правильно отформатированный запрос index.php
Вы можете проанализировать заголовки ответа и получить значение URL перенаправления. Следуйте приведенному ниже коду, чтобы получить URL перенаправления.
/**
* Submit the form via POST
* @param [site_url] The link to the page that you want to view
* eg: http://sitetoget.com/page.html
* @return A string containing the response headers
*/
function GetRedirect($site_url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://unblockproxy.nu/index.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('x' => $site_url));
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
/**
* Turn a header string into an associative array
* @param [response] The response headers from the form submission
* @return An array containing all of the headers
*/
function GetHeaders($response) {
$headers = [];
$text = substr($response, strpos($response, "\r\n\r\n"));
foreach(explode("\r\n", $text) as $i => $line) {
if($i === 0 || $i == 1) {
$headers['http_code'] = $line;
} else {
list($key, $value) = explode(': ', $line);
if($key != '' && $value != '') {
$headers[$key] = $value;
}
}
}
return $headers;
}
// Get the redirect URL
$redirect = GetRedirect('http://lancenewman.me/');
// Parse the response headers
$headers = GetHeaders($redirect);
// Save the redirect URL
$new_url = $headers['Location'];
Теперь, когда у вас есть URL, который index.php
перенаправляет на, отправить cURL
просьба к нему следующим образом. Как ни странно, почти все остальные заголовки запросов, с которыми я работал, не играют никакой роли в определении того, работает ли это решение. Причина, по которой ваш код получает содержимое http://unblockproxy.nu вместо содержимого данного сайта в просмотре http://unblockproxy.nu
потому что вы не правильно следите за перенаправлениями и не устанавливаете referer
в заголовках запроса. Печенье, расположение контента и все остальные заголовки, кажется, не играют никакой роли в решении этой проблемы.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $new_url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://unblockproxy.nu');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$string = curl_exec($ch);
curl_close($ch);
echo $string;
Важно отметить, что некоторые изображения, CSS и JS на некоторых страницах могут загружаться неправильно, поскольку некоторые используют относительные URL-адреса вместо абсолютных. Просто имейте это в виду.
Проблема в том, что для выполнения запроса требуются два обращения к серверу. Многие сайты используют этот метод, чтобы уменьшить количество запросов или «ботов». Первый запрос создает cookie (обычно для «сеанса»), который должен присутствовать для обработки формы.
Выполните curl_exec () дважды и посмотрите, получите ли вы нужные результаты. В первый раз ответ отправит куки-файл, который будет сохраняться после того, как вы включили куки-файлы. Во второй раз вы должны получить результаты, которые вы хотите.