2014-10-28 7 views
1

pycURL을 통해 libcurl을 사용하여 URL 연장기를 코딩하려고합니다 (pycURL이 사라지지 않는지 모르면 libcurl 문제입니다).
URL 연장 기는 URL 단락 기의 반대입니다. 즉, 리다이렉션을하지 않고 최종 도착 URL을 얻는 것이므로 링크의 실제 도메인을 가질 수 있습니다.libcurl을 사용하는 URL 연장 자 : IRI/IDN 및 조각 문제

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import os 
import sys 
import pycurl 
import urllib  

url="https://t.co/0u0Jb2Pw7k" #Wikipedia Colonne Vendôme 

c = pycurl.Curl() 
c.setopt(pycurl.URL, url) 
c.setopt(pycurl.FOLLOWLOCATION, 1) # Allow URL elongation 
c.setopt(pycurl.SSL_VERIFYHOST, 0) 
c.setopt(pycurl.SSL_VERIFYPEER, 0) 
c.setopt(pycurl.MAXREDIRS, 25) 
c.setopt(pycurl.AUTOREFERER, 1) 
c.setopt(pycurl.WRITEFUNCTION, lambda x: None) # No output of body. Don't care 
c.setopt(pycurl.HEADER, 1) # For debug only 
c.setopt(pycurl.VERBOSE, 1) # For debug only 
c.setopt(pycurl.USERAGENT, "Opera/12.02 (X11; Linux i686; Opera Cqcb Style; U; fr-FR) Presto/2.9.201 Version/12.02/AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu") 
c.setopt(pycurl.REFERER, url) 

try: 
    c.perform() 
except: 
    pass 
print c.getinfo(pycurl.HTTP_CODE) , c.getinfo(pycurl.EFFECTIVE_URL) 

여러 문제가 있습니다 :

  1. libcurl에서이 IRI 또는 ​​IDN을 처리 할 수하지 않는 것
    다음은 코드 내가 할 노력하고있어 보이고있다. 위의 코드에서 제공된 경우 URL은 https://fr.wikipedia.org/wiki/Colonne_Vendôme으로 길지 만 libcurl은 https://fr.wikipedia.org/wiki/Colonne_Vend￴me을 반환해야합니다. 나는 당신이 그 차이를 볼 수 있다고 생각합니다. 나는 그 URL이 RFC를 따르지 않는다는 것을 알고 있지만 그들은 야생에 있기 때문에 그들을 관리 할 수 ​​있어야합니다. 그래서 내 질문은 :
    libcURL이 해당 URL을 인식하도록 할 수있는 방법이 있습니까? 인코딩을 강제하는 방법이 있습니까? URL 인코딩 요청간에 작업 할 수있는 방법이 있습니까?

  2. URL 조각 또는 앵커 (#)에도 문제가 있습니다. 최종 URL에 조각이 포함되어 있으면 libcurl은 응답을 반환하기 전에이를 자릅니다. 단편은 서버에 보내지 않아도되지만 HTTP 부분에서는 의미가 있습니다. 물론이 부분이 필요합니다. 앵커가 중요하기 때문이 아니라이 URL http://goo.gl/I8AYpWhttps://groups.google.com/forum/으로 길어지면 절대적으로 쓸모가 없기 때문입니다. 그래서 내 질문 :
    끝에 조각을 가져 오는 방법이 있습니까? 마지막으로 요청 된 URL을 얻을 수있는 방법이 있습니까 (조각과 함께)? 다시 한번, 최종 조각을 저장하기 위해 리퀘스트간에 작업 할 수있는 방법이 있습니까?

  3. 이러한 종류의 신장기에는 효과가없는 사이트가 몇 개 있습니다. 해당 사이트처럼 : 브라우저
    http://t.co/3Ek7U438Ee 대가로
    http://t.co/Gej1JY3sgf 빈 응답 돌려 HTTP 301 만 작동합니다 (모든 티니 URL 등)
    http://tinyurl.com/lvyapao이 신장되지 않는 브라우저에서 HTTP 303 만 작동합니다.
    조언이나 힌트가 있습니까?

내가 찾고있는 것은 좋은 코드입니다. 그래서 나는 헛점을 좋아하지 않는다. 그러나 다른 해결책이 없다면, 나는 그것들을 사용할 것이다. libcurl보다 더 나은 방법이 있다고 말하면 pycURL을 스크랩 할 수 있습니다. 하지만 파이썬을 고칠 수는 없습니다.

네가 가지고 있다면, 내가 가져 가겠다. 나는 지금 무엇을해야할지 모른다.

는 편집 :

마지막으로 업데이트 :이 하나

  1. , 트위터에 보안 문제가 있었다. t.co URL을 길게 늘리려고했지만 트위터가 wget/curl/etc를 사용하는 경우 동일한 URL을 반환하지 않았습니다. 물건 대 HTTP/JS 물건. 보안상의 문제 였기 때문에 1 주일 전까지는 현상금을 받았지만 1 주일 전까지는 말할 수 없었습니다. https://hackerone.com/reports/34084

  2. 이 문제에 대한 아래의 답변은 내 문제를 해결했습니다. 그래서 그가 이겼습니다.

  3. 대소 문자를 구분해야하므로이 문제에 대한 글로벌 해결책은 없습니다.

+0

내가 처음으로 환영 인사를 작성하고 잘 작성된 질문에 대해 박수를 보냅니다. 그러나 나는 당신이 여기서하려고하는 것을 실제로보고 있지 않습니다. 리디렉션 된 URL을 가져 오시겠습니까? – RickyA

+0

고마워요! 예, 리다이렉션을하지 않고 전체 URL, 최종 URL을 얻으려고합니다. 링크를 클릭하기 전에 링크의 실제 도메인을 알아야합니다 (위의 코드를 사용하는 앱에서). 내 게시물을 수정하겠습니다. – Cqoicebordel

답변

-1

이 libcurl 항목은 트릭을 수행하지 않는 것 같습니다. 패키지를 사용하겠습니다. requests :

import requests 

bla = requests.head("https://t.co/0u0Jb2Pw7k", allow_redirects=True) 

print(bla) 
print(bla.url) 

>> <Response [404]> 
>> https://fr.wikipedia.org/wiki/Colonne_Vend%EF%BF%B4me 
+0

흠 ... 당신의 방식대로 작동하지 않는 것 같습니다 : 200 응답이 있어야하고 브라우저에서 URL이 작동하지 않습니다. 하지만 '요청'을 살펴볼 것입니다. 응답이있을 수 있습니다. – Cqoicebordel

+0

그러나 그것은 조각 부분에 대해 작동합니다. 그것은 올바른 방향으로 나아가는 단계입니다! – Cqoicebordel

+0

오랫동안 답변을 드리지 못해 죄송합니다. 위의 내용을 읽으 셨습니다. :) – Cqoicebordel