4

我正在尝试使用 python / mechanize 登录到这个网页: http: //www.solaradata.com/cgi-bin/mainProgram.cgi

登录表单使用 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()
4

3 回答 3

1

使用 m1.hexdigest() 而不是 m1.digest()

于 2010-11-22T20:57:20.497 回答
0

这有点矫枉过正,但如果你真的需要编写脚本访问一个 javascript 繁重的网站,你可以查看 selenium-rc 或源实验室。

这些工具允许您像用户一样编写实际浏览器的脚本。

于 2010-11-23T00:16:16.643 回答
0

我不熟悉python,但似乎他们在算法的javascript版本中返回了MD5哈希的十六进制值。python MD5 做同样的事情吗?

您应该能够在不经过提交过程和测试成功的情况下对此进行测试。相反,使用诸如 Firebug 或 Chrome 开发者工具之类的 JavaScript 开发者工具,计算您在页面中获得的结果。然后,使用相同的输入,看看你从你的程序中得到了什么。他们应该匹配,一个字符一个字符。

于 2010-11-22T20:47:37.087 回答