python-从 0.12.1 升级到 2.7.0 后请求中断

python-requests broken after upgrade from 0.12.1 to 2.7.0

  1. 在kali 1上: Python 2.7.3(默认,2014 年 3 月 13 日,11:03:55)Linux2 上的 [GCC 4.7.2]。 请求模块版本为0.12.1

  2. 现在 在 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。我可以看到:

正如 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 )

其他都是正确的。