对盈透证券客户端 Web API 的任何 POST 请求的 403 响应代码

Posted

技术标签:

【中文标题】对盈透证券客户端 Web API 的任何 POST 请求的 403 响应代码【英文标题】:403 response code for any POST request to Interactive Brokers Client Portal Web API 【发布时间】:2021-03-26 01:04:48 【问题描述】:

我尝试使用盈透证券客户端 Web API:

我成功启动网关并登录。 我成功地向各种端点发出 GET 请求。 当我向任何端点发出 POST 请求时,我会收到 403 响应代码。

例如,我尝试更新当前选择的帐户:

// it is need for change User-Agent as recommended*
chrome.webRequest.onBeforeSendHeaders.addListener(function (details) 
    for (var i = 0; i < details.requestHeaders.length; ++i) 
        if (details.requestHeaders[i].name === 'User-Agent') 
            details.requestHeaders[i].value = 'Console';
            break;
        
    
    return requestHeaders: details.requestHeaders;
, urls: ['<all_urls>'], ['blocking', 'requestHeaders']);

// it is code of make of POST request
var data = ;
data['acctId'] = 'U1234567';
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://localhost:5000/v1/portal/iserver/account', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(data));
xhr.onreadystatechange = function () 
    if (xhr.readyState == 4) 
        sendResponse(Status: xhr.status + '_' + xhr.responseText); // I have "403_" response
    
;

*:Making POST request from console app results in Error 403 - Access denied

我的请求标题:

Cookie: SBID=xskr4cf7kflki7wrzzy; XYZAB_AM.LOGIN=29c2d567b3a3f23d8d02bdd5ef78d0c8c2694438; XYZAB=29c2d567b3a3f22d8d12bdd5ef78d0c8c2694438; api=673d21e86cf499f04b985446a90a844b; ibkr.nj=286565962.20480.0000
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6
Accept-Encoding: gzip, deflate, br
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: none
Origin: chrome-extension://jnblchdcckkmedocgchlfmfhbaihjdnl
Accept: */*
Content-Type: application/json
User-Agent: Console
Content-Length: 21
Connection: close
Host: localhost:5000

我的请求正文:

"acctId":"U1234567"

【问题讨论】:

【参考方案1】:

我通过填充 User-Agent 并发送一个空字符串作为 POST 有效负载来解决此问题,以确保设置 Content-Length 标头,例如。对 /tickle 端点的调用。

【讨论】:

【参考方案2】:

我解决了这个问题。 事实上,“客户端门户 WebAPI 网关”不仅仅是一个网关,它还是一个服务器,它允许您托管带有代码的 html 页面。 按照此处https://interactivebrokers.github.io/cpwebapi/index.html#login 所述启动网关后 和 https://localhost:5000/ 页面上的授权, 你可以去 https://localhost:5000/demo/#/ 看看一个小的演示应用程序,它的代码非常复杂,超出了我的原始知识。因此,我用自己的替换了 root\webapps\demo 文件夹中的 index.html 文件,并为 POST 请求编写了自己的 javascript 代码

var data=;
data["symbol"]="RSG";
data["name"]=false;
data["secType"]="STK";
var xhr=new XMLHttpRequest();
xhr.open("POST", "https://localhost:5000/v1/portal/iserver/secdef/search", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(data));
xhr.onreadystatechange=function()
    
    if (xhr.readyState==4)
        
        console.log(xhr.status);
        console.log(xhr.responseText);
        
    

它工作了,因为现在我的应用程序的 index.html 页面和端点位于同一个域 localhost:5000 上,所以不会发生 mod_security 拒绝并且一切正常!

【讨论】:

您的解决方法仅适用于在同一组件中使用相同的 API 调用,我认为这不是最佳选择,因为您将无法使用网关中的 REST API 构建外部应用程序。【参考方案3】:

您是否执行了不安全的 https POST 请求?

就我而言,不安全的 https GET 请求工作正常,但我认为它会为 POST 请求生成“403”。在我尝试使用自签名证书的路上

【讨论】:

是的,我发出了不安全的 https POST 请求。我还认为原因是证书过期,但我上面描述的真正原因是什么。现在我看到一个警告,提示连接不安全,但一切正常。【参考方案4】:

这个问题被标记为已解决,但我设法通过简单地将标题中的 User-Agent 设置为任何内容来解决类似的问题。我当前的应用程序是使用请求模块的 NodeJS。将 User-Agent 设置为几乎任何内容,并确保您处理不安全的 SSL 证书。

【讨论】:

【参考方案5】:

如上所述,我们可以通过在标题中添加 'User-Agent': 'Console' 来解决此问题。您可以使用 Python 请求发送标头,如下所示。

import requests

headers = 'User-Agent': 'Console', 'content-type': 'application/json'

response = requests.post(url, data=data, headers=headers, verify='path to .pem file or False if SSL is not needed')

其中 url 是包含 post URL 的字符串,data 是您需要提交给 POST 请求的 json 数据。

【讨论】:

以上是关于对盈透证券客户端 Web API 的任何 POST 请求的 403 响应代码的主要内容,如果未能解决你的问题,请参考以下文章

TWS API使用教程3---如何使用TWS API从盈透证券中设置contract及获取contract的信息?

盈透证券推出重新设计的IBKR Campus网站,为全球投资者提供支持

哪些在线经纪人提供 API? [关闭]

$http.post 的 Web API 405 错误

客户端调用web api 的post请求,传入一个字符串时,用此方法获取此字符串。

Web API 无法使用 utf-16 编码的 XML 绑定 POST 模型