Получить конечный URL из двойного укороченного URL (t.co -> bit.ly -> final)

Я не смог преобразовать двойной сокращенный URL-адрес в расширенный URL-адрес успешно, используя следующую функцию, которую я получил отсюда :

function doShortURLDecode($url) { $ch = @curl_init($url); @curl_setopt($ch, CURLOPT_HEADER, TRUE); @curl_setopt($ch, CURLOPT_NOBODY, TRUE); @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE); @curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $response = @curl_exec($ch); preg_match('/Location: (.*)\n/', $response, $a); if (!isset($a[1])) return $url; return $a[1]; } 

У меня возникли проблемы, когда расширенный URL-адрес, который я получил, снова был сокращенным URL-адресом, который имеет расширенный URL-адрес.

Как получить окончательный расширенный URL-адрес после того, как он запущен через службы сокращения URL-адресов?

Поскольку t.co использует перенаправление HTML с использованием JavaScript и / или перенаправления <meta> нам нужно сначала захватить его содержимое. Затем извлеките из него URL-адрес bit.ly чтобы выполнить запрос заголовка HTTP, чтобы получить окончательное местоположение. Этот метод не полагается на включение cURL на сервере и использует все собственные функции PHP5:

Протестировано и работает!

 function large_url($url) { $data = file_get_contents($url); // t.co uses HTML redirection $url = strtok(strstr($data, 'http://bit.ly/'), '"'); // grab bit.ly URL stream_context_set_default(array('http' => array('method' => 'HEAD'))); $headers = get_headers($url, 1); // get HTTP headers return (isset($headers['Location'])) // check if Location header set ? $headers['Location'] // return Location header value : $url; // return bit.ly URL instead } // DEMO $url = 'http://t.co/dd4b3kOz'; echo large_url($url); 

Наконец нашел способ получить окончательный URL-адрес двойного укороченного URL-адреса. Лучший способ – использовать longurl api для него.

Я не уверен, что это правильный способ, но я, наконец, получаю вывод в качестве окончательного URL-адреса 🙂

Вот что я сделал:

 <?php function TextAfterTag($input, $tag) { $result = ''; $tagPos = strpos($input, $tag); if (!($tagPos === false)) { $length = strlen($input); $substrLength = $length - $tagPos + 1; $result = substr($input, $tagPos + 1, $substrLength); } return trim($result); } function expandUrlLongApi($url) { $format = 'json'; $api_query = "http://api.longurl.org/v2/expand?" . "url={$url}&response-code=1&format={$format}"; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $api_query ); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0); curl_setopt($ch, CURLOPT_HEADER, false); $fileContents = curl_exec($ch); curl_close($ch); $s1=str_replace("{"," ","$fileContents"); $s2=str_replace("}"," ","$s1"); $s2=trim($s2); $s3=array(); $s3=explode(",",$s2); $s4=TextAfterTag($s3[0],(':')); $s4=stripslashes($s4); return $s4; } echo expandUrlLongApi('http://t.co/dd4b3kOz'); ?> 

Выход, который я получаю:

 "http://changeordie.therepublik.net/?p=371#proliferation" 

Вышеприведенный код работает.

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

Если кто-то думает, что это может быть сделано каким-то другим способом, пожалуйста, не стесняйтесь делиться им.

Возможно, вам нужно просто использовать CURLOPT_FOLLOWLOCATION = true, а затем определить конечный URL, к CURLOPT_FOLLOWLOCATION вы были направлены.