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

用于带有CAS的多部分表单的Python客户端,python,urllib2,cas,python-requests,Python,Urllib2,Cas,Python Requests,我正在尝试编写一个Python脚本,将多部分表单发布到需要通过CAS进行身份验证的站点 有两种方法都可以解决部分问题: Python库可以很好地提交多部分表单 有一个caslib,带有一个函数。它返回一个OpenerDirectory,该目录可能用于进一步的请求 不幸的是,我不知道如何得到一个完整的解决方案,也不知道到目前为止我有什么。 这只是几个小时的研究得出的一些想法;我对任何可行的解决方案都持开放态度 谢谢您的帮助。您可以使用caslib为请求编写身份验证处理程序。然后你可以做一些类似的事

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

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

  • Python库可以很好地提交多部分表单

  • 有一个caslib,带有一个函数。它返回一个OpenerDirectory,该目录可能用于进一步的请求

  • 不幸的是,我不知道如何得到一个完整的解决方案,也不知道到目前为止我有什么。 这只是几个小时的研究得出的一些想法;我对任何可行的解决方案都持开放态度


    谢谢您的帮助。

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

    您可以使用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的opener传递给caslib,并使用caslib的opener发出请求(未测试):

    您可以使用来准备多部分/表单数据。尝试将poster的opener传递给caslib,并使用caslib的opener发出请求(未测试):


    我接受了J.F.Sebastian的答案,因为我认为它与我所问的最接近,但实际上,我最终还是通过使用Python库实现web浏览器自动化来让它工作

    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
    
    import argparse
    进口机械化
    进口稀土
    导入系统
    #(敏感!)身份验证信息
    username=r'username'
    password=r'password'
    #命令行参数
    parser=argparse.ArgumentParser(description='Submit lab to CS 235 site(2013年冬季)')
    parser.add_参数('lab_num',help='lab submission number')
    parser.add_参数('file_name',help='Submission file(zip)')
    args=parser.parse_args()
    #转到登录站点
    br=mechanize.Browser()
    br.公开发行('https://cas.byu.edu/cas/login?service=https%3a%2f%2fbeta.cs.byu.edu%2f~sub235%2fsubmit.php')
    #登录并转发至提交站点
    br.form=br.forms().next()
    br['username']=用户名
    br['password']=密码
    br.提交()
    #提交
    br.form=br.forms().next()
    br['labnum']=列表(args.lab_num)
    br.添加文件(打开(args.file\u名称)、“应用程序/zip”、args.file\u名称)
    r=br.submit()
    对于re.findall(“(.+?)”,r.read())中的s:
    印刷品
    
    我接受了J.F.Sebastian的答案,因为我认为这与我所问的最接近,但实际上我最终还是使用Python库实现了web浏览器的自动化

    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
    
    import argparse
    进口机械化
    进口稀土
    导入系统
    #(敏感!)身份验证信息
    username=r'username'
    password=r'password'
    #命令行参数
    parser=argparse.ArgumentParser(description='Submit lab to CS 235 site(2013年冬季)')
    parser.add_参数('lab_num',help='lab submission number')
    parser.add_参数('file_name',help='Submission file(zip)')
    args=parser.parse_args()
    #转到登录站点
    br=mechanize.Browser()
    br.公开发行('https://cas.byu.edu/cas/login?service=https%3a%2f%2fbeta.cs.byu.edu%2f~sub235%2fsubmit.php')
    #登录并转发至提交站点
    br.form=br.forms().next()
    br['username']=用户名
    br['password']=密码
    br.提交()
    #提交
    br.form=br.forms().next()
    br['labnum']=列表(args.lab_num)
    br.添加文件(打开(args.file\u名称)、“应用程序/zip”、args.file\u名称)
    r=br.submit()
    对于re.findall(“(.+?)”,r.read())中的s:
    印刷品
    
    我在这里有点不在行。写一个AuthenticationHandler需要什么?不是很多。这里有一个基本的混音,我在这里有点傻。写一个AuthenticationHandler需要什么?不是很多。这里面有一个基本的组合。我试过了,但是帖子没有用,但是我认为问题出在其他方面,比如一些标题之类的东西。但我至少通过了CAS安全检查,所以我认为@J.F.Sebastian的回答是正确的……我试过了,但帖子没有起作用,但我认为问题出在其他方面,比如标题之类的东西。但我至少通过了CAS安全检查,所以我认为@J.F.Sebastian的答案是正确的……鉴于其他答案不适用于你,你可能应该将此答案标记为已接受。鉴于其他答案不适用于你,你可能应该将此答案标记为已接受。