Python使用验证令牌向网站发送POST请求

时间:2014-12-15 09:28:32

标签: python post token python-requests verification

我正在使用Python 3.3和Requests库来执行基本的POST请求。

我想模拟如果您从网页手动将信息输入浏览器会发生什么: https://www.dspayments.com/FAIRFAX。例如,在该URL处,输入“x”作为牌照,输入Virginia作为状态。然后网址更改为:https://www.dspayments.com/FAIRFAX/Home/PayOption,它会显示所需的信息(我关心第二个网页的源代码)。

我浏览了上面两个网址的源代码。在第一个网址的文本框中执行“检查元素”我发现了一些需要包含在帖子请求中的内容:{'Plate':“x”,“PlateStateProv”:“VA”,“submit”:“搜索“}。

然后第二个网站(以/ PayOption结尾)有原始的html:

<form action="/FAIRFAX/Home/PayOption" method="post"><input name="__RequestVerificationToken" type="hidden" value="6OBKbiFcSa6tCqU8k75uf00m_byjxANUbacPXgK2evexESNDz_1cwkUpVVePA2czBLYgKvdEK-Oqk4WuyREi9advmDAEkcC2JvfG2VaVBWkvF3O48k74RXqx7IzwWqSB5PzIJ83P7C5EpTE1CwuWM9MGR2mTVMWyFfpzLnDfFpM1" /><div class="validation-summary-valid" data-valmsg-summary="true">

然后我使用上面html中的名称:值对作为post请求的有效负载字典中的键和值。我认为问题是在第二个url中,有“__RequestVerificationToken”,它似乎每次都有一个随机生成的值。

如何正确发布到本网站?一个“正确”的答案是在网站上以“/ PayOption”结尾生成相同的源代码,就好像你手动输入“x”作为牌号,弗吉尼亚作为状态并点击第一个网址上的提交。

我的代码是:

import requests

url1 = r'https://www.dspayments.com/FAIRFAX'
url2 = r'https://www.dspayments.com/FAIRFAX/Home/PayOption'

s = requests.Session()

#GET request  
r = s.get(url1)
text1 = r.text
startstr = '<input name="__RequestVerificationToken" type="hidden" value="'
start_ind = text1.find(startstr)+len(startstr)
end_ind = text1.find('"',start_ind)
auth_string = text1[start_ind:end_ind]


#POST request
payload = {'Plate':'x', 'PlateStateProv':'VA',"submit":"Search",
           "__RequestVerificationToken":auth_string,"validation-summary-valid":"true"}

post = s.post(url2, headers=user_agent, data=payload)
source_code = post.text

谢谢,-K。

1 个答案:

答案 0 :(得分:1)

您应该只需要第一页的数据,正如您所说,__ RequestVerificationToken随每个请求而变化。

您必须执行以下操作:

  • 获取https://www.dspayments.com/FAIRFAX

  • 的请求
  • 收获__RequestVerificationToken值(请求会话将处理任何相关的cookie)

  • 使用您从GET请求中删除的数据进行POST

  • 从第2页中提取您需要的任何内容

因此,只需专注于创建与第一页中的表单完全相同的表单。抓住它,如果你还在努力,我可以帮助挖掘细节。