2013-01-19 17 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