在PHP中,如何在search.twitter.com上复制Tinyurls的扩展/收缩功能?
答案 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