Java:如何轻松检查URL是否已缩短?

时间:2011-11-16 11:48:51

标签: java url-shortener

如果我有这样的一般网址(不限于推特或谷歌):

http://t.co/y4o14bI

有没有简单的方法来检查这个网址是否缩短了?

在上面的例子中,我作为一个人当然可以看到它是短的,但是有一种自动的优雅的方式吗?

10 个答案:

答案 0 :(得分:10)

您可以对URL进行请求,看看是否重定向,如果是,则假设它是缩短服务。为此,您必须阅读HTTP状态代码。

另一方面,您可以将一些URL缩短服务(t.co,bit.ly等)列入白名单,并假设缩短了到这些域的所有链接。

第一种方法的缺点是不确定,有些网站在内部使用重定向。第二种方法的缺点是你必须不断添加缩短服务,尽管只有少数被广泛使用。

答案 1 :(得分:2)

一个信号可能是请求URL并查看它是否导致重定向到另一个域。但是,如果没有对“缩短”意味着什么的明确定义,就没有通用的方法。

答案 2 :(得分:1)

如果您知道可用于缩短网址的所有域名,请检查其是否包含:

String[] domains = {"bit.ly", "t.co"...};
for(String domain : domains){
  if(url.startsWith("http://" + domain)){
    return true;
  }
}
return false;

答案 3 :(得分:1)

你做不到。

您只能检查是否列出了几个短片,并检查网址是否以开头。

您还可以尝试检查网址是否短于给定长度(并包含路径/查询字符串),但是某些缩短程序(例如tinyurl)可能比正常网站(aol.com)具有更长的网址

我更喜欢已知缩短剂的清单。

答案 4 :(得分:1)

你不能:你必须按照假设工作。

假设:

  • 网址中是否存在www
  • 服务器名称是否以有效域名结尾(例如comedu等),或者是否co.xx xx是有效的国家/地区或组织代码。

您可以根据其他网址缩短链接添加更多假设。

答案 5 :(得分:1)

这是你可以用Java,groovy等做的事情。

  • 获取您要测试的网址;
  • 使用HttpURLConnection打开网址
  • 检查回复代码
  • 如果它是一个有效的代码,例如200,你可以从连接对象中检索长形式的url字符串(如果它已缩短)或者以原始形式返回(如果不是)。

我们都很乐意看到一些代码不是我们。它原油,但是嘿!

String addr = "http://t.co/y4o14bI";
URL url = new URL(addr);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

if (connection.getResponseCode() == 200) {
    String longUrl = connection.url;
    System.out.println(longUrl);
} else {
    // You decide what you want to do here!
}

答案 6 :(得分:0)

实际上,你作为一个人,不可能。您知道缩短它的唯一方法是它是一个t.co域。对于您所知道的,y4o14bI可以是CMS标识符。

最好的方法是使用已知的缩短网址列表,然后查找。

即便如此,你也会有问题。我将bit.ly用于个人域名,wtn.gd

所以http://wtn.gd/random也是一个缩短的网址。

您可以执行HTTP HEAD请求,并检查301/302?

答案 7 :(得分:0)

如果您请求这样的网址,您的HttpCLient应该会收到HTTP重定向而不是HTML网页。这不是证据,但至少是一个暗示。

答案 8 :(得分:0)

评估网址并寻找一些线索:

  • 路径符合某些标准

    • 只有一步(即不是多个斜杠)
    • 不以文件扩展名结尾
    • 不超过X个字符(需要评估各种URL缩短服务并调整最大令牌长度的上限)
  • HttpUrlConnection返回重定向responseCode(即301,302)

答案 9 :(得分:0)

我建议使用android.util.Patterns.WEB_URL

public static List<String> findUrls(String input) {
    List<String> links = new ArrayList<>();

    Matcher m =  android.util.Patterns.WEB_URL.matcher(input);
    while (m.find()) {
        String url = m.group();
        links.add(url);
    }
    return links;
}