Twitter 找到t.co链接的目的地
给定一个t.co链接,我如何找到链接解析的位置?例如,如果我有t.co/foo,我需要一个返回domain.com/bar的函数或进程。如果您想从命令行执行此操作,curl的verbose选项将起到帮助作用: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。这只会在应用程序中引入一个依赖项,这是一个潜在的故障点,并且可能会花
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
仅下载HTTP头-I
或-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
.throwsHTTPError: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"])