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
总体思路:
- 感觉我应该能够像用户一样单击图像,但是 browser.follow_link 给我一个类型错误,该对象不可订阅。我假设是因为图像没有 a=href。
- 我的下一个想法是,browser.open(url, method='post', data=data) 我可以制定大部分数据字段,但工作量很大,我觉得因为这是一个常见的操作,所以必须有更简单的方法(我什至不确定它是否会起作用。)
- 我不一定需要你为我写代码,只要让我走上正轨即可。
谢谢,
史蒂夫
我很想完全删除这个问题,因为它没有引起太多兴趣。但是,我在任何地方都找不到这方面的帮助,所以我认为有一天它可能会为某人节省很多工作(如果只有一个人的话)。
我最终不得不制定另一个 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 的开发工具也是如此。
问题:给定一个 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
总体思路:
- 感觉我应该能够像用户一样单击图像,但是 browser.follow_link 给我一个类型错误,该对象不可订阅。我假设是因为图像没有 a=href。
- 我的下一个想法是,browser.open(url, method='post', data=data) 我可以制定大部分数据字段,但工作量很大,我觉得因为这是一个常见的操作,所以必须有更简单的方法(我什至不确定它是否会起作用。)
- 我不一定需要你为我写代码,只要让我走上正轨即可。
谢谢,
史蒂夫
我很想完全删除这个问题,因为它没有引起太多兴趣。但是,我在任何地方都找不到这方面的帮助,所以我认为有一天它可能会为某人节省很多工作(如果只有一个人的话)。
我最终不得不制定另一个 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 的开发工具也是如此。