Union of hero bots.
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.

154 lines
5.0 KiB

12 months ago
/**
* Express router of api/
*/
import express from 'express';
import common from './common.mjs';
import HeroUnion from './heroUnion.mjs';
//初始化爬虫联盟
const heroUnion = new HeroUnion();
heroUnion.init();
12 months ago
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);
12 months ago
});
/**
* 参数列表
* uuid: 用户ID
* url: 目标网址
* platform: 目标网址所属平台可选值[douyin, kuaishou, xigua, bilibili]
* contract: '', 需要抓取的数据合约凡是支持此合约的爬虫将根据合约内容抓取数据具体参考爬虫所支持的合约
* data_mode: 返回数据格式可选值[json, html]
* country: 国家代码
* lang: 语言代码
* notify_url: 通知回调网址
* sign: 参数签名签名方法见README.md接口参数签名方法
**/
12 months ago
router.post('/newtask/', async (req, res) => {
let uuid = req.body.uuid,
url = req.body.url,
platform = req.body.platform,
data_mode = req.body.data_mode,
country = req.body.country,
lang = req.body.lang,
notify_url = req.body.notify_url;
12 months ago
let data = {code: 0, message: ''};
//参数格式检查
return res.status(200).json(data);
12 months ago
});
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/');
});
8 months ago
/**
* 参数列表
* name
* description
* status: [idle, busy]
* platforms: '', //支持的平台,可由爬虫定义
* contracts: '', //支持的数据抓取合约,具体内容由爬虫定义
8 months ago
* timestamp
* country
* lang
* contact //爬虫提供方的联系方式
8 months ago
*/
12 months ago
router.post('/onboard/', async (req, res) => {
8 months ago
let bot_name = req.body.name,
bot_desc = req.body.description,
status = req.body.status,
platforms = req.body.platforms, //多个则用英文逗号间隔
contracts = req.body.contracts, //多个则用英文逗号间隔
8 months ago
timestamp = req.body.timestamp,
country = req.body.country,
lang = req.body.lang,
contact = req.body.contact;
12 months ago
8 months ago
let data = {
"code": 0,
"message": ""
};
//参数格式检查
if (!bot_name || !bot_desc || !status || !timestamp || !platforms || !contracts) {
data.message = '必填参数name、description、status、platforms、contracts、timestamp不能为空';
8 months ago
}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 (common.isPlatformsOk(platforms) == false) {
data.message = '支持的平台platforms应为英文逗号间隔的3 - 100个英文字符串';
}else if (common.isContractsOk(contracts) == false) {
data.message = '支持的合约contracts应为英文逗号间隔的3 - 100个英文字符串';
8 months ago
}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';
}else if (contact && common.isContactOk(contact) == false) {
data.message = '联系方式contact应为6 - 50个字符';
8 months ago
}
if (!data.message) {
let bot = {
name: bot_name.toLowerCase(),
description: bot_desc,
status: status,
timestamp: timestamp,
platforms: platforms.split(','),
contracts: contracts.split(','),
contact: contact,
8 months ago
//如果没传则填充默认值
country: country ? country.toLowerCase() : 'cn',
lang: lang ? lang.toLowerCase() : 'zh'
};
heroUnion.heroOnboard(bot);
data.code = 1;
data.message = '欢迎上船,因为有你,联盟将更健壮!';
}
return res.status(200).json(data);
12 months ago
});
router.get('/stats/', async (req, res) => {
return res.status(200).json(heroUnion.getStats());
12 months ago
});
export default router;