RoboBrowser:如何模拟asp.net图像点击发起的POST

时间:2017-06-20 05:02:03

标签: python asp.net robobrowser

问题:给定一个aspx.net页面,其提交是通过图片点击与提交按钮,如何模拟被点击的图像以发布表单。

后台:我需要针对网站运行一些计划任务(我无法更改代码)。使用RoboBrowser,我可以登录该站点并通常浏览页面。但是,我有一个案例,用户可以通过点击两个图像之一来打开/关闭某些东西。该表单有一个隐藏的提交按钮,可以自动注销用户(不知道为什么),所以我不能使用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();">
在Fiddler看到

POST

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

一般性思考

  • 感觉我应该能够以与用户相同的方式单击图像,但是browser.follow_link给了我一个Type错误,该对象不是可订阅的。我假设因为图像没有a = href。
  • 我的下一个想法是, browser.open(url,method =&#39; post&#39;,data = data)我可以为数据制定大部分字段,但它很多工作,我觉得这是因为这是一个常见的操作,所以必须有一个更简单的方法(我甚至不确定它会工作。)
  • 我不一定需要你为我编写代码,只是让我走上正轨。

谢谢,

SteveJ

1 个答案:

答案 0 :(得分:0)

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

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

browser.open(url,method =&#39; post&#39;,data = 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是一个很棒的工具,可以帮助我找到我需要发布的内容,所以firefox&#39;开发工具。