2013-01-19 44 views
1

我正在嘗試編寫一個Python腳本來將多部分表單發佈到需要通過CAS進行身份驗證的站點。與CAS的多部分形式的Python客戶端

有兩個解決問題的一部分,兩種方法:

  1. Python的requests庫可以很好地用於提交多聯表格。

  2. 有caslib,有login功能。它返回一個OpenerDirector,它可能被用於進一步的請求。

不幸的是,我不知道如何得到一個完整的解決方案,我到目前爲止。 幾小時的研究只有一些想法;我願意接受任何有效的解決方案。

感謝您的幫助。

回答

0

你可以使用poster準備的multipart/form-data的。儘量海報的揭幕戰傳遞給caslib和使用caslib的揭幕戰提出要求(未測試):

import urllib2 

import caslib 
import poster.encode 
import poster.streaminghttp 

opener = poster.streaminghttp.register_openers() 
r, opener = caslib.login_to_cas_service(login_url, username, password, 
             opener=opener)  
params = {'file': open("test.txt", "rb"), 'name': 'upload test'} 
datagen, headers = poster.encode.multipart_encode(params) 
response = opener.open(urllib2.Request(upload_url, datagen, headers)) 
print response.read() 
+0

我試過了,帖子沒有用,但我認爲問題是其他的東西,像一些標題的東西或東西。但我至少通過了CAS安全,所以我認爲@ J.F。塞巴斯蒂安的答案是正確的... –

0

您可以使用caslib爲請求編寫身份驗證處理程序。然後,你可以這樣做:

auth = CasAuthentication("url", "login", "password") 
response = requests.get("http://example.com/cas_service", auth=auth) 

或者,如果你正在做對網站的請求噸:

s = requests.session() 
s.auth = auth 

s.post('http://casservice.com/endpoint', data={'key', 'value'}, files={'filename': '/path/to/file'}) 
+0

我在這裏有點小菜。編寫AuthenticationHandler需要什麼? –

+0

不是一個可怕的地段。這裏提供了一個基礎混合。 –

1

我接受JF Sebastian的答案,因爲我認爲這是最接近於我問,但其實我清盤通過使用mechanize,用於Web瀏覽器自動化的Python庫來使它工作。

import argparse 
import mechanize 
import re 
import sys 

# (SENSITIVE!) Authentication info 
username = r'username' 
password = r'password' 

# Command line arguments 
parser = argparse.ArgumentParser(description='Submit lab to CS 235 site (Winter 2013)') 
parser.add_argument('lab_num', help='Lab submission number') 
parser.add_argument('file_name', help='Submission file (zip)') 
args = parser.parse_args() 

# Go to login site 
br = mechanize.Browser() 
br.open('https://cas.byu.edu/cas/login?service=https%3a%2f%2fbeta.cs.byu.edu%2f~sub235%2fsubmit.php') 

# Login and forward to submission site 
br.form = br.forms().next() 
br['username'] = username 
br['password'] = password 
br.submit() 

# Submit 
br.form = br.forms().next() 
br['labnum'] = list(args.lab_num) 
br.add_file(open(args.file_name), 'application/zip', args.file_name) 
r = br.submit() 

for s in re.findall('<h4>(.+?)</?h4>', r.read()): 
    print s 
+0

你應該將這個答案標記爲已接受,因爲其他答案不適合你。 – jfs