我正在嘗試編寫一個Python腳本來將多部分表單發佈到需要通過CAS進行身份驗證的站點。與CAS的多部分形式的Python客戶端
有兩個解決問題的一部分,兩種方法:
不幸的是,我不知道如何得到一個完整的解決方案,我到目前爲止。 幾小時的研究只有一些想法;我願意接受任何有效的解決方案。
感謝您的幫助。
我正在嘗試編寫一個Python腳本來將多部分表單發佈到需要通過CAS進行身份驗證的站點。與CAS的多部分形式的Python客戶端
有兩個解決問題的一部分,兩種方法:
不幸的是,我不知道如何得到一個完整的解決方案,我到目前爲止。 幾小時的研究只有一些想法;我願意接受任何有效的解決方案。
感謝您的幫助。
你可以使用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()
您可以使用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'})
我在這裏有點小菜。編寫AuthenticationHandler需要什麼? –
不是一個可怕的地段。這裏提供了一個基礎混合。 –
我接受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
你應該將這個答案標記爲已接受,因爲其他答案不適合你。 – jfs
我試過了,帖子沒有用,但我認爲問題是其他的東西,像一些標題的東西或東西。但我至少通過了CAS安全,所以我認爲@ J.F。塞巴斯蒂安的答案是正確的... –