在 ASP.net 网站上使用 robobrowser

Using robobrowser on ASP.net website

我已经为此工作了几天。无法真正找到如何使这项工作。我对 aspx 网站和从中获取信息还很陌生。

我正在尝试 login/authenticate 在使用 aspx 页面的网站上。所以我遵循了这个 thread 这真的帮助我启动了它。 (最后一个答案)

按照这些指示,我写:

url = "http://samplewebsite/Main/Index.aspx" # Logon page
username = "user"
password = "password"

browser = RoboBrowser(history=True)
# This retrieves __VIEWSTATE and friends
browser.open(url)
signin = browser.get_form(id='form1')
print(signin)

这是打印语句的结果:

<RoboForm __VIEWSTATE=/wEPDwULLTE5ODM2NTU1MzJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQlidG5TdWJtaXRriD1xvrfrHuJ/0xbQM08yEjyoUg==, __VIEWSTATEGENERATOR=E78488FE, adminid=, btnSubmit=, pswd=>

所以很明显我正在正确检索信息。现在我有 3 个输入字段:

adminid
btnSubmit
pswd

我可以通过以下方式使用它:

signin["adminid"].value = username
signin["pswd"].value = password
signin["btnSubmit"].value = "btnSubmit.x=29&btnSubmit.y=22"

我唯一的问题是最后一个字段 btnSubmit,我不知道如何输入值,因为它属于以下类型:

<input type="image" name="btnSubmit" id="btnSubmit" tabindex="3" src="../image/login_btn.gif" style="height:41px;width:57px;border-width:0px;" />

当我在网站上提交时,使用 Chrome 工具我得到以下结果:

    __VIEWSTATE:/wEPDwULLTE5ODM2NTU1MzJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQlidG5TdWJtaXRriD1xvrfrHuJ/0xbQM08yEjyoUg==
__VIEWSTATEGENERATOR:E78488FE
adminid:user
btnSubmit.x:23
btnSubmit.y:15
pswd:password

基本上 x,y 位置就是我在页面上单击的位置。真不知道如何通过Python做这个请求。使用 this 无济于事。

当你点击image类型的输入对象时,会设置两个表单值,按钮名称加上.x为第一个,和.y 另一个。

但是,在常规文本输入字段中按 Enter 也会提交表单,因此您 没有 单击一个提交按钮。我只是将值完全留空。

robobrowser 处理表单提交的方式没有太多灵活性,要避免使用提交按钮,您必须将其从表单中彻底删除:

del signin.fields['btnSubmit']

提交之前。

如果您必须使用图像按钮提交,那么您将必须教会 Robobrowser 如何处理该类型;目前它没有处理这些。下面补充说:

from functools import wraps
from robobrowser.forms import form
from robobrowser.forms.fields import Submit, Input

class ImageSubmit(Submit):
    def serialize(self):
        return {self.name + '.x': '0', self.name + '.y': '0'}

def include_image_submit(parse_field):
    @wraps(parse_field)
    def wrapper(tag, tags):
        field = parse_field(tag, tags)
        if type(field) is Input:  # not a subclass, exactly this class
            if field._parsed.get('type') == 'image':
                field = ImageSubmit(field._parsed)
        return field
    return wrapper

form._parse_field = include_image_submit(form._parse_field)

此时您可以使用 browser.submit_form(signin, signin['btnSubmit']) 提交表单,正确的字段将被包括在内。

我已向 robobrowser 项目提交 pull request 以添加图像提交支持。