python — Автоматизация HTTP POST / GET PHP при загрузке файлов с использованием заголовка & amp; ReadFile

Я разработал 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 с аутентификацией.

0

Решение

Прежде всего, я не вижу признаков какого-либо перенаправления 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 выглядят нормально.

1

Другие решения

Других решений пока нет …