PHP: Как расширить / сжать Tinyurls - PullRequest
2 голосов
/ 15 сентября 2008

В PHP, как я могу скопировать функцию расширения / контракта для Tinyurls, как на search.twitter.com?

Ответы [ 7 ]

7 голосов
/ 15 сентября 2008

Если вы хотите узнать, куда идет tinyurl, используйте fsockopen, чтобы подключиться к tinyurl.com через порт 80, и отправьте ему HTTP-запрос, подобный этому

GET /dmsfm HTTP/1.0
Host: tinyurl.com

Ответ, который вы получите, будет выглядеть как

HTTP/1.0 301 Moved Permanently
Connection: close
X-Powered-By: PHP/5.2.6
Location: http://en.wikipedia.org/wiki/TinyURL
Content-type: text/html
Content-Length: 0
Date: Mon, 15 Sep 2008 12:29:04 GMT
Server: TinyURL/1.6

пример кода ...

<?php
$tinyurl="dmsfm";

$fp = fsockopen("tinyurl.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /$tinyurl HTTP/1.0\r\n";
    $out .= "Host: tinyurl.com\r\n";
    $out .= "Connection: Close\r\n\r\n";

    $response="";

    fwrite($fp, $out);
    while (!feof($fp)) {
        $response.=fgets($fp, 128);
    }
    fclose($fp);

    //now parse the Location: header out of the response

}
?>
4 голосов
/ 15 сентября 2008

А вот как заключить произвольный URL с использованием API TinyURL. Общий шаблон вызовов выглядит следующим образом, это простой HTTP-запрос с параметрами:

http://tinyurl.com/api-create.php?url=http://insertyourstuffhere.com

Это вернет соответствующий TinyURL для http://insertyourstuffhere.com. В PHP вы можете обернуть это в вызов fsockopen () или, для удобства, просто использовать функцию file (), чтобы получить его:

function make_tinyurl($longurl)
{
  return(implode('', file(
    'http://tinyurl.com/api-create.php?url='.urlencode($longurl))));
}

// make an example call
print(make_tinyurl('http://www.joelonsoftware.com/items/2008/09/15.html'));
2 голосов
/ 15 сентября 2008

Поскольку люди ответили программно, как создавать и разрешать перенаправления tinyurl.com, я бы хотел (настоятельно) предложить кое-что: кэширование.

В примере с твиттером, если каждый раз, когда вы нажимаете кнопку «развернуть», он выполняет запрос XmlHTTPRequest, скажем, /api/resolve_tinyurl/http://tinyurl.com/abcd, затем сервер создает HTTP-соединение с tinyurl.com и проверяет заголовок - это уничтожить как твиттер, так и сервера tinyurl ..

Бесконечно более разумным способом было бы сделать что-то вроде этого псевдокода Python'ы ..

def resolve_tinyurl(url):
    key = md5( url.lower_case() )
    if cache.has_key(key)
        return cache[md5]
    else:
        resolved = query_tinyurl(url)
        cache[key] = resolved
        return resolved

Где cache элементы волшебным образом копируются в память и / или файл, и query_tinyurl () работает так же, как и ответ Пола Диксона.

1 голос
/ 29 декабря 2009

Вот еще один способ декодировать короткие URL через библиотеку CURL:

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];
}

Это описано здесь .

0 голосов
/ 07 января 2010

В PHP также есть функция get_headers , которую можно использовать для декодирования крошечных URL.

0 голосов
/ 15 ноября 2009

Если вы просто хотите указать местоположение, тогда сделайте запрос HEAD вместо GET.

$tinyurl  = 'http://tinyurl.com/3fvbx8';
$context  = stream_context_create(array('http' => array('method' => 'HEAD')));
$response = file_get_contents($tinyurl, null, $context);

$location = '';
foreach ($http_response_header as $header) {
    if (strpos($header, 'Location:') === 0) {
        $location = trim(strrchr($header, ' '));
        break;
    }
}
echo $location;
// http://www.pingdom.com/reports/vb1395a6sww3/check_overview/?name=twitter.com%2Fhome
0 голосов
/ 15 сентября 2008

Еще один простой и легкий способ:

<?php
function getTinyUrl($url) {
return file_get_contents('http://tinyurl.com/api-create.php?url='.$url);
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...