Python中的Mechanize及其如何在未先获取401错误的情况下进行授权
我正在尝试使用Mechanize来自动化与一个非常挑剔的旧系统的交互。特别是,在第一次登录页面之后,每次请求都必须发送授权信息,否则你会被踢出系统。不幸的是,Mechanize似乎只在第一次遇到401未授权错误后才发送授权信息。有没有办法让它每次都发送授权信息呢?
这里有一些示例代码:
br.add_password("http://example.com/securepage", "USERNAME", "PASSWORD", "/MYREALM")
br.follow_link(link_to_secure_page) # where the url is the previous URL
这是我在调试Mechanize时得到的响应:
send: 'GET /securepage HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: example.com\r\nReferer: http://example.com/home\r\nConnection: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\n'
reply: 'HTTP/1.1 401 Unauthorized\r\n'
header: Server: Tandy1000Web
header: Date: Thu, 08 Dec 2011 03:08:04 GMT
header: Connection: close
header: Expires: Tue, 01 Jan 1980 06:00:00 GMT
header: Content-Type: text/html; charset=US-ASCII
header: Content-Length: 210
header: WWW-Authenticate: Basic realm="/MYREALM"
header: Cache-control: no-cache
send: 'GET /securepage HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: example.com\r\nReferer: http://example.com/home\r\nConnection: close\r\nAuthorization: Basic VVNFUk5BTUU6UEFTU1dPUkQ=\r\nUser-Agent: Python-urllib/2.7\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Server: Tandy1000Web
header: Date: Thu, 08 Dec 2011 03:08:07 GMT
header: Connection: close
header: Last-Modified: Thu, 08 Dec 2011 03:08:06 GMT
header: Expires: Tue, 01 Jan 1980 06:00:00 GMT
header: Content-Type: text/html; charset=UTF-8
header: Content-Length: 33333
header: Cache-control: no-cache
问题是,与现代网页应用程序的GET
请求应该发生的情况相反,我首先遇到401错误后,得到了错误的页面。我已经通过CURL和urllib2确认,如果我直接访问这个网址,并在第一次请求中传入授权头,我能得到正确的页面。
有没有什么提示可以告诉Mechanize总是发送授权头,避免第一次的401错误?这个问题需要在客户端解决,我无法修改服务器。
1 个回答
2
from base64 import b64encode
import mechanize
url = 'http://192.168.3.5/table.js'
username = 'admin'
password = 'password'
# I have had to add a carriage return ('%s:%s\n'), but
# you may not have to.
b64login = b64encode('%s:%s' % (username, password))
br = mechanize.Browser()
# # I needed to change to Mozilla for mine, but most do not
# br.addheaders= [('User-agent', 'Mozilla/5.0')]
br.addheaders.append(
('Authorization', 'Basic %s' % b64login )
)
br.open(url)
r = br.response()
data = r.read()
print data
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。