【问题标题】:python-requests broken after upgrade from 0.12.1 to 2.7.0从 0.12.1 升级到 2.7.0 后,python 请求中断
【发布时间】:2015-08-19 15:54:28
【问题描述】:
  1. 曾经在 kali 1 上: linux2 上的 Python 2.7.3(默认,2014 年 3 月 13 日,11:03:55)[GCC 4.7.2]。 请求模块的版本是 0.12.1

  2. 现在在 kali 2 上: linux2 上的 Python 2.7.9(默认,2015 年 3 月 1 日,12:57:24)[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

【问题讨论】:

  • 你检查过请求变更日志吗?
  • post_data = urllib.urlencode( req ) 对我来说看起来很可疑。我认为您不需要在新版本中对帖子数据进行编码。
  • @yaroslav-admin 你是对的。谢谢你。解决了。​​

标签: python authentication post python-requests


【解决方案1】:

正如 Yaroslav Admin 所说,新版本的请求不再需要 urlencode。否则,它将这个类似html-request 的字符串(如?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 )

其他都是正确的。

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 2017-03-21
    • 2021-05-29
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多