我正在尝试编写一个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。塞巴斯蒂安的答案是正确的... –