繁体   English   中英

用于CAS的多部分表单的Python客户端

[英]Python client for multipart form with CAS

我正在尝试编写Python脚本,以将多部分表单发布到需要通过CAS进行身份验证的站点。

有两种方法都可以解决部分问题:

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

  2. 有caslib,具有登录功能。 它返回一个OpenerDirector,可以将其用于其他请求。

不幸的是,我无法弄清楚如何获得迄今为止的完整解决方案。 经过几个小时的研究,只有一些想法。 我对任何可行的解决方案都持开放态度。

谢谢您的帮助。

我接受了JF Sebastian的回答,因为我认为它与我的要求最接近,但实际上,我通过使用机械化 (用于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

您可以使用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'})

您可以使用poster准备多部分/表单数据。 尝试将发帖人的开启程序传递给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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM