我正在尝试使用Ghost.py获取受密码保护的网站的HTML内容。
我必须访问的Web服务器具有以下HTML代码(我仅将其剪切为重要部分):
URL: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”的值都会更改。
在普通浏览器上,输入正确的密码并按Enter或单击“提交”按钮后,您将进入同一页面,但现在显示的是真实内容。
URL:http://192.168.1.60/PAGE.htm
<html>
<head>
<!–– javascript is gone ––>
</head>
<body>
Welcome to PAGE.htm content
</body>
</html>
首先,我尝试进行机械化,但由于我需要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('timeout',None))文件“ /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,在 等待 引发TimeoutError(timeout_message)ghost.ghost.TimeoutError:无法加载请求的页面
两个问题...
1)如何成功登录受密码保护的网站并获得PAGE.htm的真实内容?
2)这个方向是最好的方法吗?还是我完全错过了一些东西,这些东西会使事情更有效地工作?
我正在使用Ubuntu Mate。
答案 0 :(得分:0)
这不是我正在寻找的答案 ,只是一种变通方法,以使其正常工作(以防将来其他人遇到类似的问题)。
要跳过javascript部分(这阻止了我使用python的请求),我决定在python上(而不是在网络上)执行预期的哈希,并像普通的Web表单一样发送哈希。
因此,JavaScript基本上将隐藏的hpsw_id值和密码连接起来,并从中生成一个md5。
Python现在看起来像这样:
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
注意:当我使用Internet浏览器正常登录时,q,q和pA是表单(q =&q =&pA = f08b97e5e3f472fdde4280a9aa408aaa)发送的元素。
但是,如果有人知道我最初的问题的答案,那么如果您在此处发布它,将不胜感激。