PHP:如何扩展/收缩Tinyurls

时间:2008-09-15 12:24:45

标签: php

在PHP中,如何在search.twitter.com上复制Tinyurls的扩展/收缩功能?

8 个答案:

答案 0 :(得分:7)

如果你想知道tinyurl的去向,可以使用fsockopen在端口80上获得与tinyurl.com的连接,并向它发送一个这样的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

}
?>

答案 1 :(得分:4)

以下是使用TinyURL API 合同任意URL的方法。一般的调用模式是这样的,它是一个带参数的简单HTTP请求:

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

这将返回http://insertyourstuffhere.com的相应TinyURL。在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 :(得分:2)

由于人们已经以编程方式回答了如何创建和解决tinyurl.com重定向问题,我想(强烈)提出一些建议:缓存。

在twitter示例中,如果每次单击“展开”按钮,它都会执行XmlHTTPRequest,例如/api/resolve_tinyurl/http://tinyurl.com/abcd,然后服务器创建了与tinyurl.com的HTTP连接,并检查了标题 - 它会破坏twitter和tinyurl的服务器..

一种无比更明智的方法就是做类似Python'y伪代码的事情。

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()的工作方式与Paul Dixon的答案相同。

答案 3 :(得分:1)

以下是通过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];
}

它描述了here

答案 4 :(得分:0)

另一种简单易行的方法:

<?php
function getTinyUrl($url) {
return file_get_contents('http://tinyurl.com/api-create.php?url='.$url);
}
?>

答案 5 :(得分:0)

如果您只想要位置,请执行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

答案 6 :(得分:0)

在PHP中,还有一个get_headers函数可用于解码小网址。

答案 7 :(得分:0)

@Pons解决方案中的解决方案here不能在我的php7.3服务器上拆分select s,REGEXP_SUBSTR(s,'^(\d+) \1',1,1,null,1) as dig from t; 之类的stackexchange URL上单独工作

这解决了它:

https://stackoverflow.com/q/62317