使用libcurl的URL扩展器:IRI/IDN和片段问题

2024-09-29 00:16:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过pycURL使用libcurl编写URL扩展程序(如果您不知道pycURL不会消失,这是libcurl的问题)。
URL扩展器是URL缩短器的反向:目的是获得最终的URL而不留任何重定向,这样我们就可以得到链接的真正域。
下面是我要做的代码:

#!/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。我想你能看出区别。我知道这些网址不符合RFC,但他们是野生的,所以我必须能够管理他们。所以我的问题是:
    有没有办法强迫libcURL理解这些URL?有没有强制编码的方法?请求之间有一种编码方式吗?

  2. URL片段或锚点(#)也有问题。如果最终的URL包含一个片段,libcurl会在返回答案之前对其进行修剪。它在HTTP方式中是有意义的,因为不应该将任何片段发送到服务器,但是我当然需要这些部分。不是因为锚定很重要,而是因为如果这个URL http://goo.gl/I8AYpW被拉长为https://groups.google.com/forum/,它绝对没有用。所以我的问题是:
    有没有办法在最后得到碎片?有没有一种方法可以获得最后请求的URL(因此,使用片段)?再说一次,有没有一种方法可以在请求之间工作来保存最后的片段?

  3. 有几个网站不能很好地与这种拉长机。像那些网站:
    http://t.co/Gej1JY3sgf返回HTTP 301,响应为空,但可在浏览器中工作
    http://t.co/3Ek7U438Ee返回HTTP 303,但可在浏览器中工作
    http://tinyurl.com/lvyapao不会被拉长(就像任何tinyurl一样)。
    你对此有什么建议或提示吗?

我要做的是做好代码。所以我不喜欢权宜之计,但如果没有其他解决办法,我会用那些。如果你告诉我有比libcurl更好的方法,我可以放弃pycURL。但我不能抛弃Python。在

所以,如果你有什么东西,我就要了。我不知道现在该怎么办。在

编辑:

最后,更新:

  1. 这一次,Twitter上有一个安全问题。我试图拉长t.co的URL,但是如果你使用wget/curl/etc.stuff而不是HTTP/JS,Twitter不会返回相同的URL。由于这是一个安全问题,我赢得了一笔奖金,但直到一周前才谈到:https://hackerone.com/reports/34084

  2. 对于这个问题,下面的答案解决了我的问题。所以他赢了。

  3. 这个问题没有全局解决方案,因为它必须逐个处理。


Tags: 方法代码httpsimporthttpurlpycurlco
1条回答
网友
1楼 · 发布于 2024-09-29 00:16:15

这个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

相关问题 更多 >