使用PythonMechanize通过javascript md5哈希函数登录网页
我正在尝试使用python/mechanize登录此网页: 登录表单使用Javascript函数,该函数在提交结果进行身份验证之前,从多个字段值生成MD5哈希。由于mechanize不能使用javascript,我尝试在python中复制相同的功能,然后提交结果值。但是,我仍然收到“无效用户/密码”错误 这是我目前的密码,有人能告诉我哪里出错了吗?谢谢使用PythonMechanize通过javascript md5哈希函数登录网页,javascript,python,md5,mechanize,autologin,Javascript,Python,Md5,Mechanize,Autologin,我正在尝试使用python/mechanize登录此网页: 登录表单使用Javascript函数,该函数在提交结果进行身份验证之前,从多个字段值生成MD5哈希。由于mechanize不能使用javascript,我尝试在python中复制相同的功能,然后提交结果值。但是,我仍然收到“无效用户/密码”错误 这是我目前的密码,有人能告诉我哪里出错了吗?谢谢 url_login = 'http://www.solaradata.com/cgi-bin/mainProgram.cgi' import
url_login = 'http://www.solaradata.com/cgi-bin/mainProgram.cgi'
import mechanize
import md5
username = 'superfly' #not my real user/pass
password = 'stickyguy' #not my real user/pass
br = mechanize.Browser()
br.open(url_login)
br.select_form(nr=0)
br.set_all_readonly(False)
session = br['session']
br['user'] = username
br['password'] = password
m1 = md5.new()
m1.update(password + username)
br['password'] = m1.digest()
m2 = md5.new()
m2.update(password + session)
br['hash'] = m2.digest()
for form in br.forms():
#print form
request2 = form.click() # mechanize.Request object
try:
response2 = mechanize.urlopen(request2)
except mechanize.HTTPError, response2:
pass
print response2.geturl()
# headers
for name, value in response2.info().items():
if name != "date":
print "%s: %s" % (name.title(), value)
print response2.read() # body
response2.close()
我不熟悉python,但在javascript版本的算法中,它们似乎返回MD5哈希的十六进制值。pythonmd5也做同样的事情吗
您应该能够测试这一点,而无需通过提交过程和成功测试。相反,使用诸如Firebug或Chrome开发工具之类的JavaScript开发工具,计算您在页面中得到的结果。然后,使用相同的输入,看看您从程序中得到了什么。他们应该互相匹配 使用m1.hexdigest()而不是m1.digest()这可能有些过分,但如果您确实需要编写脚本访问大量使用javascript的站点,您可以查看selenium rc或源代码实验室 这些工具允许您编写与用户相同的实际浏览器脚本
抓得好-我没看到这个。名为onSubmit的JavaScript函数实际上非常复杂:函数calcMD5(str){return binl2hex(coreMD5(str2binl(str))}。我读对了吗,它是(1)将字符串转换为二进制,(2)计算MD5哈希,以及(3)将结果转换为base12十六进制?在我看来,这就是它的意思。跳入firebug,执行calcMD5(password.value+user.value);和calcMD5(password.value+session.value)来查看它们得到了什么。在程序中使用相同的输入进行比较。一旦它们完全相同,就可以开始了。我查看了页面中的三个javascript函数(str2binI、coreMD5、binI2hex)的转换,并尝试将它们转换为python,但它们超出了我对javascript的理解:(.@superfly在md5计算后得到的结果的长度是多少?他们的长度是多少?如果他们不同,你肯定知道其中一个md5在做一些不同的事情。另外-格式是什么?你的结果是否只包含字符0-9和A-F?我试过了,但这似乎并不能解决问题(不幸的是)。它应该可以工作:-)HTML使用javascript函数calcMD5。我尝试通过Opera Dragonfly运行该函数:>>>>calcMD5(“a”)“0cc175b9c0f1b6a831c399e269772661”,这与运行时得到的结果相同:>>>m1=md5.new()>>>m1.update(“a”)>>>m1.hexdigest()“0cc175b9c0f1b6a831c399e269772661”如果输入中有高位字符,结果会有所不同。也许这就是问题所在?