|
|
|
/**
|
|
|
|
* Express router of api/
|
|
|
|
*/
|
|
|
|
|
|
|
|
import express from 'express';
|
|
|
|
import common from './common.mjs';
|
|
|
|
import HeroUnion from './heroUnion.mjs';
|
|
|
|
|
|
|
|
//初始化爬虫联盟
|
|
|
|
const heroUnion = new HeroUnion();
|
|
|
|
heroUnion.init();
|
|
|
|
|
|
|
|
|
|
|
|
const router = express.Router();
|
|
|
|
|
|
|
|
router.get('/', async (req, res) => {
|
|
|
|
const apiList = {
|
|
|
|
"/api/": "查看所有API",
|
|
|
|
|
|
|
|
"/api/onboard/": "爬虫状态上报到联盟",
|
|
|
|
"/api/stats/": "查看联盟状态",
|
|
|
|
};
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
name: heroUnion.config.name,
|
|
|
|
version: heroUnion.config.version,
|
|
|
|
apis: apiList
|
|
|
|
};
|
|
|
|
return res.status(200).json(data);
|
|
|
|
});
|
|
|
|
|
|
|
|
router.post('/newtask/', async (req, res) => {
|
|
|
|
|
|
|
|
return res.send('api/newtask/');
|
|
|
|
});
|
|
|
|
|
|
|
|
router.get('/gettask/', async (req, res) => {
|
|
|
|
|
|
|
|
return res.send('api/gettask/');
|
|
|
|
});
|
|
|
|
|
|
|
|
router.post('/savetask/', async (req, res) => {
|
|
|
|
|
|
|
|
return res.send('api/savetask/');
|
|
|
|
});
|
|
|
|
|
|
|
|
router.get('/querytask/', async (req, res) => {
|
|
|
|
|
|
|
|
return res.send('api/querytask/');
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 参数列表
|
|
|
|
* name
|
|
|
|
* description
|
|
|
|
* status: [idle, busy]
|
|
|
|
* timestamp
|
|
|
|
* country
|
|
|
|
* lang
|
|
|
|
*/
|
|
|
|
router.post('/onboard/', async (req, res) => {
|
|
|
|
let bot_name = req.body.name,
|
|
|
|
bot_desc = req.body.description,
|
|
|
|
status = req.body.status,
|
|
|
|
timestamp = req.body.timestamp,
|
|
|
|
country = req.body.country,
|
|
|
|
lang = req.body.lang;
|
|
|
|
|
|
|
|
let data = {
|
|
|
|
"code": 0,
|
|
|
|
"message": ""
|
|
|
|
};
|
|
|
|
|
|
|
|
//参数格式检查
|
|
|
|
if (!bot_name || !bot_desc || !status || !timestamp) {
|
|
|
|
data.message = '必填参数name、description、status、timestamp不能为空';
|
|
|
|
}else if (common.isBotNameOk(bot_name) == false) {
|
|
|
|
data.message = '爬虫名字必须是6 - 32位英文字母、下划线的组合';
|
|
|
|
}else if (typeof(bot_desc) != 'string' || bot_desc.length > 100) {
|
|
|
|
data.message = '爬虫简介必须是100个字符以内的字符串';
|
|
|
|
}else if (common.isBotStatus(status) == false) {
|
|
|
|
data.message = '爬虫状态status传参错误,其可选值:idle、busy';
|
|
|
|
}else if (common.isTimestampInSeconds(timestamp) == false) {
|
|
|
|
data.message = '时间戳timestamp请传秒数';
|
|
|
|
}else if (country && common.isIosCountryCode(country) == false) {
|
|
|
|
data.message = '国家代码country请传小写的两位字母,参考两位ISO CODES:https://countrycode.org/';
|
|
|
|
}else if (lang && common.isIosLangCode(lang) == false) {
|
|
|
|
data.message = '语言代码lang请传小写的两位字母,参考ISO 639-1 Code:https://www.loc.gov/standards/iso639-2/php/code_list.php';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!data.message) {
|
|
|
|
let bot = {
|
|
|
|
name: bot_name.toLowerCase(),
|
|
|
|
description: bot_desc,
|
|
|
|
status: status,
|
|
|
|
timestamp: timestamp,
|
|
|
|
//如果没传则填充默认值
|
|
|
|
country: country ? country.toLowerCase() : 'cn',
|
|
|
|
lang: lang ? lang.toLowerCase() : 'zh'
|
|
|
|
};
|
|
|
|
|
|
|
|
heroUnion.heroOnboard(bot);
|
|
|
|
data.code = 1;
|
|
|
|
data.message = '欢迎上船,因为有你,联盟将更健壮!';
|
|
|
|
}
|
|
|
|
|
|
|
|
return res.status(200).json(data);
|
|
|
|
});
|
|
|
|
|
|
|
|
router.get('/stats/', async (req, res) => {
|
|
|
|
return res.status(200).json(heroUnion.getStats());
|
|
|
|
});
|
|
|
|
|
|
|
|
export default router;
|