1

CAS による認証が必要なサイトにマルチパート フォームを POST する Python スクリプトを作成しようとしています。

問題の一部を解決する 2 つのアプローチがあります。

  1. Pythonリクエストライブラリは、マルチパート フォームの送信に適しています。

  2. ログイン機能を備えたcaslibがあります。おそらくさらなるリクエストに使用できる OpenerDirector を返します。

残念ながら、これまでのところ完全な解決策を得る方法がわかりません。数時間の調査から得られたいくつかのアイデアがあります。私は、機能するほぼすべてのソリューションに対してオープンです。

助けてくれてありがとう。

4

3 に答える 3

1

私が尋ねたものに最も近いと思うので、JF Sebastian の回答を受け入れましたが、実際には、Web ブラウザー自動化用の Python ライブラリである mechanizeを使用して動作させることになりました。

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
于 2013-01-24T08:40:04.617 に答える
0

postermultipart/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()
于 2013-01-20T07:29:20.893 に答える
0

caslib を使用して、リクエストの認証ハンドラーを作成できます。次に、次のようなことができます。

auth = CasAuthentication("url", "login", "password")
response = requests.get("http://example.com/cas_service", auth=auth)

または、Web サイトに対して大量のリクエストを行っている場合:

s = requests.session()
s.auth = auth

s.post('http://casservice.com/endpoint', data={'key', 'value'}, files={'filename': '/path/to/file'})
于 2013-01-20T04:09:23.510 に答える