Twitter 找到t.co链接的目的地

Twitter 找到t.co链接的目的地,twitter,url-shortener,Twitter,Url Shortener,给定一个t.co链接,我如何找到链接解析的位置?例如,如果我有t.co/foo,我需要一个返回domain.com/bar的函数或进程。如果您想从命令行执行此操作,curl的verbose选项将起到帮助作用: curl -v <url> curl-v 为您提供HTTP回复。对于t.co,它似乎给了您一个HTTP/301回复(永久移动)。然后,还有一个位置字段,它指向缩短后的URL。我将远离您无法控制的外部API。这只会在应用程序中引入一个依赖项,这是一个潜在的故障点,并且可能会花

给定一个t.co链接,我如何找到链接解析的位置?例如,如果我有t.co/foo,我需要一个返回domain.com/bar的函数或进程。

如果您想从命令行执行此操作,curl的verbose选项将起到帮助作用:

curl -v <url>
curl-v

为您提供HTTP回复。对于t.co,它似乎给了您一个HTTP/301回复(永久移动)。然后,还有一个位置字段,它指向缩短后的URL。

我将远离您无法控制的外部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);
}
我相信这可以适应其他语言,甚至可以在UNIXy系统上使用
curl
命令编写脚本


curl-s-o/dev/null--head-w“{url\u-effective}\n”-L”https://t.co/6e7LFNBv“

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

    • 这里是一个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)
      
      扩展=


      用try-except结束它,您就可以开始了。

      另一个Python解决方案,这次依赖于请求模块而不是urllib2(以及所有其他库):


      这是一个R解决方案,从该线程中的其他答案和RCurl包的
      example()
      code移植而来:

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

      unsorten\u url您可以尝试此Java代码。这是使用java拥有的HttpURLConnection的代码:
      

      这个URL扩展器将如何工作? 使HttpURLConnection连接到缩短的url(例如)

      提取HTTP头字段“位置”的值。这个值只是扩展的或实际的目标URL


      关闭连接。

      Twitter将扩展URL。假设您有一条使用twitterapi的tweet 编码为json文件

      import json
      urlInfo=[]
      
      tweet=json.loads(tweet)
      keyList=tweet.keys() # list of all posssible keys
      tweet['entities'] # gives us values linked to entities 
      
      您可以观察到有一个名为“URL”的值 tweet['entities']['url']#提供映射到关键URL的值

      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"])
      

      很好的解决方案。我可以建议设置
      CURLOPT_NOBODY=>true
      ,这样就可以执行HEAD请求,而不会实际获取最终资源吗?它不适用于
      http://t.co/OFlTpTzCqt
      .throws
      HTTPError:HTTP错误303:HTTP服务器返回一个重定向错误,该错误将导致无限循环。最后一条30倍的错误消息是:请参阅其他
      更好,只需使用:r=requests.head(shorturl,allow_redirects=True)下载标题。为什么使用-v?它输出一大堆你不需要的信息。curl-I(大写字母I)就足够了。此解决方案不遵循多个重定向。其他一些解决方案可以,例如,我喜欢这个解决方案。它只输出URL(因此无需进一步解析),并遵循多个重定向。实际上,它与PHP中命令行上的解决方案是相同的,对吗?
      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"])