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

Java:如何轻松检查URL是否已缩短?,java,url-shortener,Java,Url Shortener,如果我有这样一个通用url(不限于twitter或谷歌): http://t.co/y4o14bI 是否有一种简单的方法来检查此url是否缩短 在上述情况下,作为一个人,我当然可以看到它是缩短的,但有没有一种自动且优雅的方法?如果您知道可以用来缩短URL的所有域,请检查它是否包含: String[] domains = {"bit.ly", "t.co"...}; for(String domain : domains){ if(url.startsWith("http://" + dom

如果我有这样一个通用url(不限于twitter或谷歌):

http://t.co/y4o14bI
是否有一种简单的方法来检查此url是否缩短


在上述情况下,作为一个人,我当然可以看到它是缩短的,但有没有一种自动且优雅的方法?

如果您知道可以用来缩短URL的所有域,请检查它是否包含:

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

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

最好的方法是使用已知较短URL的列表,并根据这些URL进行查找

即使这样,你也会有问题。我在个人域wtn.gd中使用bit.ly

因此,也将是一个缩短的网址

您可以执行HTTP头请求,然后检查301/302?

您不能

您只能检查是否列出了几个缩写词,并检查url是否以它开头

您还可以尝试检查url是否短于给定的长度(并且包含路径/查询字符串),但某些较短的url(例如tinyurl)可能比普通站点(aol.com)的url长


我更喜欢已知的短消息列表。

您可以请求URL,查看是否被重定向,如果是,假设这是一个短消息服务。为此,您必须读取HTTP状态代码

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


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

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

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

你不能:你必须根据假设工作

假设:

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

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

评估url并寻找一些线索:

  • 该路径符合某些标准

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


以下是您可以在Java、groovy等中执行的操作

  • 获取要测试的url
  • 使用HttpURLConnection打开url
  • 检查响应代码
  • 如果它是一个有效的代码,例如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!
}

我建议使用android.util.Patterns.WEB\u 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;
}
公共静态列表findUrls(字符串输入){
列表链接=新建ArrayList();
Matcher m=android.util.Patterns.WEB\u URL.Matcher(输入);
while(m.find()){
字符串url=m.group();
添加链接(url);
}
返回链接;
}

否决票对我来说似乎有点苛刻。白名单知道URL缩短服务似乎不是一个坏主意(正如这里投票最多的答案所暗示的)。简单地编辑到+domain+“/”将使bit.lyingbuster.com“攻击”失败;)我认为,没有必要这么激进地否决:)