You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.9 KiB
112 lines
2.9 KiB
/** |
|
* 公用方法 |
|
*/ |
|
|
|
import fs from 'node:fs'; |
|
import { readdir, readFile } from 'node:fs/promises'; |
|
import { resolve } from 'node:path'; |
|
import md5 from 'md5'; |
|
|
|
class Common { |
|
|
|
//构造函数,设置默认配置 |
|
constructor() { |
|
this.configDir = resolve('conf/'); |
|
} |
|
|
|
getTimestamp() { |
|
return Math.floor(Date.now()); |
|
} |
|
|
|
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; |
|
}, {}); |
|
} |
|
|
|
joinDict(obj, glue, separator) { //dict拼接成字符串 |
|
if (typeof(glue) == 'undefined') { |
|
glue = '='; |
|
} |
|
|
|
if (typeof(separator) == 'undefined') { |
|
separator = '&'; |
|
} |
|
|
|
return Object.keys(obj).map(function(key) { |
|
let arr = [key]; |
|
let val = obj[key]; |
|
if (typeof(val) == 'string' || typeof(val) == 'number') { |
|
arr.push(val); |
|
}else if (typeof(val) == 'object') { |
|
arr.push(JSON.stringify(val)); |
|
} |
|
|
|
return arr.join(glue); |
|
}).join(separator); |
|
} |
|
|
|
sign(params, token) { //对参数做MD5签名 |
|
return md5( JSON.stringify(this.sortDict(params)) + token ); |
|
} |
|
|
|
//从conf/目录读取配置文件内容 |
|
async getConfigFromJsonFile(filename) { |
|
let data = null; |
|
|
|
let filePath = this.configDir + `/${filename}`; |
|
if (fs.existsSync(filePath)) { |
|
try { |
|
const contents = await readFile(filePath, { encoding: 'utf8' }); |
|
if (contents) { |
|
data = JSON.parse(contents); |
|
} |
|
} catch (err) { |
|
console.error(`[FAILED] get config content from %s failed, error: %s`, filePath, err.message); |
|
} |
|
}else { |
|
console.error("[ERROR] file %s not exist.", filePath); |
|
} |
|
|
|
return data; |
|
} |
|
|
|
//判断语言代码是否符合国际标准 |
|
isIosLangCode(lang) { |
|
return /^[a-z]{2}$/i.test(lang); |
|
} |
|
|
|
//判断国家代码是否符合国际标准 |
|
isIosCountryCode(country) { |
|
return /^[a-z]{2}$/i.test(country); |
|
} |
|
|
|
//判断爬虫状态代码是否正确 |
|
isBotStatus(status) { |
|
const codes = [ |
|
"idle", |
|
"busy" |
|
]; |
|
|
|
return codes.findIndex((item) => item == status) > -1; |
|
} |
|
|
|
//判断是否单位为秒的时间戳 |
|
isTimestampInSeconds(timestamp) { |
|
return typeof(timestamp) == 'number' && /^1[0-9]{9}$/.test(timestamp); |
|
} |
|
|
|
//检查爬虫名字是否符合标准:6 - 32位字母和下划线的组合 |
|
isBotNameOk(bot_name) { |
|
return /^\w{6,32}$/i.test(bot_name); |
|
} |
|
|
|
} |
|
|
|
let commonFuns = new Common(); |
|
export default commonFuns; |