通过昨天写的python脚本,我已经注册激活了50个box.net账号,用作上传文件。
今天我继续写代码,用来自动登录box.net并获取所有文件的分享链接。
不过测试的时候出现了点问题,账号信息正确,但总是登录不成功。
headers中referer、user-agent都有伪造,cookie也有发送。
通过设置debuglevel=1跟踪http请求,最终发现了问题:
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
self.opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2很聪明,在发现HttpResponse中有重定向(301, 302)时会自动转向请求这个新的URL,
但urllib2有个严重的问题,它没有带着cookie去请求新的URL。
这也是说,前期我们通过一个POST请求来获取cookie(对应着服务器上的session),
但urllib2却没有带着必要的cookie去访问需要授权的页面。
一开始我是想直接用httplib的,考虑到前后一致性才全部用urllib2,结果urllib2又出问题。。。
解决这个问题,可以:
1. 换httplib来实现,它不会像urllib2会自动处理重定向,cookie不会丢
2. 截获重定向,禁止urllib2自动处理
我选择了重写urllib2.HTTPRedirectHandler的http_error_302方法,截获302,让urllib2不再处理302:
class HttpRedirect_Handler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
pass
然后在urllib2.build_opener方法中用HttpRedirect_Handler的一个实例做参数,例如:
self.opener = urllib2.build_opener(HttpRedirect_Handler(),
urllib2.HTTPCookieProcessor(self.cookie))
这样,当我们用上述opener去POST登录时,遇到302就不会再自动转向了,
登录成功获取到的cookie也不会丢。
后面再带着self.cookie去请求需要授权的页面,就可以获取到正确的内容了。