python-3.x - 使用 python 请求对 POST 请求进行“视图状态 MAC 验证失败”
问题描述
我正在使用 python 请求向 aspx 表中的后续页面发送 POST 请求。响应:“b'306|error|500|viewstate MAC 验证失败。如果此应用程序由 Web Farm 或群集托管,请确保配置指定相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。\r \n\r\n有关详细信息,请参阅 http: //go.microsoft.com/fwlink/ ?LinkID=314055 。|' "
我能够成功执行 POST 请求以登录并检索结果的第一页。每个后续页面的链接都是一个“__doPostBack”JavaScript 请求。我使用相同的逻辑来检索 __VIEWSTATE、__EVENTVALIDATION 和 __VIEWSTATEGENERATOR 以与 POST 请求一起传递,但得到 MAC 错误。
应该返回第二页结果,就好像我点击了页面中的以下链接一样:
"javascript:__doPostBack('ctl00$ContentPlaceHolder1$TabControl1$ViewRecords1$OrderStatus1$DataGrid1$ctl01$ctl01','')"
import requests
from bs4 import BeautifulSoup
headers = { 'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0'}
with requests.Session() as s:
url = "https://www.wavecontactlenses.com/waveioss/"
r = s.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'html5lib')
##get view state value
view_state = soup.find_all("input", {"id":"__VIEWSTATE"})[0]["value"]
event_validation = soup.find_all("input", {"id":"__EVENTVALIDATION"})[0]["value"]
view_state_generator = soup.find_all("input", {"id":"__VIEWSTATEGENERATOR"})[0]["value"]
login_data = {
'__EVENTTARGET' : '',
'__EVENTARGUMENT' : '',
'__VIEWSTATE' : view_state,
'__VIEWSTATEGENERATOR' : view_state_generator,
'__EVENTVALIDATION' : event_validation,
'TextBoxUserId' : 'xxxxxxxx',
'TextBoxPassword' : 'xxxxxx',
'ButtonLogin' : 'login+to+WaveIOSS'
}
r = s.post(url, data=login_data, headers=headers)
soup = BeautifulSoup(r.content, 'html5lib')
#This request is successful and first page is displayed
url = "https://www.wavecontactlenses.com/waveioss/main.aspx"
## get view state value
view_state = soup.find_all("input", {"id":"__VIEWSTATE"})[0]["value"]
event_validation = soup.find_all("input", {"id":"__EVENTVALIDATION"})[0]["value"]
view_state_generator = soup.find_all("input", {"id":"__VIEWSTATEGENERATOR"})[0]["value"]
target = 'ctl00$ContentPlaceHolder1$TabControl1$ViewRecords1$OrderStatus1$DataGrid1$ctl01$ctl02'
login_data.clear()
login_data = {
'ct100$ScriptManager1' : 'ctl00$UpdatePanelPage|ctl00$ContentPlaceHolder1$TabControl1$ViewRecords1$OrderStatus1$DataGrid1$ctl01$ctl02',
'__EVENTTARGET' : target,
'__EVENTARGUMENT' : '',
'__VIEWSTATE' : view_state ,
'__VIEWSTATEGENERATOR' : view_state_generator,
'__EVENTVALIDATION' : event_validation,
'__ASYNCPOST' : 'true'
'ct100@ContentPlaceHolder1$TabControl1$ViewRecords1$OrderStatus1$Status1' : 'LAB'
}
headers['Referer'] = r.request.url
##this request returns the MAC validation error
r = s.post(url, data=login_data, headers=headers, cookies=r.cookies.get_dict())
print(r.content)
解决方案
- 如果您使用 request.Session(),则无需关心 cookie
- 您可以通过一次为会话设置通用标题
s.headers.update({'User-Agent': 'Mozilla...
- 检查您是否
__VIEWSTATEENCRYPTED
通过开发人员工具-> 网络单击浏览器中的第二页,并使用设置的字段发布它,即使它是空的!
推荐阅读
- mongodb - Spring Boot - 将计划作业作为单独的进程运行
- javascript - 错误 - 操作必须是普通对象。使用自定义中间件进行异步操作
- android - 在 values-es 文件夹中找不到符号变量
- reactjs - 为什么我不能在 react js 中调用函数
- typescript - 如何返回一个通用的 Promise 类型?
- javascript - 如果有图像,如何捕获 jquery ui 自动完成的选择事件?
- spring - 如何使用休息模板 Spring 发送带有 Google guava 多地图数据的发布请求?
- apache-pig - 分组后如何让 SUM() 工作并有包?
- html - 屏幕阅读器、标签和选择菜单
- arrays - 反应输入复选框 - 不切换状态更改