在nodejs下使用富途行情接口

670 阅读2分钟

背景

最近自己写的行情小工具需要接入港股行情,调研了一番,发现富途有提供免费的api,既支持港股也支持A股(其它市场也支持,但要收费...),目前阶段是满足需求了,于是就尝试接入。

接入

但是,在接入过程中,启动报错了(如下截图),大概意思是不能在module模块中使用commonjs模块(用官方的sample例子是可以跑的)

加了QQ,问了一下富途的IT,得到的回复是目前futu-api仅支持在浏览器中使用,不支持在node环境中使用,在node环境中需要转码(这是原话,但我不太知道具体什么意思),不过我还是不死心,直接修改node_modules下futu-api的源码,哪里报错就需改那里,经过一番魔改(其实也就改了三个文件...),终于跑起来了。

但是改源码终究不是一个办法,于是打算搞一个node-futu-api的版本,基于当时最新的代码来改,现在已经发布到npm,源码在node-futu-api,其实改动可以看这个 commit,自行在项目中修改也可以

使用方式:

  1. 安装依赖 npm install --save node-futu-api

  2. 使用,跟官方的例子一样,可直接拷贝官方的例子运行,唯二的区别是安装的依赖由 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();