filesite
8 months ago
5 changed files with 227 additions and 26 deletions
@ -0,0 +1,150 @@
@@ -0,0 +1,150 @@
|
||||
/** |
||||
* HeroUnion Bot SDK |
||||
*/ |
||||
|
||||
import test from 'node:test'; |
||||
import assert from 'node:assert'; |
||||
import axios from 'axios'; |
||||
import md5 from 'md5'; |
||||
|
||||
|
||||
class HeroBot { |
||||
constructor( |
||||
server_url, |
||||
bot_name, |
||||
bot_description, |
||||
support_platforms, |
||||
support_contracts, |
||||
bot_country, |
||||
bot_lang, |
||||
bot_contact, |
||||
data_mode |
||||
) { |
||||
//必填参数
|
||||
this.union_server = server_url; |
||||
this.name = bot_name; |
||||
this.description = bot_description; |
||||
this.platforms = support_platforms; |
||||
this.contracts = support_contracts; |
||||
|
||||
//可选参数
|
||||
this.country = typeof(bot_country) != 'undefined' ? bot_country : 'cn'; |
||||
this.lang = typeof(bot_lang) != 'undefined' ? bot_lang : 'zh'; |
||||
this.contact = typeof(bot_contact) != 'undefined' ? bot_contact : ''; |
||||
this.data_mode = typeof(data_mode) != 'undefined' ? data_mode : 'json'; |
||||
|
||||
//联盟API地址
|
||||
this.apis = { |
||||
"heartBeat": `${server_url}/api/onboard/`, |
||||
"getNewTask": `${server_url}/api/gettask/`, |
||||
"saveTaskData": `${server_url}/api/savetask/`, |
||||
}; |
||||
|
||||
//axios请求配置
|
||||
this.axiosConfig = { |
||||
timeout: 8000, //请求超时
|
||||
proxy: false //是否走代理
|
||||
}; |
||||
} |
||||
|
||||
getTimestampInSeconds() { |
||||
return Math.floor(Date.now() / 1000); |
||||
} |
||||
|
||||
sortDict(obj) { //dict按key排序
|
||||
return Object.keys(obj).sort().reduce(function(result, key) { |
||||
result[key] = obj[key]; |
||||
return result; |
||||
}, {}); |
||||
} |
||||
|
||||
sign(params, token) { //对参数做MD5签名
|
||||
return md5( JSON.stringify(this.sortDict(params)) + token ); |
||||
} |
||||
|
||||
//向联盟发送心跳数据
|
||||
async heartBeat(status) { |
||||
let params = { |
||||
name: this.name, |
||||
description: this.description, |
||||
status: status, |
||||
timestamp: this.getTimestampInSeconds(), |
||||
platforms: this.platforms, |
||||
contracts: this.contracts, |
||||
country: this.country, |
||||
lang: this.lang, |
||||
contact: this.contact |
||||
}; |
||||
|
||||
let response = null; |
||||
|
||||
try { |
||||
response = await axios.post(this.apis.heartBeat, params, this.axiosConfig); |
||||
}catch(err) { |
||||
console.error('[ERROR] HeroBot heart beat failed: %s, api: %s, params: %s', |
||||
err, |
||||
this.apis.heartBeat, |
||||
JSON.stringify(params) |
||||
); |
||||
} |
||||
|
||||
return response ? response.data : false; |
||||
} |
||||
|
||||
//从联盟领取任务
|
||||
async getNewTask() { |
||||
let params = { |
||||
platforms: this.platforms, |
||||
contracts: this.contracts, |
||||
data_mode: this.data_mode, |
||||
country: this.country, |
||||
lang: this.lang |
||||
}; |
||||
|
||||
let queryOption = this.axiosConfig; |
||||
queryOption.method = 'get'; |
||||
queryOption.url = this.apis.getNewTask; |
||||
queryOption.params = params; |
||||
|
||||
let response = null; |
||||
|
||||
try { |
||||
response = await await axios(queryOption); |
||||
}catch(err) { |
||||
console.error('[ERROR] HeroBot get new task failed: %s, api: %s, params: %s', |
||||
err, |
||||
this.apis.getNewTask, |
||||
JSON.stringify(params) |
||||
); |
||||
} |
||||
|
||||
return response && response.data.code == 1 ? response.data.task : false; |
||||
} |
||||
|
||||
//回传任务数据给联盟
|
||||
async saveTaskData(task_id, task_token, task_data) { |
||||
let params = { |
||||
name: this.name, |
||||
task_id: task_id, |
||||
task_result: task_data |
||||
}; |
||||
params.sign = this.sign(params, task_token); //对参数进行签名
|
||||
|
||||
let response = null; |
||||
|
||||
try { |
||||
response = await axios.post(this.apis.saveTaskData, params, this.axiosConfig); |
||||
}catch(err) { |
||||
console.error('[ERROR] HeroBot save task data failed: %s, api: %s, params: %s', |
||||
err, |
||||
this.apis.saveTaskData, |
||||
JSON.stringify(params) |
||||
); |
||||
} |
||||
|
||||
return response ? response.data : false; |
||||
} |
||||
|
||||
} |
||||
|
||||
export default HeroBot; |
Loading…
Reference in new issue