用python请求实现质询/响应方案

用python请求实现质询/响应方案,python,python-requests,challenge-response,Python,Python Requests,Challenge Response,我开始学习如何使用python请求模块。为了练习,我尝试管理一个挑战/响应问题:我想访问 使用Firefox的“篡改数据”插件,我检查了必要的HTTP请求: GET http://lema.rae.es/drae/srv/search?val=hacer POST http://lema.rae.es/drae/srv/search?val=hacer 我复制了Firefox在两个HTTP请求中发送的确切标题,并在Python中实现了JavaScript“challenge”函数。然后我做了以

我开始学习如何使用python请求模块。为了练习,我尝试管理一个挑战/响应问题:我想访问

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

GET http://lema.rae.es/drae/srv/search?val=hacer
POST http://lema.rae.es/drae/srv/search?val=hacer
我复制了Firefox在两个HTTP请求中发送的确切标题,并在Python中实现了JavaScript“challenge”函数。然后我做了以下工作:

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发送的头文件完全一致(根据篡改数据)

我做错了什么

您可以在此处查看我的完整代码:

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

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]

我找到了我的代码不起作用的原因:

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

但是,ruby脚本(在注释中提到)确实有效,因为ruby dict数据类型似乎保留了声明的顺序


此外,在python中重新实现javascript challenge()函数完全没有必要,因为服务器将乐于一次又一次地接受任何响应字符串(在过去有效)

这是通过谷歌找到的。这不起作用:另一方面,以下内容建议我们需要设置cookie:但对我来说,在浏览器中禁用cookie时,页面也会起作用!这是有效的(!):不过我还得弄清楚它是如何工作的。。。。。。它总是发送相同的挑战字符串,并且不设置任何cookie或任何东西?!一种解决方案,即以预定义顺序发送标题的一种方法,是使用urllib2.urlopen,它需要一个
params
参数,该参数将POSTDATA作为字符串包含(当然,它必须是有序的)。