twitter - shortener - Encuentre dónde va un enlace t.co
tiny url (9)
Dado un enlace t.co, ¿cómo puedo ver dónde se resuelve el enlace? Por ejemplo, si tengo t.co/foo, quiero una función o proceso que devuelva domain.com/bar.
Aquí hay una solución R, portada de otras respuestas en este hilo, y del código de example()
del paquete RCurl:
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
}
}
Aquí hay una solución de 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()
Probado con un enlace de twitter t.co real:
url = "http://t.co/yla4TZys"
expanded = get_real(url)
expandido = http://twitter.com/shanselman/status/276958062156320768/photo/1
Concluye con un intento, excepto y estás listo para ir.
Me mantendría alejado de API externas sobre las cuales no tienes control. Eso simplemente introducirá una dependencia en su aplicación que es un posible punto de falla, y podría costarle dinero para usar.
CURL puede hacer esto bastante bien. Así es como lo hice en 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);
}
Estoy seguro de que esto podría adaptarse a otros idiomas o incluso con guiones con el comando curl
en sistemas UNIXy.
http://jonathonhill.net/2012-05-18/unshorten-urls-with-php-and-curl/
Otra solución de Python, esta vez confiando en el módulo de solicitudes en lugar de urllib2 (y el resto de esas bibliotecas):
#!/usr/bin/env python
import requests
shorturl = raw_input("Enter the shortened URL in its entirety: ")
r = requests.get(shorturl)
print("""
The shortened URL forwards to:
%s
""" % r.url)
Podrías dar unshorten.me una oportunidad. Tiene una API .
JSON :
http://api.unshort.me/?r=http://theshorturl.ly/28292&t=json
Te daría:
{
"requestedURL":"http://theshorturl.ly/28292",
"success":"true",
"resolvedURL":"http://thefullurl.com/a-webiste/what-a-long-url"
}
Puede probar este código de Java. Tal es un código de uso de la HttpURLConnection propiedad de java. : http://www.srccodes.com/p/article/37/expand-shortened-link-using-java?fb_action_ids=1544985322486585&fb_action_types=og.likes
¿Cómo funcionará este expansor de URL? Haga HttpURLConnection a la url acortada (digamos http://goo.gl/WT6eFw ).
Extraiga el valor del campo del encabezado HTTP "Ubicación". Y este valor no es más que la URL de destino expandida o real.
Cierra la conexión.
Si quieres hacerlo desde la línea de comando, la opción verbosa de curl viene al rescate:
curl -v <url>
te da la respuesta HTTP. Para t.co parece darle una respuesta HTTP / 301 (movida permanentemente). Luego, hay un campo de Ubicación, que apunta a la URL detrás del acortado.
Twitter expande la URL. Supongamos que tiene un solo tweet con la API de Twitter codificada como archivo json.
import json
urlInfo=[]
tweet=json.loads(tweet)
keyList=tweet.keys() # list of all posssible keys
tweet[''entities''] # gives us values linked to entities
Puedes observar que hay un valor llamado ''urls'' tweet [''entities''] [''urls''] # da valores asignados a las URL clave
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"])
curl -s -o /dev/null --head -w "%{url_effective}/n" -L "https://t.co/6e7LFNBv"
-
--head
o-I
Solo descargo encabezados HTTP -
-w
o--write-out
imprime la cadena especificada después de la salida -
-L
o--location
ubicación sigue a los encabezados de ubicación