Веб-очистка защищенного паролем сайта с использованием Ghost.py
Я пытаюсь получить содержимое HTML сайта, защищенного паролем, используя Ghost.py.
Веб-сервер, к которому у меня есть доступ, имеет следующий 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" меняется каждый раз, когда вы загружаете страницу.
В обычном браузере, после того, как вы введете правильный пароль и нажмете ввод или нажмете кнопку "отправить", вы окажетесь на той же странице, но теперь с реальным содержанием.
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
Этот код не загружает содержимое правильно, в консоли я получаю:
Traceback (последний вызов был последним): файл "", строка 8, в файле "/usr/local/lib/python2.7/dist-packages/ghost/ghost.py", строка 181, в таймере оболочки =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, в wait_for повышение TimeoutError(timeout_message) ghost.ghost.TimeoutError: невозможно загрузить запрашиваемую страницу
Два вопроса...
1) Как я могу успешно войти на сайт, защищенный паролем, и получить реальный контент PAGE.htm?
2) Является ли это направление лучшим путем? Или я что-то упускаю полностью, что заставит вещи работать более эффективно?
Я использую Ubuntu Mate.
1 ответ
Это не тот ответ, который я искал, просто обходной путь, чтобы это сработало (на случай, если у кого-то еще возникнет аналогичная проблема в будущем).
Чтобы пропустить часть javascript (которая мешала мне использовать запрос python), я решил сделать ожидаемый хеш на python (а не в сети) и отправить хеш, как это сделала бы обычная веб-форма.
Таким образом, 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 - это элементы, которые отправляет форма (q=&q=&pA=f08b97e5e3f472fdde4280a9aa408aaa) при обычном входе в систему с использованием интернет-браузера.
Однако, если кто-то знает ответ на мой оригинальный вопрос, я был бы очень признателен, если бы вы опубликовали его здесь.