查找 t.co 链接的跳转网址

32

如何查找“t.co”链接解析到哪里?例如,如果我有“t.co/foo”,我想要一个函数或过程返回“domain.com/bar”。


3
我支持关闭这个问题,因为它需要更加具体明确的焦点。它询问一个函数或过程,但没有指定编程语言。现在有许多针对不同技术的竞争性答案。由于答案适用于不同的情况,很难选择“最佳”答案。此外,这个问题正在吸引质量较差的推荐答案。(已删除几个此类答案。) - Stephen Ostermiller
如果你将URL粘贴到浏览器(一个进程)的地址栏中,它会变成该链接解析出来的链接。你甚至可以直接点击它。 - Kevin B
@StephenOstermiller 听起来不错。有一些被点赞的答案已经被删除了。但是,十多年过去了,我也不知道我的用例是什么。 - hookedonwinter
@KevinB并不是非常有帮助,因为“只需单击链接”既不可扩展也不安全。但下次我会尝试一下! - hookedonwinter
7个回答

22

我建议远离那些你无法控制的外部API。这会在你的应用程序中引入一种潜在的故障点和可能花费你金钱的依赖性。

CURL可以很好地完成这个任务。以下是我在PHP中实现它的方法:

function unshorten_url($url) {
  $ch = curl_init($url);
  curl_setopt_array($ch, array(
    CURLOPT_FOLLOWLOCATION => TRUE,  // the magic sauce
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_SSL_VERIFYHOST => FALSE, // suppress certain SSL errors
    CURLOPT_SSL_VERIFYPEER => FALSE, 
  ));
  curl_exec($ch); 
  return curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
}
我相信这可以适应其他语言,甚至可以在UNIX系统上使用curl命令进行脚本编写。 http://jonathonhill.net/2012-05-18/unshorten-urls-with-php-and-curl/

3
好的解决方案。我可以建议设置 CURLOPT_NOBODY => true,这样就会执行一个 HEAD 请求,而最终的资源实际上并没有被获取? - MaxArt

8
如果您想从命令行执行此操作,可以使用curl的verbose选项:
curl -v <url>

该命令将返回HTTP响应。对于t.co,它似乎会给出一个HTTP/301响应(永久移动)。然后,有一个Location字段,指向缩短网址背后的URL。


为什么要使用-v?它会输出许多不必要的信息。curl -I(大写字母i)就足够了。 - Sybille Peters
此解决方案不遵循多重定向。其他一些解决方案会这样做,例如 https://dev59.com/kGw15IYBdhLWcg3wntAQ#11326239。 - Sybille Peters
@SybillePeters 那个链接解决方案将访问目标服务器,如果作为垃圾邮件的链接使用可能会有问题(这可能会将地址标记为有效)。我收到了一些带有t.co链接的垃圾邮件。 - Gert van den Berg

7

curl -s -o /dev/null --head -w "%{url_effective}\n" -L "https://t.co/6e7LFNBv"

  • --head-I仅下载HTTP头文件
  • -w--write-out在输出后打印指定的字符串
  • -L--location跟随位置标头

我喜欢这个解决方案。它只输出URL(因此不需要进一步解析),并且可以跟随多个重定向。实际上,这与PHP命令行中的解决方案相同,对吗? https://dev59.com/kGw15IYBdhLWcg3wntAQ#10661246 - Sybille Peters
这将会访问到目标 - 如果链接被用于垃圾邮件(这也是我在这里的原因),这将提醒他们该电子邮件地址是有效的... - Gert van den Berg

3
这里提供一份Python解决方案。
import urllib2

class HeadRequest(urllib2.Request):
    def get_method(self): return "HEAD"

def get_real(url):
    res = urllib2.urlopen(HeadRequest(url))
    return res.geturl()

使用实际的 Twitter t.co 链接进行测试:

url = "http://t.co/yla4TZys"
expanded = get_real(url)

expanded = http://twitter.com/shanselman/status/276958062156320768/photo/1

在try-except语句中包装它,你就可以开始了。


它与http://t.co/OFlTpTzCqt不兼容。抛出HTTPError:HTTP错误303:HTTP服务器返回将导致无限循环的重定向错误。最后的30x错误消息是:查看其他 - Moj

1
另一个Python解决方案,这次依赖于请求模块而不是urllib2(和所有其他库):
#!/usr/bin/env python

import requests

shorturl = raw_input("Enter the shortened URL in its entirety: ")
r = requests.get(shorturl)

print("""
The shortened URL forwards to:

    %s
""" % r.url)

1
更好的方法是,只需使用以下代码下载标头:r = requests.head(shorturl, allow_redirects=True) - oobug

-1
这是一个 R 语言的解决方案,从本帖其他答案和 RCurl 包中的 example() 代码移植过来的:
unshorten_url <- function(uri){
        require(RCurl)
        if(RCurl::url.exists(uri)){
                # listCurlOptions()
                opts <- list(
                        followlocation = TRUE,  # resolve redirects
                        ssl.verifyhost = FALSE, # suppress certain SSL errors
                        ssl.verifypeer = FALSE, 
                        nobody = TRUE, # perform HEAD request
                        verbose = FALSE
                );
                curlhandle = getCurlHandle(.opts = opts)
                getURL(uri, curl = curlhandle)
                info <- getCurlInfo(curlhandle)
                rm(curlhandle)  # release the curlhandle!
                info$effective.url
        } else {
                # just return the url as-is
                uri
        }
}

-1

Twitter扩展了URL。假设您有一个使用Twitter API编码为JSON文件的单个推文。

import json
urlInfo=[]

tweet=json.loads(tweet)
keyList=tweet.keys() # list of all posssible keys
tweet['entities'] # gives us values linked to entities 

你可以观察到有一个名为“urls”的值 tweet['entities']['urls']#给出映射到键urls的值
urlInfo=tweet['entities']['expanded_url'] # move it to a list
# iterating over the list.. gives shortened URL
# and expanded URL
for item in urlInfo:
  if "url" and "expanded_url" in urlInfo.keys():
    print(item["url"] + " "+item["expanded_url"])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接