From 9e3da7fd177716feec7d39d34868beced0edacbd Mon Sep 17 00:00:00 2001 From: filesite Date: Thu, 11 Apr 2024 12:53:27 +0800 Subject: [PATCH] doc update, api gettask ready --- README.md | 78 +++++++++++++++++++++++++++-------------- heroUnion.mjs | 8 ++--- router_api.mjs | 45 ++++++++++++++++++++---- test/heroUnion.test.mjs | 34 ++++++++++++++++++ 4 files changed, 128 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 6d716e0..4d0896f 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,23 @@ Hero Union主要做两件事: * 对外提供提交网页抓取任务和获取任务结果的接口供联盟成员使用,并支持任务完成回调通知 +## 本文档目录 + +* [Hero Union 英雄联盟使用流程](#hero-union-英雄联盟使用流程) + 1. [联盟成员使用流程](#联盟成员使用流程) + 2. [联盟的爬虫工作流程](#联盟的爬虫工作流程) +* [Hero Union 联盟接口](#hero-union-联盟接口) + 1. [爬虫状态上报接口](#爬虫状态上报接口) + 2. [爬虫任务领取接口](#爬虫任务领取接口) + 3. [爬虫任务完成回传接口](#爬虫任务完成回传接口) + 4. [提交网页抓取任务接口](#提交网页抓取任务接口) + 5. [查询网页抓取任务结果接口](#查询网页抓取任务结果接口) + 6. [爬虫任务完成回调通知接口](#爬虫任务完成回调通知接口) + 7. [Hero爬虫查询接口](#Hero爬虫查询接口) + 8. [联盟状态查询接口](#联盟状态查询接口) + + + ## Hero Union 英雄联盟使用流程 ### 联盟成员使用流程 @@ -51,6 +68,32 @@ Hero Union联盟网站:[Hero Union英雄联盟](https://herounion.filesite.io/ 以下为联盟所有接口的详细文档: +### 爬虫状态上报接口 + +* 接口网址: +``` +https://herounion.filesite.io/api/onboard/ +``` +* 请求方法:**POST** +* 请求参数: +``` +name +description +status: [idle, busy] +platforms: 爬虫支持的平台,可由爬虫定义,也可参考本文档底部“国内知名平台名称列表” +contracts: 支持的数据抓取合约,具体内容由爬虫定义 +timestamp +country +lang +contact: 可选,爬虫提供方联系方式,将在英雄联盟网站展示,便于大家相互联系 +``` + +其中country国家代码和lang语言代码参数值请参考下面标准: + +* [country代码参考两位ISO CODES](https://countrycode.org/) +* [lang语言代码参考ISO 639-1 Code](https://www.loc.gov/standards/iso639-2/php/code_list.php) + + ### 爬虫任务领取接口 * 接口网址: @@ -58,7 +101,14 @@ Hero Union联盟网站:[Hero Union英雄联盟](https://herounion.filesite.io/ https://herounion.filesite.io/api/gettask/ ``` * 请求方法:**GET** -* 请求参数:**无** +* 请求参数: +``` +platforms: 爬虫支持的平台 +contracts: 爬虫支持的合约 +country: 可选,爬虫所在国家 +lang: 可选,爬虫支持的语言 +data_mode: 可选,爬虫支持的返回数据格式 +``` ### 爬虫任务完成回传接口 @@ -139,32 +189,6 @@ sign ``` -### 爬虫状态上报接口 - -* 接口网址: -``` -https://herounion.filesite.io/api/onboard/ -``` -* 请求方法:**POST** -* 请求参数: -``` -name -description -status: [idle, busy] -platforms: 爬虫支持的平台,可由爬虫定义,也可参考本文档底部“国内知名平台名称列表” -contracts: 支持的数据抓取合约,具体内容由爬虫定义 -timestamp -country -lang -contact: 可选,爬虫提供方联系方式,将在英雄联盟网站展示,便于大家相互联系 -``` - -其中country国家代码和lang语言代码参数值请参考下面标准: - -* [country代码参考两位ISO CODES](https://countrycode.org/) -* [lang语言代码参考ISO 639-1 Code](https://www.loc.gov/standards/iso639-2/php/code_list.php) - - ### Hero爬虫查询接口 * 接口网址: diff --git a/heroUnion.mjs b/heroUnion.mjs index f78069e..f2d0382 100644 --- a/heroUnion.mjs +++ b/heroUnion.mjs @@ -198,15 +198,15 @@ class HeroUnion { } //参数均可选,获取 1 个待处理的任务 - getWaitingTask(platform, contract, country, lang, data_mode) { + getWaitingTask(platforms, contracts, country, lang, data_mode) { let searchResult = null; let taskIndex = this.tasks.findIndex(function(item) { - if (typeof(platform) != 'undefined' && platform && item.platform != platform) { + if (typeof(platforms) != 'undefined' && platforms && platforms.indexOf(item.platform) == -1) { return false; } - if (typeof(contract) != 'undefined' && contract && item.contract != contract) { + if (typeof(contracts) != 'undefined' && contracts && contracts.indexOf(item.contract) == -1) { return false; } @@ -218,7 +218,7 @@ class HeroUnion { return false; } - if (typeof(data_mode) != 'undefined' && data_mode && task.data_mode != data_mode) { + if (typeof(data_mode) != 'undefined' && data_mode && item.data_mode != data_mode) { return false; } diff --git a/router_api.mjs b/router_api.mjs index 54a6392..accb575 100644 --- a/router_api.mjs +++ b/router_api.mjs @@ -168,15 +168,48 @@ router.get('/querytask/', async (req, res) => { * hero爬虫从联盟获取等待中的数据抓取任务 * * 参数: - * platform: 爬虫支持的平台 - * contract:爬虫支持的合约 - * country:爬虫所在国家 - * lang:爬虫支持的语言 - * data_mode:爬虫支持的返回数据格式 + * platforms: 爬虫支持的平台 + * contracts: 爬虫支持的合约 + * country: 爬虫所在国家 + * lang: 爬虫支持的语言 + * data_mode: 爬虫支持的返回数据格式 **/ router.get('/gettask/', async (req, res) => { + let platforms = req.query.platforms, + contracts = req.query.contracts, + country = req.query.country ? req.query.country : 'cn', + lang = req.query.lang ? req.query.lang : 'zh', + data_mode = req.query.data_mode ? req.query.data_mode : 'json'; - return res.send('api/gettask/'); + let data = {code: 0, message: ''}; + + //参数检查 + if (!platforms || !contracts) { + data.message = '必选参数platforms、contracts不能为空'; + }else if (common.isPlatformsOk(platforms) == false) { + data.message = '支持的平台platforms应为英文逗号间隔的3 - 100个英文字符串'; + }else if (common.isContractsOk(contracts) == false) { + data.message = '支持的合约contracts应为英文逗号间隔的3 - 100个英文字符串'; + }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 (data_mode && data_mode != 'json' && data_mode != 'html') { + data.message = '数据格式data_mode可选值:json, html'; + } + + //获取等待中的任务 + if (!data.message) { + data.task = heroUnion.getWaitingTask(platforms, contracts, country, lang, data_mode); + if (data.task) { + data.code = 1; + data.message = '获取待处理任务完成'; + }else { + data.message = '暂时没有跟你支持的平台、合约匹配的待处理任务'; + } + } + + return res.status(200).json(data); }); /** diff --git a/test/heroUnion.test.mjs b/test/heroUnion.test.mjs index c6f75d5..28e7107 100644 --- a/test/heroUnion.test.mjs +++ b/test/heroUnion.test.mjs @@ -133,6 +133,40 @@ test('HeroUnion task query test', async (t) => { assert.ok(response2.data.task); }); +test('HeroUnion get waiting task test', async (t) => { + //case 1 + let params = { + platforms: 'douyin,kuaishou,xigua,bilibili', + contracts: 'tajiantv', + data_mode: 'json', + country: 'cn', + lang: 'zh' + }; + + let api = 'http://127.0.0.1:8080/api/gettask/'; + + let queryOption = axiosConfig; + queryOption.method = 'get'; + queryOption.url = api; + queryOption.params = params; + + const response = await axios(queryOption); + console.log(response.data); + + assert.equal(response.status, 200); + assert.equal(response.data.code, 1); + assert.ok(response.data.task); + + //case 2 + params.platforms = 'youku'; + const response2 = await axios(queryOption); + console.log(response2.data); + + assert.equal(response2.status, 200); + assert.equal(response2.data.code, 0); + assert.ifError(response2.data.task); +}); + test('HeroUnion stats test', async (t) => { let api = 'http://127.0.0.1:8080/api/stats/';