使用python-requests实现挑战/响应方案

时间:2015-02-10 14:45:46

标签: python python-requests challenge-response

我开始学习如何使用python请求模块。为了练习,我尝试管理挑战/响应问题:我想访问http://lema.rae.es/drae/srv/search?val=hacer

上的数据

使用"篡改数据" Firefox的插件我检查了必要的HTTP请求:

GET http://lema.rae.es/drae/srv/search?val=hacer
POST http://lema.rae.es/drae/srv/search?val=hacer

我复制了Firefox在两个HTTP请求中发送的确切标题,并实现了JavaScript" challenge" Python中的函数。然后我要做以下事情:

url = "http://lema.rae.es/drae/srv/search?val=hacer"
headers = { ... }
r1 = requests.get(url=url, headers=headers)
html = r1.content.decode("utf-8")
formdata = challenge(html)
headers = { ... }
r2 = requests.post(url=url, data=formdata, headers=headers)

不幸的是,服务器不会以预期的方式回答。我查看了我通过" r.request.headers"发送的所有标题。并且他们完全同意firefox发送的标题(根据Tamper Data)

我做错了什么?

您可以在此处查看我的完整代码:http://pastebin.com/7JAZ9B4s

这是我应该得到的响应标题:

Date[Tue, 10 Feb 2015 17:13:53 GMT]
Vary[Accept-Encoding]
Content-Encoding[gzip]
Cache-Control[max-age=0, no-cache]
Keep-Alive[timeout=5, max=100]
Connection[Keep-Alive]
Content-Type[text/html; charset=UTF-8]
Set-Cookie[TS014dfc77=017ccc203c29467c4d9b347fb56ea0e89a7182e52b9d7b4a1174efbf134768569a005c7c85; Path=/]
Transfer-Encoding[chunked]

这是我真正得到的响应标题:

Content-Length[5798]
Content-Type[text/html]
Pragma[no-cache]
Cache-Control[no-cache]

1 个答案:

答案 0 :(得分:0)

我找到了我的代码无效的原因:

服务器期望POSTDATA与条目作为表单的输入元素显示的顺序完全相同。在我的代码中,input-elements的值存储在python dict中。但是这种数据类型不保留声明值的顺序!

然而,ruby脚本(在评论中提到)确实有效,因为ruby dict数据类型似乎保留了声明的顺序!

此外,根本没有必要在python中重新实现javascript challenge()函数,因为服务器很乐意一遍又一遍地接受任何响应字符串(过去有效)!