小伙伴有对腾讯安全威胁情报云查服务不了解的,可以参考下腾讯云官方文档:https://cloud.tencent.com/document/product/1013/31158。
由于业务需求,我们需要对接腾讯安全威胁情报云查服务API接口。拿到文档后,所有的接口范例都是用Python写的。我们服务器后台需要node.js实现。所有,今天抽空将Python版本的范例,实现为node.js版本的。实现后,自己通过Postman脚本调用,接口返回正常。
以下是实现代码,有需要的小伙伴可以参考下,如果代码中,有部分书写错误的地方,还请大家指正。
首先我们创建一个工具类:ipProfile.js文件,具体实现代码如下:
/**
* 腾讯安全威胁情报
*/
const express = require('express');
const router = express.Router();
const request = require('request');
const crypto = require('crypto');
/**
* 系统应用默认配置
*/
const user_appid = "*****";
const user_appkey = "**************************";
const api_version = "1.0";
const api_option = 0;
/**
* 生成SHA256加密后的密码
*/
function getSHA256c_signature(c_signature) {
let hash = crypto.createHash('sha256');
hash.update(c_signature)
return hash.digest('hex')
}
/**
* 生产含有 小写字母 数字的5位随机字符串
*/
function getsectioncode() {
let lowercase = 'abcdefhijkmnprstwxyz';
let numStr = '0123456789';
let acrstr = '';
let lowerNum = Math.floor(Math.random() * 1) + 1;
let numberNum = 5 - lowerNum;
for (let i = 0; i < lowerNum; i++) {
acrstr += lowercase.charAt(Math.floor(Math.random() * lowercase.length));
}
for (let i = 0; i < numberNum; i++) {
acrstr += numStr.charAt(Math.floor(Math.random() * numStr.length));
}
let acrstrArray = acrstr.split('');
acrstr = acrstrArray.join('');
return acrstr;
}
/**
* 生成待加密的入参,字符串指定格式
* action: 操作类型,默认使用:"IpProfile",ip画像类型
* key: 目标地址,例如:"101.201.223.82"
* type: 分析类型:例如:"ip"
*/
function getIpProfileRequest_params(action, key, type) {
let newaction = action ? action : "IpProfile";
let date = new Date();
let time = date.getTime()/1000; //转换成秒;
let intTime = Math.floor(time);
let c_nonce = getsectioncode();
let request_params = {
"c_version": api_version,
"c_action": newaction,
"c_nonce": c_nonce,
"c_timestamp": intTime,
"key": key,
"type": type,
"c_appid": user_appid,
"option": api_option,
};
let new_params = new Array();
for (let key of Object.keys(request_params).sort()) {
new_params.push(key+"="+request_params[key]);
}
let out_data = new Array();
let key_params = new_params.join("&") + user_appkey;
console.log("key_params ===", key_params);
out_data.push(key_params);
out_data.push(request_params);
return out_data;
}
/**
* 安全检查-模块
* action: 操作类型,默认使用:"IpProfile"
* key: 目标地址,例如:"101.201.223.82"
* type: 分析类型:例如:"ip"
* request_urlPath :请求路径,类型不同,访问路径不同,默认:"https://xti.qq.com/api/v1/ti"
*
* 返回值:
* error :null,response.statusCode = 200时,表示请求成功。
*
*/
async function rsIpProfile(action, key, type, urlPath) {
const request_url = urlPath ? urlPath : "https://xti.qq.com/api/v1/ti";
let out_data = getIpProfileRequest_params(action, key, type);
let c_signature = out_data[0];
let request_params = out_data[1];
request_params["c_signature"] = getSHA256c_signature(c_signature);
let ipresult = {
error : null,
response : null,
};
await new Promise((resolve, reject) => {
request(
{
url: request_url,
method: 'POST',
headers: {
"Content-Type" : 'application/json'
},
body: JSON.stringify(request_params)
}, function (err, response, body) {
if (!err && response.statusCode === 200) {
console.log("腾讯安全威胁情报云查服务API 返回数据:==",body);
ipresult.response = JSON.parse(body);
resolve(body);
} else {
console.log("err:", err);
ipresult.error = err;
ipresult.response = JSON.parse(body);
console.log("腾讯安全威胁情报云查服务API 求失败:", body);
reject("腾讯安全威胁情报云查服务API 请求失败:" + body);
}
}
);
});
return ipresult;
}
module.exports = router;
module.exports.rsIpProfile = rsIpProfile;
其中,代码中:user_appid,user_appkey需要换成自己在腾讯云申请的APPID和AppKey。
其次,我们再次创建一个路由文件:ipProfileTest.js,具体实现如下:
const express = require('express');
const router = express.Router();
const rsIpProfile = require("../routes/ipProfile").rsIpProfile;
/**
* 腾讯安全威胁情报云查服务API- 测试查询接口
*/
router.post("/ipProfileTest",async function(req,res) {
let action = req.body.action;
let key = req.body.key;
let type = req.body.type;
let urlPath = req.body.urlPath;
let outdata = await rsIpProfile(action, key, type, urlPath)
let response = {
result : 1,
data : outdata,
}
return res.send(response)
})
module.exports = router;
路由对外声明,在这里就不多讲了。接下来,我们启一个本地服务。用Postman脚本调用,测试下:
上图中,是以ip画像接口请求为例,其他接口,可以调整action、key、type、urlPath路由来调用。Python转写为node.js过程中,比较有难度的是node.js实现获取c_signature字符串过程。以上有需要文件的小伙伴,可以通过链接: https://pan.baidu.com/s/1_s1EXykllfvOlOqV9iaGgQ 提取码: jmhv --来自百度网盘超级会员v3的分享下载。