Как лучше всего в PHP или JS расширить сокращенные URL-адреса, такие как Bitly, Tinyurl, чтобы найти исходный URL-адрес?

Я использую API Twitter и Facewbook для извлечения сообщений, которые потенциально могут содержать сокращенные URL-адреса, с помощью таких сервисов, как bit.ly или TinyURL. Мне нужно выполнить расширение в реальном времени, чтобы получить исходный URL-адрес, а затем извлечь содержимое из этого URL-адреса в свое приложение.


person beactive    schedule 21.12.2010    source источник
comment
Вы также должны иметь в виду, что исходный URL-адрес может быть сокращен в 100 раз, когда разные сокращатели указывают друг на друга ;-)))   -  person zerkms    schedule 21.12.2010
comment
@zerkms Бред. API были бы бесполезны, если бы вы не могли их использовать.   -  person ceejayoz    schedule 21.12.2010
comment
@ceejayoz: а? короткий URL-адрес может указывать на любой сайт, который не предоставляет API и содержит материалы, защищенные авторским правом. ОП хочет захватить это содержимое.   -  person zerkms    schedule 21.12.2010
comment
Еще фигня. Ваш аргумент забанит кеш Google, Archive.org и множество других веб-сервисов. Вы даже не знаете, что он делает с приложением — возможно, он проводит какой-то анализ вместо того, чтобы показывать его непосредственно пользователю.   -  person ceejayoz    schedule 21.12.2010
comment
@ceejayoz: неважно, какое приложение он пишет - прежде чем использовать информацию, защищенную авторским правом, каким-либо образом (будь то аналитика или отображение), вы должны спросить. Вы можете отключить индексацию поисковыми системами с robots.txt, но вы не можете сделать то же самое против таких грабберов.   -  person zerkms    schedule 21.12.2010
comment
@beactive: вы должны разработать свое приложение с учетом robots.txt.   -  person Jonah    schedule 21.12.2010
comment
@zerkms Во-первых, вы делаете очень широкие юридические обобщения, которые не применяются во всем мире. Во-вторых, Google, похоже, не позволяет вам исключить кеширование, оставаясь в своем обычном индексе через robots.txt, вам нужен метатег собственной разработки. В-третьих, существует множество ситуаций добросовестного использования, в которых это было бы совершенно законно в США. Черт, ваш стандарт запрещает даже веб-браузеры — они не спрашивают разрешения и не используют robots.txt.   -  person ceejayoz    schedule 21.12.2010
comment
@ceejayoz: веб-сайты созданы для использования людьми, если другое явно не разрешено. Вам разрешено открывать любую страницу в браузере, но не разрешается копировать и вставлять ее.   -  person zerkms    schedule 21.12.2010
comment
@zerkms Когда вы посещаете веб-страницу, ваш браузер загружает ее для отображения. Это ничем не отличается от клиента без графического интерфейса. Если вы затем опубликуете данные без указания авторства и разрешения, у вас будут проблемы.   -  person Arda Xi    schedule 31.01.2011
comment
@zerkms и Arda Xi, Facebook уже делает именно то, что, как я предполагаю, намеревается сделать OP - извлекает ресурсы, чтобы предоставить уменьшенную ссылку на статью, а не обычную ссылку. Он не сказал, что собирается опубликовать его без указания авторства, и это не является незаконным, если только он не заявляет, что контент принадлежит ему, или пользователь не может предположить это.   -  person Drew Alden    schedule 11.01.2017


Ответы (4)


Вы можете использовать CURL для расширения короткого URL-адреса.

Попробуй это:

    function traceUrl($url, $hops = 0)
    {
        if ($hops == MAX_URL_HOPS)
        {
            throw new Exception('TOO_MANY_HOPS');
        }

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_NOBODY, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $r = curl_exec($ch);

        if (preg_match('/Location: (?P<url>.*)/i', $r, $match))
        {
            return traceUrl($match['url'], $hops + 1);
        }

        return rtrim($url);
    }

Вы можете использовать эту функцию так traceUrl('http://bit.ly/example'). Эта функция является рекурсивной в том смысле, что она найдет даже укороченные URL-адреса (если это когда-либо произойдет). Убедитесь, что вы установили константу MAX_URL_HOPS. Я использую define('MAX_URL_HOPS', 5);.

  • христианин
person Christian Joudrey    schedule 21.12.2010
comment
Однажды у меня было пиво, которое заставило меня бросить это исключение: P - person alex; 21.12.2010

Вы можете просто использовать PHP и CURL для подключения к URL-адресу и вернуть параметр Location:

Вот что возвращается -

> $ curl -I http://bit.ly/2V6CFi
> HTTP/1.1 301 Moved Server:
> nginx/0.7.67 Date: Tue, 21 Dec 2010
> 01:58:47 GMT Content-Type: text/html;
> charset=utf-8 Connection: keep-alive
> Set-Cookie:
> _bit=4d1009d7-00298-02f7f-c6ac8fa8;domain=.bit.ly;expires=Sat
> Jun 18 21:58:47 2011;path=/; HttpOnly
> Cache-control: private; max-age=90
> Location: http://www.google.com/
> MIME-Version: 1.0

Content-Length: 284

Таким образом, вы можете найти параметр Location в заголовке, чтобы увидеть, куда на самом деле ведет страница страницы.

person Amir Raminfar    schedule 21.12.2010
comment
Я бы также добавил -X HEAD, если все, что нужно OP на этом шаге, — это просто длинный URL-адрес. - person zerkms; 21.12.2010
comment
@zerkms Вместо этого я использовал -I, что в основном делает то же самое - person Amir Raminfar; 21.12.2010

С nodejs вы можете использовать модуль request.

var request = require('request');
var shortUrl = 'the url that is shortened'
request({method: 'HEAD', url: shortUrl, followAllRedirects: true}, 
  function(err, response, body){
     console.log(response.request.href);
  })
person Christian Saiki    schedule 04.01.2016

Я нашел библиотеку php, которая делает именно это, она может быть полезна. Проверьте это: https://launchpad.net/longurl

person applechief    schedule 15.12.2011