2014-09-15 7 views
0

Я разработал PHP-скрипт для доставки файла после аутентификации.Автоматизация HTTP POST/GET 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://docs.python-requests.org/en/latest/) по urllib. Вероятно, вы столкнетесь с меньшими проблемами – Willyfrog

ответ

1

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