1

我正在尝试通过 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。我想你可以看出区别。我知道这些 URL 不符合 RFC,但它们很流行,所以我必须能够管理它们。所以我的问题是:
    有没有办法强制 libcURL 理解这些 URL?有没有办法强制编码?有没有办法在请求对 URL 进行编码之间工作?

  2. URL 片段或锚点 (#) 也存在问题。如果最终 URL 包含一个片段,libcurl 会在返回答案之前对其进行修剪。它以 HTTP 方式有意义,因为不应该将任何片段发送到服务器,但我当然需要这些部分。不是因为锚点很重要,而是因为如果这个 URLhttp://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,Twitter 不会返回相同的 URL。东西与 HTTP/JS 的东西。由于这是一个安全问题,我赢得了赏金,但直到一周前才说出来:https ://hackerone.com/reports/34084

  2. 对于这个,下面的答案解决了我的问题。这就是为什么他赢了。

  3. 没有针对此问题的全局解决方案,因为必须逐案处理。

4

1 回答 1

-1

这个 libcurl 的东西看起来并不像它会起作用。我会使用包请求

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
于 2014-10-28T16:26:36.163 回答