RoboBrowser:如何模拟 asp.net 图像点击启动 POST

RoboBrowser: How to simulate asp.net image-click initiated POST

问题:给定一个 aspx.net 页面,其提交是通过图像点击而不是提交按钮,我如何模拟图像被点击到 post表格。

背景:我需要运行一些针对网站的计划任务(我无法更改代码)。使用 RoboBrowser,我可以登录网站并浏览页面。但是,我有一个案例,用户可以选择通过单击两个图像之一来转动某些东西 on/off。该表单有一个隐藏的提交按钮,可以自动注销用户(不知道为什么),所以我不能使用 browser.submit_form。我已经捕获了在 fiddler 中点击图像时产生的流量,需要在代码中对其进行模拟,但我并不完全确定最好的方法。

系统:Python 3.4,RoboBrowser,网站建立在旧aspx.net技术上

HTML 对于被点击的图像(注意,RainSwitch 只是验证是否做出了选择)

<input src="images\raindrop.jpg" name="imgRainSelect" type="image" id="imgRainSelect" onclick="return RainSwitch();">
<input src="images\sunsphere.jpg" name="imgAutoSelect" type="image" id="imgAutoSelect" onclick="return RainSwitch();">

POST 如在 Fiddler 中所见

__EVENTARGUMENT 
__EVENTTARGET   
__EVENTVALIDATION   /wEWFwLD1ZzCCgKKvpK.........
__VIEWSTATE /wEPDwULLTEyODYzNjEw.........(really long)
__VIEWSTATEGENERATOR    59D0C8B1
imgAutoSelect.x 77
imgAutoSelect.y 77
rpt1$ctl00$chk  6224
rpt1$ctl00$DropDownListRainShutdownDays 0

总体思路:

谢谢,

史蒂夫

我很想完全删除这个问题,因为它没有引起太多兴趣。但是,我在任何地方都找不到这方面的帮助,所以我认为有一天它可能会为某人节省很多工作(如果只有一个人的话)。

我最终不得不制定另一个 post,并在数据中添加视图状态信息。

browser.open(url, 方法='post', 数据=self._get_form_post_data())

def _get_form_post_data(self):
    form = self.browser.get_form('Form1')
    view_state = form['__VIEWSTATE']
    generator = form['__VIEWSTATEGENERATOR']
    validation = form['__EVENTVALIDATION']
    data = dict(
        __EVENTTARGET="",
        __EVENTARGUMENT="",
        __VIEWSTATE=view_state.value,
        __VIEWSTATEGENERATOR=generator.value,
        __EVENTVALIDATION=validation.value,
    )
    data['rpt1$ctl00$chk'] = '6224'
    data['rpt1$ctl00$DropDownListRainShutdownDays'] = '0'
    return data

Fiddler 是一个很棒的工具,可以帮助我找到我需要的东西 post,firefox 的开发工具也是如此。