带CAS的Python多部分表单客户端

1 投票
3 回答
731 浏览
提问于 2025-04-17 13:16

我正在尝试写一个Python脚本,向一个需要通过CAS认证的网站发送一个多部分表单。

目前有两种方法可以部分解决这个问题:

  1. Python的requests库非常适合提交多部分表单。

  2. 还有一个叫caslib的库,它里面有一个登录的功能。这个功能返回一个OpenerDirector,应该可以用来进行后续的请求。

不过,我还没找到一个完整的解决方案,只是经过几个小时的研究得到的一些想法;我对任何有效的解决方案都持开放态度。

谢谢大家的帮助。

3 个回答

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'})
1

我选择了J.F. Sebastian的回答,因为我觉得他的回答最接近我问的问题。不过,实际上我是通过使用mechanize这个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

你可以使用 poster 这个工具来准备一种叫做 multipart/form-data 的数据格式。试着把 poster 的打开器(opener)传给 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()

撰写回答