Окс руководит и учит вас использовать JS пары для расширения FMZ API

Автор:Ок количественный, Создано: 2020-05-16 18:04:17, Обновлено: 2023-10-24 21:39:10

img

Описание

Здравствуйте, я Куао-Ок. Из-за того, что я недавно разработал тенденции в рынке, я хочу напомнить вам, что я не могу быть уверенным в том, что вы будете делать.Мониторинг дискаПопулярный и популярный, а также имеющий синхронное напоминание о том, что кулинарная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная макияжная

В статье рассказывается о следующем: Первое, как разработчики связывают расширение FMZ с API языка JS. Второй, первый случай: использование метода CommandRobot с расширенным API для мониторинга обмена сообщениями между дисковым роботом и другими роботами. Второй случай: использование метода GetRobotDetail с расширенным API для обеспечения единого мониторинга и отображения данных нескольких роботов.

Первое - использование расширенного API для FMZ с помощью JS

1)  Заявление на AccessKey и SecretKey (далее мы обозначаем как AK, SK)  Мы настраиваем в FMZ официальном аккаунте настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройки настройкиimg

2) Разработка на основе документации расширения API Сначала рассмотрим несколько важных шагов для запроса API. 1 FMZ API:

https://www.fmz.com/api/v1

2, запрос базовых параметров

{
    'version'   : '1.0',                                //自定义版本号
    'access_key': '8a148320e0bxxxxxxxxxxxxxx19js99f',   //AK
    'method'    : 'GetNodeList',                        //具体调用的方法
    'args'      : [],                                   //具体method算法的参数列表
    'nonce'     : 1516292399361,                        //时间戳,单位毫秒
    'sign'      : '085b63456c93hfb243a757366600f9c2'    //签名(需要根据上面5个参数加密获取,下面有讲)
}

3, полный запрос URL в форме запроса с пропиской

以GetNodeList方法为例
https://www.fmz.com/api/v1?
access_key=8a148320e0bxxxxxxxxxxxxxx19js99f&
nonce=1516292399361&
args=%5B%5D&
sign=085b63456c93hfb243a757366600f9c2&
version=1.0&
method=GetNodeList

4 Подпись

按照如下顺序进行参数拼接后,使用MD5加密算法加密字符串,并转换为十六进制数据字符串值,该值作为参数sign的值。
version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey

5, в совокупности, имеет следующие коды: Ссылка на код:Баоок количественный гидрон-JS параллели FMZ расширение API Demo

var URL = "https://www.fmz.com/api/v1?";
var AK = "b3a53d3XXXXXXXXXXXXXXXXXXX866fe5";//这里替换成你自己的AccessKey
var SK = "1d9ddd7XXXXXXXXXXXXXXXXXXX85be17";//这里替换成你自己的SecretKey

function main() {
    //获取5个基础参数对象
    var param = getParam("1.0.0",AK,getArgs());
    Log("param:",param);
    //获取拼接参数md5加密后的结果
    var md5Result = md5(param);
    //赋值加密结果到基础参数对象中
    param.sign = md5Result;
    //获取请求api的URL
    var finalUrl = getFinalUrl(param);
    Log("finalUrl:",finalUrl);
    //执行请求并打印结果
    var info = HttpQuery(finalUrl);
    Log("info:",info);
}

