2015-02-10 6 views
3

У меня есть сценарий Python, который не сортирует URL-адреса на основе ответа, отправленного here. До сих пор это работало довольно хорошо, например, с youtu.be, goo.gl, t.co, bit.ly и tinyurl.com. Но теперь я заметил, что он не работает для собственного URL-фильтра Flickr flic.kr.Unshorten Flic.kr URLs

Например, когда я ввожу URL

https://flic.kr/p/qf3mGd 

в браузере, я получаю правильно перенаправлены

https://www.flickr.com/photos/[email protected]/15911453212/ 

Однако, при использовании в unshorten тот же URL с помощью сценария Python, я получаю следующие переадресации

https://flic.kr/p/qf3mgd 
http://www.flickr.com/photo.gne?short=qf3mgd 
http://www.flickr.com/signin/?acf=%2Fphoto.gne%3Fshort%3Dqf3mgd 
https://login.yahoo.com/config/login?.src=flickrsignin&.pc=8190&.scrumb=[...] 

таким образом, заканчивая на странице входа Yahoo. Unshort.me, кстати, может правильно удалить URL. Что мне здесь не хватает?

Вот полный исходный код моего сценария. Я наткнулся на некоторых патологических случаях с оригинальным сценарием:

import urlparse 
import httplib 


def unshorten_url(url, max_tries=10): 
    return __unshorten_url(url, [], max_tries) 

def __unshorten_url(url, check_urls, max_tries): 
    if max_tries == 0: 
     if len(check_urls) > 0: 
      return check_urls[0] 
     return url 
    if url in check_urls: 
     return url 
    unshortended = '' 
    try: 
     parsed = urlparse.urlparse(url) 
     h = httplib.HTTPConnection(parsed.netloc) 
     h.request('HEAD', url) 
    except: 
     return None 
    try: 
     response = h.getresponse() 
    except: 
     return url 


    if response.status/100 == 3 and response.getheader('Location'): 
     unshortended = response.getheader('Location') 
    else: 
     return url 
    #print max_tries, unshortended 
    if unshortended != url: 
     if 'http' not in unshortended: 
      return url 
     check_urls.append(url) 
     return __unshorten_url(unshortended, check_urls, (max_tries-1)) 
    else: 
     return unshortended 

print unshorten_url('http://t.co/5skmePb7gp') 

EDIT: Полный рабочий пример с t.co URL

+1

Ммм ... это не полный сценарий, и ошибка, скорее всего, за пределами здесь. Не могли бы вы избавиться от некоторых некритических бит и опубликовать более полный образец кода? –

+1

Изменил его на автономный скрипт – Christian

ответ

3

Я использую запрос [0], а не HTTPLIB таким образом, и это прекрасно работает с https://flic.kr/p/qf3mGd как URLs:

>>> import requests 
>>> requests.head("https://flic.kr/p/qf3mGd", allow_redirects=True, verify=False).url 
u'https://www.flickr.com/photos/[email protected]/15911453212/' 

[0]

+1

Это действительно отлично работает и делает мои методы в основном устаревшими :). Большое спасибо! – Christian