0

我正在尝试使用 Ghost.py 获取受密码保护的站点的 HTML 内容。

我必须访问的 Web 服务器具有以下 HTML 代码(我只将其剪切到重要部分):

网址:http: //192.168.1.60/PAGE.htm

<html>
<head>
<script language="JavaScript">
    function DoHash()
    {
      var psw = document.getElementById('psw_id');
      var hpsw = document.getElementById('hpsw_id');
      var nonce = hpsw.value;
      hpsw.value = MD5(nonce.concat(psw.value));
      psw.value = '';
      return true;
    }
    </script>
</head>
<body>
<form action="PAGE.HTM" name="" method="post" onsubmit="DoHash();">
Access code <input id="psw_id" type="password" maxlength="15" size="20" name="q" value="">
<br>
<input type="submit" value="" name="q" class="w_bok">
<br>
<input id="hpsw_id" type="hidden" name="pA" value="180864D635AD2347">
</form>
</body>
</html>

每次加载页面时,“#hpsw_id”的值都会发生变化。

在普通浏览器上,一旦您输入正确的密码并按回车键或单击“提交”按钮,您将进入同一页面,但现在显示的是真实内容。

网址:http: //192.168.1.60/PAGE.htm

<html>
<head>
<!–– javascript is gone ––&gt;
</head>
<body>
Welcome to PAGE.htm content
</body>
</html>

首先我尝试使用 mechanize 但失败了,因为我需要 javascript。所以现在我正在尝试使用 Ghost.py 来解决它

到目前为止我的代码:

import ghost
g = ghost.Ghost()
with g.start(wait_timeout=20) as session:
    page, extra_resources = session.open("http://192.168.1.60/PAGE.htm")
    if page.http_status == 200:
        print("Good!")
        session.evaluate("document.getElementById('psw_id').value='MySecretPassword';")
        session.evaluate("document.getElementsByClassName('w_bok')[0].click();", expect_loading=True)
        print session.content

此代码未正确加载内容,在控制台中我得到:

回溯(最后一次调用):文件“”,第 8 行,文件“/usr/local/lib/python2.7/dist-packages/ghost/ghost.py”,第 181 行,包装器 timeout=kwargs.pop ('超时',无))文件“/usr/local/lib/python2.7/dist-packages/ghost/ghost.py”,第1196行,在wait_for_page_loaded'无法加载请求的页面',超时)文件“/ usr/local/lib/python2.7/dist-packages/ghost/ghost.py",第 1174 行,在 wait_for 中引发 TimeoutError(timeout_message) ghost.ghost.TimeoutError:无法加载请求的页面

两个问题...

1) 我怎样才能成功登录到受密码保护的站点并获得PAGE.htm的真实内容?

2)这个方向是最好的方法吗?或者我完全错过了一些能让事情更有效地工作的东西?

我正在使用 Ubuntu 伴侣。

4

1 回答 1

0

不是我一直在寻找的答案,只是使其工作的解决方法(以防其他人将来遇到类似问题)。

为了跳过 javascript 部分(这阻止了我使用 python 的请求),我决定在 python 上(而不是在 web 上)进行预期的哈希,并像普通的 web 表单一样发送哈希。

因此,Javascript 基本上将隐藏的 hpsw_id 值和密码连接起来,并从中生成一个 md5。

蟒蛇现在看起来像这样:

import requests
from hashlib import md5
from re import search

url = "http://192.168.1.60/PAGE.htm"
with requests.Session() as s:
    # Get hpsw_id number from website
    r = s.get(url)
    hpsw_id = search('name="pA" value="([A-Z0-9]*)"', r.text)
    hpsw_id = hpsw_id.group(1)
    # Make hash of ID and password
    m = md5()
    m.update(hpsw_id + 'MySecretPassword')
    pA = m.hexdigest()
    # Post to website to login
    r = s.post(url, data=[('q', ''), ('q', ''), ('pA', pA)])
    print r.content

注意:q、q 和 pA 是我使用 Internet 浏览器正常登录时表单 (q=&q=&pA=f08b97e5e3f472fdde4280a9aa408aaa) 发送的元素。

但是,如果有人知道我最初问题的答案,如果您将其发布在这里,我将不胜感激。

于 2018-07-30T14:36:10.813 回答