//获取基础5个参数的对象
function getParam(version,ak,args){
    return {
        'version': version,
        'access_key': ak,
        'method': 'GetNodeList',
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

//执行md5加密
function md5(param){
    var paramUrl = param.version+"|"+param.method+"|"+param.args+"|"+param.nonce+"|"+SK
    Log("paramUrl:",paramUrl);
    return Hash("md5", "hex", paramUrl)
}

//获取最终请求URL
function getFinalUrl(param){
    return URL+"access_key="+AK+"&nonce="+param.nonce+"&args="+param.args+"&sign="+param.sign+"&version="+param.version+"&method="+param.method;
}

//js中不支持...args的命名方式,所以改用arguments关键字获取参数数组
function getArgs(){
    return [].slice.call(arguments);
}

Второй случай: использование расширенного API метода CommandRobot для обмена сообщениями между роботами

Основываясь на вышеуказанном коде, мы используем метод CommandRobot для обмена сообщениями между роботами.

Сначала давайте посмотрим на два параметра, необходимых методу CommandRobot (RobotId, Cmd).

Имя параметра Тип Значение
Робот ID Инт Идентификатор бота, который можно получить с помощью GetRobotList (...), или на странице с информацией о ботах
Cmd Строка Сообщения, отправленные роботам

Теперь, когда мы знаем, что означают параметры, мы начинаем реализовывать этот способ вызова.

На странице с деталями о ботах можно найти идентификатор бота:img

2, реализация способа получения сообщений cmd

//获取消息头信息
function getMessageBody(toUserName,msgType,content){
    return ({
        "toUserName":toUserName,//发送给谁
        "fromUserName":AOKE_INFO,//消息来源
        "createTime": new Date().getTime(),//当前时间戳
        "msgType":msgType,//消息类型
        "content":content,//消息内容
        "msgId":Math.random().toString(36).slice(-8)//消息ID
    })
}

//获取消息体趋势信息(消息头content字段的数据)
function getCtaDate(symbol,timeCycle,direction,nowCycleTime){
    return {
        "symbol":symbol,//交易币种
        "timeCycle":timeCycle,//趋势周期
        "direction":direction,//当前进入的方向,0:看空,1:看多
        "createTime":new Date().getTime(),//当前时间戳
        "nowCycleTime":nowCycleTime//当前进入的周期起始时间
    }
}

3, изменение кода отправки сообщения

//发送消息前先获取消息
var sendMessage = getMessageBody("测试对象",'CTARemind',getCtaDate('BTC_USDT','120','0','2020-05-1620:00:00'));

//把机器人ID和消息体通过getArgs()方法获取,并传入基础参数。
var param = getParam("1.0.0",AK,getArgs(17777,sendMessage));

4, выполните метод main, после отправки сообщения, используйте метод GetCommand ((() для получения сообщения

function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

Послание успешное:imgПолучаем сообщение успешно:img

Пример 3: Использование расширенного API GetRobotList и методов GetRobotDetail для мониторинга и отображения данных роботов.

Так же, давайте сначала посмотрим на параметры двух способов. GetRobotList ((оффсет, длина, robotStatus, label):

Имя параметра Тип Значение
сдвиг Инт Код страницы запроса
длина Инт Длина данных страницы запроса
роботСтатус Инт Передача-1 - все
маркировка Строка Настраиваемый тег, который может отфильтровывать все боты с этим тегом

GetRobotDetail ((Робот Идентификатор):

Имя параметра Тип Значение
Робот ID Инт Идентификатор робота

1, Получить список роботов с помощью метода GetRobotList

//获取机器人列表信息
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;

2) Получить подробную информацию о роботе

//获取机器人详情信息
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;

3, Консоли выводит данные таблицы

function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: '奥克量化的机器人展示',
            cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
            rows: infoArr
        };
}

4, в общем, есть следующие коды: Источник:Куантизация баоока - с помощью расширенного API получать информацию от робота и показывать

var URL = "https://www.fmz.com/api/v1?";
var AK = "b3a53d3XXXXXXXXXXXXXXXXXXX866fe5";//这里替换成你自己的AccessKey
var SK = "1d9ddd7XXXXXXXXXXXXXXXXXXX85be17";//这里替换成你自己的SecretKey
var OFF_SET = 0;//查询的页码下标
var PAGE_LENGTH = 5;//查询页的数据长度

function main() {
    LogReset();
    while(true){
        //获取机器人列表信息
        var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
        //取出机器人列表信息
        var robotList = robotListJson.data.result.robots;
        //创建展示机器人信息的数组
        var infoArr = new Array();
        var infoArr_index = 0;
        for (index = 0; index < robotList.length; index++) {
            var robot = robotList[index];
            //取出当前循环到的机器人ID
            var robotId = robot.id;
            //获取机器人详情信息
            var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
            var robotDetail = robotDetailJson.data.result.robot;
            //转换详情为数组对象
            var arr = getLogPrientItem(robotDetail);
            infoArr[infoArr_index] = arr;
            infoArr_index++;
        }
        Log("infoArr:",infoArr);
        LogStatus('`' + JSON.stringify(getLogPrient(infoArr)) + '`');
        Sleep(30000);
    }
}

function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: '奥克量化的机器人展示',
            cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
            rows: infoArr
        };
}

//通过参数获取API信息
function getAPIInfo(method,dateInfo){
    //获取5个基础参数对象
    var param = getParam("1.0.0",AK,method,dateInfo);
    //Log("param:",param);
    //获取拼接参数md5加密后的结果
    var md5Result = md5(param);
    //赋值加密结果到基础参数对象中
    param.sign = md5Result;
    //获取请求api的URL
    var finalUrl = getFinalUrl(param);
    //Log("finalUrl:",finalUrl);
    //执行请求并打印结果
    var info = HttpQuery(finalUrl);
    //Log("info:",info);
    return JSON.parse(info);
}

//获取基础5个参数的对象
function getParam(version,ak,method,args){
    return {
        'version': version,
        'access_key': ak,
        'method': method,
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

//执行md5加密
function md5(param){
    var paramUrl = param.version+"|"+param.method+"|"+param.args+"|"+param.nonce+"|"+SK
    //Log("paramUrl:",paramUrl);
    return Hash("md5", "hex", paramUrl)
}

//获取最终请求URL
function getFinalUrl(param){
    return URL+"access_key="+AK+"&nonce="+param.nonce+"&args="+param.args+"&sign="+param.sign+"&version="+param.version+"&method="+param.method;
}

//js中不支持...args的命名方式,所以改用arguments关键字获取参数数组
function getArgs(){
    return [].slice.call(arguments);
}

//获取展示详情对象'机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
function getLogPrientItem(robotDetail){
    var itemArr = new Array();
    var iteArr_index = 0;
    itemArr[iteArr_index++] = robotDetail.id;
    itemArr[iteArr_index++] = robotDetail.name;
    itemArr[iteArr_index++] = robotDetail.strategy_name;
    itemArr[iteArr_index++] = robotDetail.charge_time;
    itemArr[iteArr_index++] = robotDetail.charged;
    itemArr[iteArr_index++] = robotDetail.consumed/1e8;
    itemArr[iteArr_index++] = robotDetail.refresh;
    itemArr[iteArr_index++] = robotDetail.public == 0?"已公开":"未公开";
    return itemArr;
}

В результате:

img

Заключение

В практическом расширении можно реализовать еще больше и более увлекательных функций. Например, с помощью метода CommandRobot каждый робот отправляет тест на сердцебиение в робот A. Если робот A обнаруживает, что у машины нет сердечного ритма, но робот все еще работает, он может подать сигнал через номер службы FMZ. Таким образом можно избежать сигналов, которые приводят к сценариям фальсифицированного самоубийства, например, _C (dead loop)). Я надеюсь, что благодаря моему высказыванию, платформа FMZ будет иметь больше и более интересных функций, которые будут разработаны и открыты для использования. В заключение, я хочу поблагодарить платформу FMZ, а также поддержку и помощь всех великих богов, таких как Dreamz, Superz, Z.


Связанные

Больше

Изобретатель No1Сюзань

- Нет, нет.Собирать, учиться