用于PHP的通用url缩短解码器库

时间:2011-08-02 00:40:07

标签: php bit.ly url-shortener tinyurl goo.gl

是否有任何类型的PHP库可以解码tinyurl,Goo.gl,bit.ly和其他网址缩短的URL而不会产生CURL请求?

4 个答案:

答案 0 :(得分:4)

  

没有提出CURL请求

  • 没有

通过URL缩短,创建的哈希与缩短的URL无关,但是只是一个简单优雅的内部数据库标识符。

检索URL位置的唯一方法是要求链接缩短站点处理请求然后捕获响应数据,唯一的方法是与该站点建立联系。

除非该位置的哈希值是长URL的可逆哈希值,否则没有其他方法可以执行此操作。

答案 1 :(得分:2)

没有。这是不可能的。我创建了一小部分功能,适用于大多数主机。

<?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 /网络

是不可能的

答案 2 :(得分:2)

至少bit.ly和TinyURL只使用HTTP重定向。

因此,您只需获取位置响应标头即可。例如,您可以使用PEAR HTTP_Request2。我不知道所有服务是否使用此方法,但它是最明显的使用方法...

我不确定你为什么不想使用卷曲。您是在谈论特定或网络库中的卷曲吗?从网页上获取信息而不连接它对我来说似乎不太敏感: - )

这是“不费力的快速'脏”方法,不使用库...(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

答案 3 :(得分:1)

除非您拥有自己的缩短服务数据库副本,否则 要发出某种请求。如果不是缩短的url本身,那么到服务的某些API。好吧,实际上,我想,请求短网址并获取重定向标头 在技术上是一个API。

所以我说cURL吧。不要遵循重定向,并确保设置cURL以返回标题(因为没有其他内容)。您正在寻找Location: ....标题