首页 > 解决方案 > 使用 Python 请求向 ASP 提交表单的 MAC 验证错误

问题描述

通过 url fetch 服务从谷歌应用引擎发送 post 请求时,viewstate MAC 的验证失败

您好,我遇到了与这篇文章相同的问题,我正在将表单发布到 ASP.NET 托管网站,以替换 Selenium

  1. 我用 requests.Session()
  2. 使用 session.get() 提取视图状态、事件验证、视图状态生成器并附加到我的表单
  3. 我的get和post之间没有其他请求,viewstate保持不变
  4. cookie 和标头随着会话而略有变化
  5. 我可以通过 Chrome 发布表单,关闭 JavaScript
def get_asp_viewstate(page):
    return {
    '__EVENTTARGET': '',
    '__EVENTARGUMENT': '',
    '__LASTFOCUS': '',
    "__VIEWSTATE":page.xpath('//*[@id="__VIEWSTATE"]//@value')[0],
    "__VIEWSTATEGENERATOR": page.xpath('//*[@id="__VIEWSTATEGENERATOR"]//@value')[0], 
    "__EVENTVALIDATION": page.xpath('//*[@id="__EVENTVALIDATION"]//@value')[0],
    '__VIEWSTATEENCRYPTED': '', #not encrypted
    }


def login():
    #login and return session object
    s = requests.Session()
    res = s.get(login_url)
    r = s.post(login_url, data=login_data, headers=headers)
    return s

#Had logged in 
session = login()

res = session.get(URL, cookies=session.cookies.get_dict())
page = etree.HTML(res.text)
validation = get_asp_viewstate(page)

form_data = {} # some dict
form_data.update(validation)

response = session.post(URL, headers=headers, cookies=cookie3,
 data=form_data, verify=False,allow_redirects=True)

我得到了 http 500 的 100% 尝试。

https://support.microsoft.com/en-us/help/2915218/resolving-view-state-message-authentication-code-mac-errors

此页面列出了一些原因,我确定该应用程序不在多服务器环境中,因为机会是 100%,而不是偶尔。

我想我几乎没有想法了。欢迎任何帮助或建议。

标签: pythonasp.nethttppython-requests

解决方案


推荐阅读