Общая библиотека декодера URL сокращений для PHP - PullRequest
2 голосов
/ 02 августа 2011

Существует ли какая-либо библиотека для PHP, которая может декодировать tinyurl, Goo.gl, bit.ly и другие URL-адреса, сокращенные по URL, без выполнения запросов CURL?

Ответы [ 4 ]

4 голосов
/ 02 августа 2011

без отправки CURL-запросов

  • Нет

При сокращении URL созданные хэши не имеют отношения к сокращаемому URL, но представляют собой простой элегантный внутренний идентификатор базы данных.

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

Если хеш для местоположения не является обратимым хешем длинного URL, другого способа сделать это не существует.

2 голосов
/ 02 августа 2011

По крайней мере, bit.ly, а TinyURL просто использует перенаправления HTTP.

Таким образом, вы можете просто получить заголовок ответа Location. Вы можете использовать PEAR HTTP_Request2 например. Я не знаю, используют ли все службы этот метод, но он наиболее очевиден для использования ...

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

Это метод «с минимальными усилиями, быстрый и грязный», который не использует библиотеку ... (Вы можете grep для заголовка Location) ... Вы можете сделать то же самое с помощью сокетов .. .

[~]% telnet tinyurl.com 80
Trying 64.62.243.89...
Connected to tinyurl.com.
Escape character is '^]'.
GET /69gb3gl HTTP/1.1             
Host: tinyurl.com

HTTP/1.1 301 Moved Permanently
X-Powered-By: PHP/5.3.6
Location: http://www.thinkwithportals.com/media_17.php
X-tiny: db 0.1608510017395
Content-type: text/html
Content-Length: 0
Connection: close
Date: Tue, 02 Aug 2011 00:45:59 GMT
Server: TinyURL/1.6

Connection closed by foreign host.


[~]% telnet bit.ly 80 
Trying 168.143.172.53...
Connected to bit.ly.
Escape character is '^]'.
GET /nm0ZIh HTTP/1.1
Host: bit.ly

HTTP/1.1 301 Moved
Server: nginx
Date: Tue, 02 Aug 2011 00:47:12 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Set-Cookie: _bit=4e374910-002c2-05b82-d5ac8fa8;domain=.bit.ly;expires=Sat Jan 28 19:47:12 2012;path=/; HttpOnly
Cache-control: private; max-age=90
Location: http://richarddawkins.net/videos/642324-iq2-shorts-stephen-fry-vs-ann-widdecombe-catholic-church-debate
MIME-Version: 1.0
Content-Length: 195
2 голосов
/ 02 августа 2011

Нет. Это невозможно Я создал небольшой пакет функций, который работает на большинстве хостов.

<?php
class url{
        function get_location_header($url){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_HEADER, true);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
                curl_setopt($ch, CURLOPT_NOBODY, true);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_TIMEOUT, 3);
                $response = curl_exec ($ch);
                curl_close ($ch);
                preg_match("~(http://.*)~", $response, $match);
                return $match[0];
        }

        function cache_save($file, $content){
                $f = fopen('cache/'.$file, 'w+');
                fwrite($f, $content);
                fclose($f);
        }

        function long_url($short_url){
                $patterns = array('goo\.gl', 'tinyurl\.com', 'bit\.ly');
                $header = $this->get_location_header($short_url);
                if ($header){
                        $long_url = $header;
                        return $long_url;
                }
        }
}

$url = new url();
echo $url->long_url('http://goo.gl/0A3kH').'<br />';
echo $url->long_url('http://tinyurl.com/5b2su2').'<br />';
echo $url->long_url('http://bit.ly/4Agih5');

это с curl, но это невозможно без CURL / сети

1 голос
/ 02 августа 2011

Если у вас нет собственной копии базы данных службы сокращений, у вас есть для выполнения какого-либо запроса.Если не к самому сокращенному URL, то к некоторому API сервиса.Ну, на самом деле, запрос короткого URL-адреса и получение заголовка перенаправления является технически API, я полагаю.

Так что я бы сказал, что это можно.Не следите за перенаправлениями и убедитесь, что вы установили cURL для возврата заголовков (потому что больше ничего нет).Вы ищете заголовок Location: ....

...