|
|
|
@ -19,6 +19,8 @@ router.get('/', async (req, res) => {
@@ -19,6 +19,8 @@ router.get('/', async (req, res) => {
|
|
|
|
|
|
|
|
|
|
"/api/onboard/": "爬虫状态上报到联盟", |
|
|
|
|
"/api/stats/": "查看联盟状态", |
|
|
|
|
|
|
|
|
|
"/api/newtask/": "向联盟提交新的爬虫任务", |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const data = { |
|
|
|
@ -34,7 +36,7 @@ router.get('/', async (req, res) => {
@@ -34,7 +36,7 @@ router.get('/', async (req, res) => {
|
|
|
|
|
* uuid: 用户ID |
|
|
|
|
* url: 目标网址 |
|
|
|
|
* platform: 目标网址所属平台,可选值:[douyin, kuaishou, xigua, bilibili] |
|
|
|
|
* contract: '', 需要抓取的数据合约,凡是支持此合约的爬虫将根据合约内容抓取数据(具体参考爬虫所支持的合约) |
|
|
|
|
* contract: 需要抓取的数据合约,凡是支持此合约的爬虫将根据合约内容抓取数据(具体参考爬虫所支持的合约) |
|
|
|
|
* data_mode: 返回数据格式,可选值:[json, html] |
|
|
|
|
* country: 国家代码 |
|
|
|
|
* lang: 语言代码 |
|
|
|
@ -45,15 +47,61 @@ router.post('/newtask/', async (req, res) => {
@@ -45,15 +47,61 @@ router.post('/newtask/', async (req, res) => {
|
|
|
|
|
let uuid = req.body.uuid, |
|
|
|
|
url = req.body.url, |
|
|
|
|
platform = req.body.platform, |
|
|
|
|
contract = req.body.contract, |
|
|
|
|
data_mode = req.body.data_mode, |
|
|
|
|
country = req.body.country, |
|
|
|
|
lang = req.body.lang, |
|
|
|
|
notify_url = req.body.notify_url; |
|
|
|
|
notify_url = req.body.notify_url, |
|
|
|
|
sign = req.body.sign; |
|
|
|
|
|
|
|
|
|
let data = {code: 0, message: ''}; |
|
|
|
|
|
|
|
|
|
//参数格式检查
|
|
|
|
|
if (!uuid || !url || !platform || !contract || !sign) { |
|
|
|
|
data.message = '必选参数uuid、url、platform、contract、sign不能为空'; |
|
|
|
|
}else if (common.isUuidOk(uuid) == false) { |
|
|
|
|
data.message = '参数uuid应为6-32位的英文字符串,请联系管理员获得'; |
|
|
|
|
}else if (common.isUrlOk(url) == false) { |
|
|
|
|
data.message = '参数url必须是一个网址'; |
|
|
|
|
}else if (common.isNormalName(platform, 5) == false) { |
|
|
|
|
data.message = '平台名platform应为5-32位的英文字符串'; |
|
|
|
|
}else if (common.isNormalName(contract, 5) == false) { |
|
|
|
|
data.message = '合约contract应为5-32位的英文字符串'; |
|
|
|
|
}else if (data_mode && data_mode != 'json' && data_mode != 'html') { |
|
|
|
|
data.message = '数据格式data_mode可选值:json, html'; |
|
|
|
|
}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 (notify_url && common.isUrlOk(notify_url) == false) { |
|
|
|
|
data.message = '参数notify_url必须是一个网址'; |
|
|
|
|
}else if (common.isNormalName(sign, 32, 32) == false) { |
|
|
|
|
data.message = '签名sign应为32位的英文字符串'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//签名检查
|
|
|
|
|
let userToken = await heroUnion.getUserToken(uuid); |
|
|
|
|
if (!userToken) { |
|
|
|
|
data.message = `用户 ${uuid} 不存在,请检查参数uuid并确认大小写完整正确`; |
|
|
|
|
}else { |
|
|
|
|
let paramsCheck = {}; |
|
|
|
|
for (const key in req.body) { |
|
|
|
|
if (key != 'sign') { |
|
|
|
|
paramsCheck[key] = req.body[key]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
let mySign = common.sign(paramsCheck, userToken); |
|
|
|
|
if (mySign.toLowerCase() != sign.toLowerCase()) { |
|
|
|
|
data.message = `签名 ${sign} 不匹配,请确保token正确及签名方法跟文档一致`; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!data.message) { |
|
|
|
|
data.task = heroUnion.createTask(uuid, url, platform, contract, data_mode, notify_url, country, lang); |
|
|
|
|
data.code = 1; |
|
|
|
|
data.message = '新爬虫任务提交完成'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return res.status(200).json(data); |
|
|
|
|
}); |
|
|
|
|