You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XTB Python wrapper登录时报ssl.wrap_socket属性不存在错误

解决XTB Python Wrapper在Python 3.12中的ssl.wrap_socket错误

问题背景

使用XTB官方Python wrapper编写登录测试及tick数据流获取代码,凭证存储在config文件中,代码如下:

#import libraries
from xAPIConnector import *
import config
import time  # 补充:原代码缺少time模块导入,需添加

#connect to API
user_id = config.user_id
pwd= config.pwd

client=APIClient()
resp=client.execute(loginCommand(user_id, pwd))
ssid=resp['streamSessionId']

sclient=APIStreamClient(ssId=ssid, tickFun=procTickExample)
sclient.subscribePrice('EURUSD')

time.sleep(60)

sclient.unsubscribePrice('EURUSD')
time.sleep(5)
sclient.disconnect()
client.disconnect()

运行错误

执行代码时触发如下错误:

Traceback (most recent call last):
  File "c:\Python\robot.py", line 9, in <module>
    client=APIClient()
           ^^^^^^^^^^^
  File "c:\Python\xAPIConnector.py", line 160, in __init__ 
    super(APIClient, self).__init__(address, port, encrypt)
  File "c:\Python\xAPIConnector.py", line 58, in __init__  
    self.socket = ssl.wrap_socket(sock)
                  ^^^^^^^^^^^^^^^
AttributeError: module 'ssl' has no attribute 'wrap_socket'

环境为Python 3.12,无同名ssl.py文件,需修改wrapper代码解决。

原Wrapper相关代码

wrapper中的初始化方法代码片段:

def __init__(self, address, port, encrypt = False):
    self._ssl = encrypt 
    if self._ssl != True:
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    else:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket = ssl.wrap_socket(sock)
    self.conn = self.socket
    self._timeout = None
    self._address = address
    self._port = port
    self._decoder = json.JSONDecoder()
    self._receivedData = ''

修改方案

ssl.wrap_socket在Python 3.7起被标记为废弃,Python 3.12已完全移除该方法,需改用官方推荐的ssl.create_default_context()方式创建SSL套接字,修改后的代码如下:

def __init__(self, address, port, encrypt = False):
    self._ssl = encrypt 
    if self._ssl != True:
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    else:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 替换废弃的ssl.wrap_socket为现代SSL上下文实现
        context = ssl.create_default_context()
        self.socket = context.wrap_socket(sock, server_hostname=address)
    self.conn = self.socket
    self._timeout = None
    self._address = address
    self._port = port
    self._decoder = json.JSONDecoder()
    self._receivedData = ''

修改说明

  • ssl.create_default_context()会创建包含安全默认配置的SSL上下文,比旧方法更安全
  • 添加server_hostname=address参数,确保SNI(服务器名称指示)功能正常,避免部分服务器的SSL握手失败问题

内容的提问来源于stack exchange,提问作者Miszyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:05:13