получить работу curl с Content-Disposition заголовка ответа после отправки запроса $ _POST

Хорошо, чтобы понять проблему, сначала посетите

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-файла), вы можете иди сюда

Спасибо.

2

Решение

Попробуй это. Это хорошо работает для меня, если я правильно понимаю ваш вопрос. Я удалил много кода, который ничего не делал. Оказывается, проблема была в том, что вы не устанавливали 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-адреса вместо абсолютных. Просто имейте это в виду.

1

Другие решения

Проблема в том, что для выполнения запроса требуются два обращения к серверу. Многие сайты используют этот метод, чтобы уменьшить количество запросов или «ботов». Первый запрос создает cookie (обычно для «сеанса»), который должен присутствовать для обработки формы.

Выполните curl_exec () дважды и посмотрите, получите ли вы нужные результаты. В первый раз ответ отправит куки-файл, который будет сохраняться после того, как вы включили куки-файлы. Во второй раз вы должны получить результаты, которые вы хотите.

0