在尝试屏蔽废弃构建在ASP.NET上的网站时,获取无效的回发或回调参数错误。
登陆页面的拳头请求没有问题。当我在更改其中一个下拉字段值后发布表单数据时,它会引发异常。
"""
Invalid postback or callback argument. Event validation is enabled using
<pages enableEventValidation="true"/> in configuration or <%@ Page
EnableEventValidation="true" %> in a page. For security purposes, this feature
verifies that arguments to postback or callback events originate from the server
control that originally rendered them. If the data is valid and expected, use
the ClientScriptManager.RegisterForEventValidation method in order to register
the postback or callback data for validation.
"""
#!/bin/env python
import sys
import requests
from bs4 import BeautifulSoup
HOST = 'forms.toyotabharat.com'
URL = 'http://%s/pricelist-dealer.aspx' % HOST
HEADERS = {
'Host': HOST,
'Origin': 'http://%s' % HOST,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive'
}
session = requests.Session()
r = session.get(URL, headers=HEADERS)
if r.status_code != requests.codes.ok:
sys.exit()
soup = BeautifulSoup(r.content)
# ASP validation and session fields
view_state = soup.select("#__VIEWSTATE")[0]['value']
view_state_generator = soup.select("#__VIEWSTATEGENERATOR")[0]['value']
event_validation = soup.select("#__EVENTVALIDATION")[0]['value']
FORM_FIELDS = {
'__EVENTTARGET': 'cboState',
'__EVENTARGUMENT': '',
'__LASTFOCUS': '',
'__VIEWSTATE': view_state,
'__VIEWSTATEGENERATOR': view_state_generator,
'__EVENTVALIDATION': event_validation,
'cboState': '3',
'cboCity': '-1',
'hdDealerMaps': 'True',
}
# POST form fields
r = session.post(URL, data=FORM_FIELDS, headers=HEADERS, cookies=r.cookies.get_dict())
if r.status_code != requests.codes.ok:
print "Failed with status_code %d" % r.status_code
sys.exit()
soup = BeautifulSoup(r.content)
答案 0 :(得分:4)
你基本上在正确的轨道上。我让它运行了一些变化。
无效的回发或回调参数。
错误消息非常有用。如果您阅读msdn page,则会有一个提示。
汇总为:不发布不符合GET
在您的情况下意味着如果您选择一个状态,它应该是cboState
选择元素中的一个值。 (例如2不是有效值)
但这在你的例子中是正确的,所以第二点是你的帖子请求中的参数不是无效的。在此示例中,您在发布到cboCity
cboState时不应添加__EVENTTARGET
。
长话短说,您需要使用此表单字段:
FORM_FIELDS = {
'__EVENTTARGET': 'cboState',
'__EVENTARGUMENT': '',
'__LASTFOCUS': '',
'__VIEWSTATE': view_state,
'__VIEWSTATEGENERATOR': view_state_generator,
'__EVENTVALIDATION': event_validation,
'cboState': '3',
'hdDealerMaps': 'True',
}
脚本的更新版本:https://gist.github.com/fliiiix/ea365b96f5ab4ec4d345