背景
最近自己写的行情小工具需要接入港股行情,调研了一番,发现富途有提供免费的api,既支持港股也支持A股(其它市场也支持,但要收费...),目前阶段是满足需求了,于是就尝试接入。
接入
但是,在接入过程中,启动报错了(如下截图),大概意思是不能在module模块中使用commonjs模块(用官方的sample例子是可以跑的)
加了QQ,问了一下富途的IT,得到的回复是目前futu-api仅支持在浏览器中使用,不支持在node环境中使用,在node环境中需要转码(这是原话,但我不太知道具体什么意思),不过我还是不死心,直接修改node_modules下futu-api的源码,哪里报错就需改那里,经过一番魔改(其实也就改了三个文件...),终于跑起来了。
但是改源码终究不是一个办法,于是打算搞一个node-futu-api的版本,基于当时最新的代码来改,现在已经发布到npm,源码在node-futu-api,其实改动可以看这个 commit,自行在项目中修改也可以
使用方式:
-
安装依赖
npm install --save node-futu-api -
使用,跟官方的例子一样,可直接拷贝官方的例子运行,唯二的区别是安装的依赖由
futu-api改为node-futu-api,引入proto由futu-api/proto改为node-futu-api/proto.js(注意增加了后缀.js)
例子(官方例子)
主要修改就是头部的模块引入方式,其它没变化
import ftWebsocket from "node-futu-api";
import { ftCmdID } from "node-futu-api";
import { Common, Qot_Common } from "node-futu-api/proto.js";
import beautify from "js-beautify";
function QotGetSecuritySnapshot(){
const { RetType } = Common
const { SubType, QotMarket } = Qot_Common
let [addr, port, enable_ssl, key] = ["127.0.0.1", 33333, false, '7522027ccf5a06b1'];
let websocket = new ftWebsocket();
websocket.onlogin = (ret, msg)=>{
if (ret) { // 登录成功
const req = {
c2s: {
securityList: [
{
market: QotMarket.QotMarket_HK_Security,
code: "00700",
},
],
},
};
websocket.GetSecuritySnapshot(req)
.then((res) => {
let { errCode, retMsg, retType,s2c } = res
console.log("Snapshot: errCode %d, retMsg %s, retType %d", errCode, retMsg, retType);
if(retType == RetType.RetType_Succeed){
let snapshot = beautify(JSON.stringify(s2c), {
indent_size: 2,
space_in_empty_paren: true,
});
console.log(snapshot);
}
})
.catch((error) => {
console.log("error:", error);
});
} else {
console.log("error", msg);
}
};
websocket.start(addr, port, enable_ssl, key);
//关闭行情连接,连接不再使用之后,要关闭,否则占用不必要资源
//同时OpenD也限制了最多128条连接
//也可以一个页面或者一个项目维护一条连接,这里范例请求一次创建一条连接
setTimeout(()=>{
websocket.stop();
console.log("stop");
}, 5000); // 5秒后断开
}
QotGetSecuritySnapshot();