使用 Python 通过 Binance API 进行交易时出现问题

2024-01-11

我试图在不使用外部库的情况下在美国版 Binance API 上进行交易。

我可以使用 GET 请求成功获取价格并显示我的帐户余额urllib。第一个示例代码有效,我可以通过我的API_KEY and SECRET_KEY没有问题(这些值是私有的,它们不会显示在此处,并且位于settings.py).

进行交易需要 POST,我不确定哪里出了问题,我的 POST 请求不起作用,但 GET 请求工作正常。据我了解docs https://docs.python.org/3/library/urllib.request.html#urllib.request.Request要发出 POST 请求,我应该使用以下方法对参数进行编码urllib.parse.urlencode()并将其传递到data参数输入urllib.request.Request().

这样做不会引发错误,但是当我尝试使用以下命令打开请求时urllib.request.urlopen()我收到错误:

Traceback (most recent call last):  
File "C:\Users\user\PycharmProjects\test\test.py", line 80, in <module>   place_trade(symbol='BTCUSD', side='BUY', order_type='MARKET', quantity=1)
File "C:\Users\user\PycharmProjects\test\test.py", line 73, in place_trade   response = urllib.request.urlopen(req)
File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 214, in urlopen   return opener.open(url, data, timeout)
File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 523, in open   response = meth(req, response)
File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 632, in http_response   response = self.parent.error(
File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 561, in error   return self._call_chain(*args)
File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 494, in _call_chain   result = func(*args)
File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 641, in http_error_default   raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 500: Internal Server Error

The HTTP 返回码 https://github.com/binance-us/binance-official-api-docs/blob/master/rest-api.md#http-return-codes state:

HTTP 5XX 返回码用于内部错误;问题在于 币安这边。重要的是不要将此视为失败 手术;执行状态未知,可能是 成功。

但是我不相信是这样,因为我可以运行其他代码的函数get_account_balance()没有问题。我不确定我做错了什么,除了发出 GET 与 POST 请求之外,这两个代码几乎相同。

获取帐户余额的代码 - 工作正常:

import json
import time
import hmac
import settings
import hashlib
import urllib.parse
import urllib.request


def get_account_balance():

    # Setup header with API_KEY
    headers = {'X-MBX-APIKEY': settings.API_KEY}

    # Params requires timestamp in MS
    params = {'timestamp': int(time.time() * 1000)}

    # Encode params into url
    url = 'https://api.binance.us/api/v3/account?' + urllib.parse.urlencode(params)

    # Create a HMAC SHA256 signature
    secret = bytes(settings.SECRET_KEY.encode('utf-8'))
    signature = hmac.new(secret, urllib.parse.urlencode(params).encode('utf-8'), hashlib.sha256).hexdigest()

    # Add signature to url
    url += f'&signature={signature}'

    # Make a request
    req = urllib.request.Request(url, headers=headers)
    
    # Read and decode response
    response = urllib.request.urlopen(req).read().decode('utf-8')
    
    # Convert to json
    response_json = json.loads(response)

    # Print balances for all coins not at 0
    for entry in response_json['balances']:
        if entry['free'] == '0.00000000':
            continue
        print(entry)


get_account_balance()

进行交易的代码 - 不起作用:

import json
import time
import hmac
import settings
import hashlib
import urllib.parse
import urllib.request


def place_trade(symbol, side, order_type, quantity):

    # Setup header with API_KEY
    headers = {'X-MBX-APIKEY': settings.API_KEY}

    # Params require symbol, side, type, quantity and timestamp (for market orders)
    params = {
        'symbol': symbol,
        'side': side,
        'type': order_type,
        'quantity': quantity,
        'timestamp': int(time.time() * 1000)
    }

    # Encode params into url
    url = 'https://api.binance.us/api/v3/order/test?' + urllib.parse.urlencode(params)

    # Create a HMAC SHA256 signature
    secret = bytes(settings.SECRET_KEY.encode('utf-8'))
    signature = hmac.new(secret, urllib.parse.urlencode(params).encode('utf-8'), hashlib.sha256).hexdigest()

    # Add signature to url
    url += f'&signature={signature}'

    # Encode params
    data = urllib.parse.urlencode(params).encode('ascii')

    # Make a POST request
    req = urllib.request.Request(url, data, headers)

    # Open request and convert to string and then to json
    response = urllib.request.urlopen(req)                         # <- line with error
    response_str = response.read().decode('utf-8')
    response_json = json.loads(response_str)

    print(response_json)


place_trade(symbol='BTCUSD', side='BUY', order_type='MARKET', quantity=1)

参考

  • urllib 文档 https://docs.python.org/3/library/urllib.request.html

  • 美国币安主页 https://www.binance.us/en/home

  • 美国币安API Github https://github.com/binance-us

  • API 新订单端点 https://github.com/binance-us/binance-official-api-docs/blob/master/rest-api.md#new-order--trade

  • API 新订单端点 - 用于测试* https://github.com/binance-us/binance-official-api-docs/blob/master/rest-api.md#test-new-order-trade

示例中使用了此端点,但两个端点的功能相同并且具有相同的错误

我也看了图书馆python-binance举些例子

  • PyPi https://pypi.org/project/python-binance/

  • GitHub https://github.com/sammchardy/python-binance/tree/master/binance

  • Docs https://python-binance.readthedocs.io/en/latest/account.html

EDIT

我可以使用以下命令成功下订单requests图书馆。我浏览了库的源代码,但无法弄清楚如何使用正确格式化 POST 请求urllib

使用代码进行交易requests图书馆 - 作品:

import hmac
import time
import hashlib
import requests
import settings
import urllib.parse

session = requests.session()
session.headers.update({'X-MBX-APIKEY': settings.API_KEY})


url = 'https://api.binance.us/api/v3/order/test'


params = {
        'symbol': 'BTCUSD',
        'side': 'BUY',
        'type': 'MARKET',
        'quantity': 1,
        'timestamp': int(time.time() * 1000)
    }

secret = bytes(settings.SECRET_KEY.encode('utf-8'))
signature = hmac.new(secret, urllib.parse.urlencode(params).encode('utf-8'), hashlib.sha256).hexdigest()

params['signature'] = signature

result = session.post(url, params)

print(result)
print(result.text)

问题出在以下几行:

# Encode params into url
url = 'https://api.binance.us/api/v3/order/test?' + urllib.parse.urlencode(params)

# Add signature to url
url += f'&signature={signature}'

显然,当使用urllibGET 请求有效负载必须编码到 url 本身中,但是 POST 请求要求您将它们传递到data范围:

data = urllib.parse.urlencode(params).encode('ascii')
req = urllib.request.Request(url, data=data, headers=headers)

在我的问题中,我通过 url 和data范围。删除 url 有效负载可以解决该问题。为任何偶然发现这一点的人提供旁注,并打上问号?url后面对于POST请求是可选的,但在使用时不是GET请求urllib

无需外部库即可发布交易的工作代码:

import json
import time
import hmac
import hashlib
import settings
import urllib.parse
import urllib.request

params = {
        'symbol': 'BTCUSD',
        'side': 'BUY',
        'type': 'MARKET',
        'quantity': 1,
        'timestamp': int(time.time() * 1000)
}

secret = bytes(settings.SECRET_KEY.encode('utf-8'))
signature = hmac.new(secret, urllib.parse.urlencode(params).encode('utf-8'), hashlib.sha256).hexdigest()

params['signature'] = signature

url = 'https://api.binance.us/api/v3/order/test'
headers = {'X-MBX-APIKEY': settings.API_KEY}

data = urllib.parse.urlencode(params).encode('ascii')
req = urllib.request.Request(url, data=data, headers=headers)

response = urllib.request.urlopen(req)
response_str = response.read().decode('utf-8')
response_json = json.loads(response_str)

print(response_json)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 通过 Binance API 进行交易时出现问题 的相关文章

  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 将 Python 中的日期与日期时间进行比较

    所以我有一个日期列表 datetime date 2013 7 9 datetime date 2013 7 12 datetime date 2013 7 15 datetime date 2013 7 18 datetime date
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐

  • jquery中如何获取textarea的值?

    如果我使用的是jquery 如何获取Textarea值
  • 让 Swift 相信函数由于抛出异常而永远不会返回

    因为 Swift 没有抽象方法 所以我创建了一个方法 其默认实现无条件地引发错误 这会强制任何子类重写抽象方法 我的代码如下所示 class SuperClass func shouldBeOverridden gt ReturnType
  • 触发子元素的 onclick 事件,但不触发父元素的 onclick 事件

    我有一些嵌套元素 每个元素都有一个 onclick 事件 在大多数情况下 我希望当用户单击子事件时触发这两个事件 父事件和子事件都会被触发 默认行为 但是 至少在一种情况下 我想触发孩子的 onclick 事件 来自 javascript
  • 推荐的 Android 音乐格式 - mp3、ogg 还是其他? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我被问到我的项目需要哪种格式的音乐 通过查看文档 Android 平台似乎提供了一个不错的选择 音频当然不是我的强项 所以我想知道是否有一种最适
  • 为什么 du 或 echo 流水线不起作用?

    我正在尝试对当前目录中的每个目录使用 du 命令 所以我尝试使用这样的代码 ls du sb 但它没有按预期工作 它仅输出当前 的大小目录仅此而已 echo 也是同样的情况 ls echo 输出空行 为什么会发生这种情况 使用管道发送输出
  • 如何在 Java 中创建 PKI

    我想创建存储在数据库中的证书 但我不知道如何做到这一点 如果退出 API 或库可以帮助我做到这一点 谢谢 公钥基础设施不仅仅是签名公钥的数据库 例如 PKI 最重要的部分之一是使用 OCSP 协议撤销证书的能力 简而言之 用 java 构建
  • 将曲线拟合到数据集

    我有一个包含两个数据集的图 它产生轻微的梯度 其中最佳拟合曲线可能会被过度绘制 目前我只能得到一条最适合的直线 我明白scipy optimize curve fit应该能够帮助我 但这需要我知道我想要过度绘制的函数 我认为 下面是我的代码
  • 如何以编程方式隐藏/禁用 Android 软键盘上的表情符号

    是否可以隐藏特定的键盘按钮 我有一个EditText在某些设备上 其键盘上有笑脸 而在其他设备上则没有 我想在所有设备上隐藏它 下面是我的 XMLEditText android id id text editor android layo
  • 我应该如何在我的 ApplicationController 中使用 Draper?

    我的问题涉及以下开发堆栈 轨道3 2 1 德雷珀 0 14 血统1 2 5 我想做的是将导航传递到我的布局 所以我在我的过滤器中定义了一个之前的过滤器ApplicationController class ApplicationContro
  • MySQL 8 创建新用户,密码不起作用

    我使用 MySQL 已经好几年了 创建新用户直到 MySQL 5 x 版本的命令如下 GRANT ALL PRIVILEGES ON TO username localhost IDENTIFIED BY password 最近我安装了 M
  • 如何设置 Spring Boot 来运行 HTTPS / HTTP 端口

    Spring Boot 有一些属性来配置 Web 端口和 SSL 设置 但是一旦设置了 SSL 证书 http 端口就会变成 https 端口 那么 如何让两个端口同时运行 例如 80 和 443 正如您所看到的 只有一个端口的属性 在本例
  • 将视图添加到constraintLayout,其约束类似于另一个子项

    I have a constraint layout alpha9 with views spread all over it and I have one particular ImageView that I need to repli
  • 如何使用 LINQ 获取用户之间的最新消息?

    我有一个表显示消息之间的关系 像这样 我想获取每个用户的最后一条消息 因此 例如 结果将是表中的 id 91 和 id 92 var messages await dbContext Messages Include x gt x User
  • 安装 MongoDB java 驱动程序

    我对 Java 和 MongoDB 世界都很陌生 我想使用 MongoDB 和 Java 我已经下载了 Java 版 MongoDB 驱动程序 这是一个 jar 文件 我的问题是如何使用这个 Jar 文件 我使用了这个命令 但出现错误 ja
  • 使用 javascript 链接下载 PhantomJS

    我正在尝试抓取以下网站 如果您单击表格右上角标题为 导出数据 的小按钮 则会运行 JavaScript 脚本 并且我的浏览器会下载 csv 格式的文件 我希望能够编写一个 PhantomJS 脚本来自动执行此操作 有任何想法吗 上面的按钮被
  • 如何在 Javascript 中删除“mouseup”事件监听器

    在这里 我拖动一个元素并放到另一个地方 如果我不使用事件侦听器 它会很好地工作 但如果我以这种格式使用它 它不会执行 放置 操作 此链接包含我的代码 带有事件监听器 访问http jsfiddle net vishwateja2000 wH
  • 在 iPad 版 SDK 3.2 中使用 MPMoviePlayerViewController

    我开发了一个 iPhone 应用程序 它运行 MPMoviePlayer 3 2 SDK 之前的版本 没有任何问题 我知道这是一个新手问题 但如何让电影在新的 MPMoviePlayerViewController 中播放 我只收到音频并希
  • 的开始/结束外观转换的调用不平衡

    当我模拟我的应用程序时 我遇到了这个问题 它不是错误或警告 但它出现在我的控制台中 以前有人遇到过这种情况吗 就我而言 当您非常快速地单击表格视图中的两个选项卡时 就会发生此错误 结果导致标题名称错误 后退按钮消失 有人提到 当你推送视图时
  • 让 ASP.MVC2/VS2010 应用程序在 IIS 7.5 中工作

    我最近下载了 VS2010 beta 2 并开始使用 ASP NET MVC2 最初的开发是使用 Casini 完成的 但现在我想从 IIS 7 5 运行该应用程序 我运行的是 Windows 7 我已经安装了 IIS6 元数据库兼容性 并
  • 使用 Python 通过 Binance API 进行交易时出现问题

    我试图在不使用外部库的情况下在美国版 Binance API 上进行交易 我可以使用 GET 请求成功获取价格并显示我的帐户余额urllib 第一个示例代码有效 我可以通过我的API KEY and SECRET KEY没有问题 这些值是私