我正在尝试通过 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)
有多个问题:
libcURL 似乎无法处理 IRI 或 IDN。在上面代码中给出的情况下,URL 应该被拉长为
https://fr.wikipedia.org/wiki/Colonne_Vendôme
,但 libcurl 返回https://fr.wikipedia.org/wiki/Colonne_Vendme
。我想你可以看出区别。我知道这些 URL 不符合 RFC,但它们很流行,所以我必须能够管理它们。所以我的问题是:
有没有办法强制 libcURL 理解这些 URL?有没有办法强制编码?有没有办法在请求对 URL 进行编码之间工作?URL 片段或锚点 (#) 也存在问题。如果最终 URL 包含一个片段,libcurl 会在返回答案之前对其进行修剪。它以 HTTP 方式有意义,因为不应该将任何片段发送到服务器,但我当然需要这些部分。不是因为锚点很重要,而是因为如果这个 URL
http://goo.gl/I8AYpW
被拉长到https://groups.google.com/forum/
它绝对没用。所以我的问题是:
有没有办法在最后得到片段?有没有办法获取最后请求的 URL(所以,使用片段)?再一次,有没有办法在请求之间工作以保存最终片段?有一些站点不适用于这种延长器。像那些网站一样:
http://t.co/Gej1JY3sgf
返回一个带有空响应的 HTTP 301,但在浏览器中工作
http://t.co/3Ek7U438Ee
返回一个 HTTP 303,但在浏览器
http://tinyurl.com/lvyapao
中工作不会被拉长(如任何 tinyurl)。
你对这些有什么建议或提示吗?
我正在寻找的是做好的代码。所以我不喜欢权宜之计,但如果没有其他解决方案,我会使用那些。如果你告诉我有比 libcurl 更好的方法,我可以废弃 pycURL。但我不能废弃 Python。
所以,如果你有什么,我会接受的。我不知道现在该做什么。
编辑 :
最后,更新:
对于这个,Twitter 上有一个安全问题。我试图延长 t.co URL,但如果您使用 wget/curl/etc,Twitter 不会返回相同的 URL。东西与 HTTP/JS 的东西。由于这是一个安全问题,我赢得了赏金,但直到一周前才说出来:https ://hackerone.com/reports/34084
对于这个,下面的答案解决了我的问题。这就是为什么他赢了。
没有针对此问题的全局解决方案,因为必须逐案处理。