2016-06-19 6 views
2

Я использую twill для навигации по сайту, защищенному формой входа.Python twill: скачать файл, доступный через PHP-скрипт

from twill.commands import * 

go('http://www.example.com/login/index.php') 
fv("login_form", "identifiant", "login") 
fv("login_form", "password", "pass") 
formaction("login_form", "http://www.example.com/login/control.php") 
submit() 
go('http://www.example.com/accueil/index.php') 

На этой последней странице я хочу, чтобы загрузить файл Excel, который доступен через div со следующим атрибутом:

onclick="OpenWindowFull('../util/exports/control.php?action=export','export',200,100);" 

С twill я в состоянии получить доступ к URL в PHP скрипт и покажите содержимое файла.

go('http://www.example.com/util/exports/control.php?action=export') 
show() 

Однако строка возвращается в соответствии с исходным содержимым: при этом непригодна для использования. Есть ли способ получить непосредственно файл Excel способом, подобным urllib.urlretrieve()?

+0

Похоже похож на http://stackoverflow.com/questions/16283799/how-to-read- a-csv-file-from-a-url-python – dmitryro

+0

Не совсем: в этом случае доступ к сайту защищен паролем. Мне нужно отправить форму входа. Таким образом, используя 'twill'. (Я бы предпочел использовать 'запросы', но, похоже, запутанный контроль над заголовками входа и после многих попыток я мог заставить его работать только с' twill'. –

+0

EDIT: Я редактировал свой вопрос: файл находится в формате MS Excel, а не в CSV, поэтому двоичные данные ... –

ответ

1

Мне удалось сделать это, отправив банку с печеньем от twill до requests.

Nota: Я не мог использовать requests только из-за сложного элемента управления при входе в систему (не смог определить правильные заголовки или другие параметры).

import requests 
from twill.commands import * 

# showing login form with twill 
go('http://www.example.com/login/index.php') 
showforms() 

# posting login form with twill 
fv("login_form", "identifiant", "login") 
fv("login_form", "password", "pass") 
formaction("login_form", "http://www.example.com/login/control.php") 
submit() 

# getting binary content with requests using twill cookie jar 
cookies = requests.utils.dict_from_cookiejar(get_browser()._session.cookies) 
url = 'http://www.example.com/util/exports/control.php?action=export' 

with open('out.xls', 'wb') as handle: 
    response = requests.get(url, stream=True, cookies=cookies) 

    if not response.ok: 
     raise Exception('Could not get file from ' + url) 

    for block in response.iter_content(1024): 
     handle.write(block)