python-从 0.12.1 升级到 2.7.0 后请求中断
python-requests broken after upgrade from 0.12.1 to 2.7.0
是在kali 1上:
Python 2.7.3(默认,2014 年 3 月 13 日,11:03:55)Linux2 上的 [GCC 4.7.2]。 请求模块版本为0.12.1
现在 在 kali 2 上:
Python 2.7.9(默认,2015 年 3 月 1 日,12:57:24)Linux2 上的 [GCC 4.9.2]。 请求模块版本为2.7.0
cryptsy 很容易 api_query:
import hashlib
import hmac
import requests
import time
import urllib
def api_query( method, req = {}):
# API settings
key = API_KEY # your API-key
secret = API_SECRET # your Secret-key
req['method'] = method
req['nonce'] = int( time.time() )
# generate the POST data string
post_data = urllib.urlencode( req )
sign = hmac.new( secret, post_data, hashlib.sha512)
# generate the extra headers
headers = { 'Sign': sign.hexdigest(), 'Key': key }
url = 'https://api.cryptsy.com/api'
print 'post_data = ' + post_data
print 'headers = ' + str( headers )
r = requests.post( url, data=post_data, headers = headers )
print r
for i in r.__dict__:
print ''
print i, r.__dict__[i]
return r.text
它在 kali 1 上有效,但在 kali 2 上无效。
>>> print api_query("getinfo")
{"success":"0","error":"Unable to Authorize Request - Check Your Post Data"}
我第一次在qemu中启动kali 1,开始比较两个相似的代码。我必须将 nonce
设置为一个数字并测试两个 post_datas
之间的差异。一切都是平等的。甚至 Sign(kali1) == Sign(kali2)
.
我正在将地址从 api.cryptsy.com 更改为 127.0.0.1。我可以看到:
0.12.1 将 Data
作为一个编码字符串发送。 - 好。
2.7.0 将字符串转换回 HTML Form URL Encoded
。
正如 Yaroslav 管理员提到的,新版本的请求不再需要 urlencode。否则,它会将这个 html-request
-like 字符串,如 ?a=b&c=1&d=hello
反向转换为类似字典的有效负载,这在服务器端是错误的。
这就是为什么,在我的 cryptsy api_query 示例中只需要改进一个字符串:
r = requests.post( url, data = post_data, headers = headers )
到
r = requests.post( url, data = req, headers = headers )
其他都是正确的。
是在kali 1上: Python 2.7.3(默认,2014 年 3 月 13 日,11:03:55)Linux2 上的 [GCC 4.7.2]。 请求模块版本为0.12.1
现在 在 kali 2 上: Python 2.7.9(默认,2015 年 3 月 1 日,12:57:24)Linux2 上的 [GCC 4.9.2]。 请求模块版本为2.7.0
cryptsy 很容易 api_query:
import hashlib
import hmac
import requests
import time
import urllib
def api_query( method, req = {}):
# API settings
key = API_KEY # your API-key
secret = API_SECRET # your Secret-key
req['method'] = method
req['nonce'] = int( time.time() )
# generate the POST data string
post_data = urllib.urlencode( req )
sign = hmac.new( secret, post_data, hashlib.sha512)
# generate the extra headers
headers = { 'Sign': sign.hexdigest(), 'Key': key }
url = 'https://api.cryptsy.com/api'
print 'post_data = ' + post_data
print 'headers = ' + str( headers )
r = requests.post( url, data=post_data, headers = headers )
print r
for i in r.__dict__:
print ''
print i, r.__dict__[i]
return r.text
它在 kali 1 上有效,但在 kali 2 上无效。
>>> print api_query("getinfo")
{"success":"0","error":"Unable to Authorize Request - Check Your Post Data"}
我第一次在qemu中启动kali 1,开始比较两个相似的代码。我必须将 nonce
设置为一个数字并测试两个 post_datas
之间的差异。一切都是平等的。甚至 Sign(kali1) == Sign(kali2)
.
我正在将地址从 api.cryptsy.com 更改为 127.0.0.1。我可以看到:
0.12.1 将
Data
作为一个编码字符串发送。 - 好。2.7.0 将字符串转换回
HTML Form URL Encoded
。
正如 Yaroslav 管理员提到的,新版本的请求不再需要 urlencode。否则,它会将这个 html-request
-like 字符串,如 ?a=b&c=1&d=hello
反向转换为类似字典的有效负载,这在服务器端是错误的。
这就是为什么,在我的 cryptsy api_query 示例中只需要改进一个字符串:
r = requests.post( url, data = post_data, headers = headers )
到
r = requests.post( url, data = req, headers = headers )
其他都是正确的。