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

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

http://t.co/y4o14bI 

有没有一种简单的方法来检查这个url是否被缩短?

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

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

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

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

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

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

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

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

假设:

  • www是否存在于url中。
  • 服务器名称是以有效域(例如comedu等) co.xx还是具有co.xx ,其中xx是有效的国家或组织代码。

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

你不能。

您只能检查是否列出了几个缩短程序并检查URL是否以它开头

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

我更喜欢已知的缩短剂列表。

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

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

我们都喜欢看到一些代码不是我们。 它原油,但嘿!

 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! } 

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

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

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

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

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

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

评估URL并寻找一些线索:

  • 路径符合某些标准

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