Получить ссылку на страницу, после отправки POST запроса.

juniorspecialistphp
На сайте с 08.08.2010
Offline
25
1612

Добрый день.

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

Уже пробовал и через заголовки вычислить, что-то не выходит и пробовал получить из "curl_getinfo", также не даёт нужного урла в массиве.


$ch=curl_init();
curl_setopt($ch, CURLOPT_URL,$_POST['url_posting']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch , CURLOPT_HTTPHEADER , $header );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_REFERER,$_POST['ref']);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_fields);
curl_setopt($ch, CURLOPT_USERAGENT, $_POST['user_agent']);
curl_setopt($ch, CURLOPT_COOKIEFILE, $_POST['cookies_path']);
curl_setopt($ch, CURLOPT_COOKIEJAR, $_POST['cookies_path']);
$result=curl_exec($ch);

Подскажите кто знает.

Пишу скрипты любой сложности на РНР. (http://elagin.su)
F
На сайте с 03.05.2008
Offline
74
#1

Как вариант можно отключить FOLLOWLOCATION, поочередно брать урлы из заголовков и переходить по ним, пока не достигнете последнего, который и будет искомым.

juniorspecialistphp
На сайте с 08.08.2010
Offline
25
#2

Пожалуй так и сделаю, потому как этот вариант и поборит ошибку "CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in".

juniorspecialistphp
На сайте с 08.08.2010
Offline
25
#3

У кого-то есть РАБОЧАЯ функция, которая проходит по всем заголовкам из урлов? Здесь смотрел http://stackoverflow.com/questions/2511410/curl-follow-location-error и здесь http://php.net/manual/en/function.curl-setopt.php то ли я не разобрался что не так, то ли руки кривые у меня, но добиться рабочей функции так и не удалось. Если у кого-то есть РАБОЧАЯ поделитесь :)

F
На сайте с 03.05.2008
Offline
74
#4


//function in place of the FOLLOWLOCATION
function curl_redir_exec($ch,$debug=false)
{

static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++ >= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$debbbb = $data;
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302) {
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = parse_url(trim(array_pop($matches)));
//print_r($url);
if (!$url)
{
//couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));

$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] .
($url['query']?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
if($debug)
{
echo "Loop $curl_loops: Redirecting to $new_url\n";
}
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $debbbb;
}
}
$url = "http://www.wordpress.com/";
$ch = curl_init(); //initialize curl handle
curl_setopt($ch, CURLOPT_URL,$url); //set url to post to
curl_setopt($ch, CURLOPT_FAILONERROR, 1);

curl_redir_exec($ch,true);
curl_setopt($ch, CURLOPT_COOKIEFILE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //return into variable
curl_setopt($ch, CURLOPT_TIMEOUT, 100); //timeout after 6s

$result = curl_exec($ch); //run the whole process
curl_close($ch);

Вот это попробуйте (включен режим отладки). Дальше разберетесь, думаю.

juniorspecialistphp
На сайте с 08.08.2010
Offline
25
#5

function curl_redir_exec1($ch,$debug=false){

static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++ >= $curl_max_loops){
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$debbbb = $data;
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$new_url="";
if ($http_code == 301 || $http_code == 302) {
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = parse_url(trim(array_pop($matches)));
print_r($url);
if (!$url){ //couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] .($url['query']?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
if($debug){echo "Loop $curl_loops: Redirecting to $new_url\n";flush();}
return curl_redir_exec1($ch);

} else {
$curl_loops=0;
return $debbbb;
}
}
//=========================================
$ch=curl_init();
//--отдаём куку и отправляем свои данные-ЛОГИНИМСЯ
curl_setopt($ch, CURLOPT_URL,$_POST['url_posting']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_HTTPHEADER , $header );
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_redir_exec1($ch,true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_REFERER,$_POST['ref']);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_fields);
curl_setopt($ch, CURLOPT_USERAGENT, $_POST['user_agent']);
curl_setopt($ch, CURLOPT_COOKIEFILE, $_POST['cookies_path']);
curl_setopt($ch, CURLOPT_COOKIEJAR, $_POST['cookies_path']);
$result=curl_exec($ch);
return $result;

Не переходит и не отлавливает куда дальше переходить. Что-то в функции не так :(

F
На сайте с 03.05.2008
Offline
74
#6

Кажется, понял: у Вас данные post-запроса передаются после вызова функции. Надо бы сделать ДО.

juniorspecialistphp
На сайте с 08.08.2010
Offline
25
#7

Там адрес страницы, куда я отправляю POST запрос.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий