Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PythonMechanize通过javascript md5哈希函数登录网页_Javascript_Python_Md5_Mechanize_Autologin - Fatal编程技术网

使用PythonMechanize通过javascript md5哈希函数登录网页

使用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

我正在尝试使用python/mechanize登录此网页:

登录表单使用Javascript函数,该函数在提交结果进行身份验证之前,从多个字段值生成MD5哈希。由于mechanize不能使用javascript,我尝试在python中复制相同的功能,然后提交结果值。但是,我仍然收到“无效用户/密码”错误

这是我目前的密码,有人能告诉我哪里出错了吗?谢谢

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”如果输入中有高位字符,结果会有所不同。也许这就是问题所在?