Задать вопрос

Как получить данные от vk api через curl?

Делаю голосование на сайте, каждую неделю в воскресенье по cron будет запускаться php скрипт, который посылает запрос на vk api - например:

https://api.vk.com/method/wall.getById?posts=11718...

дальше декодит в массив и вытаскивает всю необходимую информацию.. Проблема в том, как получить ответ с этой страницы vk api:

используя file_get_contents
<?php


					$myvkreq = file_get_contents('https://api.vk.com/method/wall.getById?posts=117180742_8288');
					echo $myvkreq;
?>

получаю:
Warning: file_get_contents(https://api.vk.com/method/wall.getById?posts=11718...): failed to open stream: Connection refused in /home/uXXX/public_html/test.php on line 4


используя curl

1ая попытка -
function curl( $url ) {
	$ch = curl_init( $url );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
	curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
	$response = curl_exec( $ch );
	curl_close( $ch );
echo $response;
}
curl('https://api.vk.com/method/wall.getById?posts=117180742_8288');

получаю абсолютно пустую страницу..

2ая попытка -
<?php


function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}
getSslPage('https://api.vk.com/method/wall.getById?posts=117180742_8288');
?>

ответ -
Warning: curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set in /home/uXXX/public_html/test.php on line 8


хостинг - hostinger заверяет что curl и curl ssl установлен..

пробовал сокет, тоже не получилось - 302 ошибка (что-то поделав - получил 301).

подскажите пожалуйста как получить этот ответ

APD
как я понял проблема всё-таки в хостинге, так как на koding.com всё работает правильно (и fgc и curl), так что вопрос снялся, спасибо за внимание.. буду тестить на denwer, напишу что получилось
  • Вопрос задан
  • 5295 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
GTRxShock
@GTRxShock
SA
На хостингере все работает, просто запрещены редиректы.
Это ограничение можно обойти написав свою реализацию curl_exec().

например:
public function curl_redir_exec($ch)
    {
        if (self::$curl_loops++ >= self::$curl_max_loops)
        {
            self::$curl_loops = 0;
            return FALSE;
        }
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        //$header = '';
        //var_dump($data);
        list($header) = 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);
            //print_r($matches);
            $url = @parse_url(trim(array_pop($matches)));
            if (!$url)
            {
                //couldn't process the url to redirect to
                $curl_loops = 0;
                return $data;
            }
            $url['query'] = ''; // костыль в ооп
            $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
            if (!$url['scheme'])
                $url['scheme'] = $last_url['scheme'];
            if (!$url['host'])
                $url['host'] = $last_url['host'];
            if (!$url['path'])
                $url['path'] = $last_url['path'];
            $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
            curl_setopt($ch, CURLOPT_URL, $new_url);
            //debug('Redirecting to', $new_url);
            //echo $new_url;
            return $this->curl_redir_exec($ch);
        } else {
            $curl_loops=0;
            return $data;
        }
    }


так как необходимость во встроенных редиректах отпадает, устанавливаем CURLOPT_FOLLOWLOCATION => false

p.s. не забываем, что это своего рода костыль, но, за неимением лучшего хостинга, для разработки вполне сойдет :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы