Я разработал PHP-скрипт для доставки файла после аутентификации.
<?php #SERVER.PHP
if (isset($_REQUEST['uname']) && isset($_REQUEST['passwd'])) {
if ($_REQUEST['uname']=='a' && $_REQUEST['passwd']=='a') {
session_start();
session_regenerate_id();
header('Content-Disposition: attachment; filename=fake_name.pdf');
readfile('original_name.pdf');
}
}
?>
<form name="login" action="test.php" method="get">
Username: <input type="text" name="uname"> <br />
Password: <input type="text" name="passwd"> <br />
<input type="submit" name="submit" />
</form>
Поэтому я хочу автоматизировать процесс входа в систему и загрузки, сначала я попытался использовать wget для загрузки файла (fake_name.pdf):
$ wget "http://1.1.1.1/server.php?uname=a&passwd=a"
но он скачал файл с контентом
<form name="login" action="test.php" method="get">
Username: <input type="text" name="uname"> <br />
Password: <input type="text" name="passwd"> <br />
<input type="submit" name="submit" />
</form>
Я мог бы загрузить файл «mask_fname.pdf», в то время как доступ из веб-браузера работает отлично.
Затем я попытался написать скрипт Python, чтобы получить файл, я получаю только HTML-контент.
#py1.py
import httplib, urllib
params = urllib.urlencode({
'uname' : 'a',
'passwd' : 'a'
})
headers = {"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain"}
conn = httplib.HTTPConnection("10.1.1.2:80")
conn.request("GET", "/mdh/test.php?uname=a&passwd=a",
params, headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
print data
conn.close()
#py2.py
import urllib
import urllib2
url = 'http://10.1.1.2/mdh/index.php'
form_data = {'uname': 'a', 'passwd': 'a'}
params = urllib.urlencode(form_data)
response = urllib2.urlopen(url, params)
data = response.read()
print data
Но результат был одинаковым для всех моих попыток. Есть ли другой способ сделать это. Существует ли какой-либо другой подход для автоматизации загрузки файла (fake_name.pdf) с заданным именем пользователя и паролем, кроме автоматизации веб-браузера (ссылка python :: splinter, selenium)?
В конечном итоге мне нужно автоматизировать загрузку файлов с сервера, используя HTTP с аутентификацией.
Прежде всего, я не вижу признаков какого-либо перенаправления HTTP, как это предлагается в заголовке вашего вопроса — конечно, не инициировано в опубликованном вами коде PHP. Как вы думаете, почему происходит перенаправление?
Я думаю, что проблема в server.php
, Есть ли original_name.pdf
на самом деле существует и читается ли server.php
?
Обратите внимание, что форма HTML будет всегда быть включенным в ответ, даже если указаны правильные учетные данные. Это потому, что скрипт PHP не завершается после readfile()
— продолжает, испуская форму HTML.
По этой причине я подозреваю, что readfile('original_name.pdf')
не производит никакого вывода, и, вероятно, потому, что файл PDF не существует или недоступен для сценария.
Вот модифицированная версия вашего server.php
которая исправляет проблему:
<?php #SERVER.PHP
if (isset($_REQUEST['uname']) && $_REQUEST['uname']=='a' &&
isset($_REQUEST['passwd']) && $_REQUEST['passwd']=='a') {
session_start();
session_regenerate_id();
header('Content-Disposition: attachment; filename=fake_name.pdf');
header('Content-type: application/pdf');
readfile('original_name.pdf');
}
else {
?>
<form name="login" action="" method="get">
Username: <input type="text" name="uname"> <br />
Password: <input type="text" name="passwd"> <br />
<input type="submit" name="submit" />
</form>
<?php
}
?>
Обратите внимание, что я добавил заголовок для Content-type: application/pdf
— это поможет браузерам правильно отображать содержимое PDF. Кроме того, форма action
отправлял в test.php
, поэтому я удалил это, и теперь форма будет отправлена обратно server.php
,
Оба ваших скрипта на python выглядят нормально.
Других решений пока нет …