diff --git a/README.md b/README.md index 4d0896f..37bc851 100644 --- a/README.md +++ b/README.md @@ -15,15 +15,18 @@ Hero Union主要做两件事: 1. [联盟成员使用流程](#联盟成员使用流程) 2. [联盟的爬虫工作流程](#联盟的爬虫工作流程) * [Hero Union 联盟接口](#hero-union-联盟接口) - 1. [爬虫状态上报接口](#爬虫状态上报接口) - 2. [爬虫任务领取接口](#爬虫任务领取接口) - 3. [爬虫任务完成回传接口](#爬虫任务完成回传接口) - 4. [提交网页抓取任务接口](#提交网页抓取任务接口) - 5. [查询网页抓取任务结果接口](#查询网页抓取任务结果接口) - 6. [爬虫任务完成回调通知接口](#爬虫任务完成回调通知接口) - 7. [Hero爬虫查询接口](#Hero爬虫查询接口) - 8. [联盟状态查询接口](#联盟状态查询接口) - + 1. [提交网页抓取任务接口](#提交网页抓取任务接口) + 2. [查询网页抓取任务结果接口](#查询网页抓取任务结果接口) + 3. [爬虫任务完成回调通知接口](#爬虫任务完成回调通知接口) + 4. [Hero爬虫查询接口](#Hero爬虫查询接口) + 5. [联盟状态查询接口](#联盟状态查询接口) + 6. [爬虫状态上报接口](#爬虫状态上报接口) + 7. [爬虫任务领取接口](#爬虫任务领取接口) + 8. [爬虫任务完成回传接口](#爬虫任务完成回传接口) +* [接口参数签名方法](#接口参数签名方法) +* [国内知名平台名称列表](#国内知名平台名称列表) +* [Hero Union英雄联盟开发进度](#hero-union英雄联盟开发进度) +* [其它参考](#其它参考) ## Hero Union 英雄联盟使用流程 @@ -68,65 +71,6 @@ 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) - - -### 爬虫任务领取接口 - -* 接口网址: -``` -https://herounion.filesite.io/api/gettask/ -``` -* 请求方法:**GET** -* 请求参数: -``` -platforms: 爬虫支持的平台 -contracts: 爬虫支持的合约 -country: 可选,爬虫所在国家 -lang: 可选,爬虫支持的语言 -data_mode: 可选,爬虫支持的返回数据格式 -``` - - -### 爬虫任务完成回传接口 - -* 接口网址: -``` -https://herounion.filesite.io/api/savetask/ -``` -* 请求方法:**POST** -* 请求参数: -``` -task_id -task_result -timestamp -sign -``` - - ### 提交网页抓取任务接口 * 接口网址: @@ -152,9 +96,11 @@ sign * platform: url所属平台,目前支持的:抖音、快手、西瓜视频、bilibili * contract: 数据抓取合约,目前支持的:tajiantv,可由爬虫自定义并实现合约规则 * data_mode: 返回数据格式,默认:json,可选值:json、html +* sign: 对所有参数进行签名,具体方法见文档底部[接口参数签名方法](#接口参数签名方法) -返回值: -如果提交完成,会返回新任务数据task。 +返回值(以下其它接口返回值类似): +* 如果提交完成,返回code=1、及新任务数据task +* 如果提交失败,返回code=0、及错误信息message ### 查询网页抓取任务结果接口 @@ -188,6 +134,10 @@ timestamp sign ``` +notify_url返回值: +* 处理成功返回http status 200,其它状态码被视为失败 +* 如果回调通知收到失败的状态码,将会在一定时间内再次重试 + ### Hero爬虫查询接口 @@ -202,6 +152,9 @@ page: 可选,从1开始的页码 limit: 可选,每页数量 ``` +返回值: +* 最多返回联盟最新的1000个爬虫 + ### 联盟状态查询接口 @@ -212,6 +165,74 @@ https://herounion.filesite.io/api/stats/ * 请求方法:**GET** * 请求参数:**无** +返回值示例: +``` +{ + start_time: 1712826714, + taskStatus: { total: 6, waiting: 6, running: 0, done: 0, failed: 0 }, + heroStatus: { total: 4, idle: 4, busy: 0, offline: 0 }, + run_seconds: 94 +} +``` + + +### 爬虫状态上报接口 + +* 接口网址: +``` +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) + + +### 爬虫任务领取接口 + +* 接口网址: +``` +https://herounion.filesite.io/api/gettask/ +``` +* 请求方法:**GET** +* 请求参数: +``` +platforms: 爬虫支持的平台 +contracts: 爬虫支持的合约 +country: 可选,爬虫所在国家 +lang: 可选,爬虫支持的语言 +data_mode: 可选,爬虫支持的返回数据格式 +``` + + +### 爬虫任务完成回传接口 + +* 接口网址: +``` +https://herounion.filesite.io/api/savetask/ +``` +* 请求方法:**POST** +* 请求参数: +``` +task_id +task_result +timestamp +sign +``` + ## 接口参数签名方法 @@ -249,15 +270,14 @@ var sign = md5( JSON.stringify(sortedParams) + token ); * bilibili - B站 -## Hero Union 英雄联盟开发进度 +## Hero Union英雄联盟开发进度 更新日期:2024-4-10 * v0.1 - beta 开发中,完成进度 80% 左右 - -## 参考 +## 其它参考 npm install 使用代理,本地socks转web proxy软件: ``` diff --git a/conf/config.json b/conf/config.json index 0cb9ba4..d400eb8 100644 --- a/conf/config.json +++ b/conf/config.json @@ -12,6 +12,8 @@ "reloadConfigFrequence": 60, "heroHeartCheckFrequence": 60, + "max_list_hero_num": 1000, + "tokens": { "herounion_demo": "hello#world!" } diff --git a/heroUnion.mjs b/heroUnion.mjs index f2d0382..d74346b 100644 --- a/heroUnion.mjs +++ b/heroUnion.mjs @@ -37,6 +37,7 @@ class HeroUnion { this.notify_timeout = 8; //回调通知请求超时时长,单位:秒 this.notify_max_try = 5; //回调通知最多尝试次数 this.heroHeartTimeout = 600; //爬虫心跳超时时长,单位:秒 + this.max_list_hero_num = 1000; //在接口getHeros()里最多返回的爬虫数量 this.stats = { start_time: common.getTimestampInSeconds() @@ -105,6 +106,10 @@ class HeroUnion { if (typeof(this.config.heroHeartTimeout) != 'undefined' && this.config.heroHeartTimeout) { this.heroHeartTimeout = this.config.heroHeartTimeout; //爬虫心跳超时时长,单位:秒 } + + if (typeof(this.config.max_list_hero_num) != 'undefined' && this.config.max_list_hero_num) { + this.max_list_hero_num = this.config.max_list_hero_num; //最大返回爬虫数量 + } } return this.config; @@ -202,6 +207,8 @@ class HeroUnion { let searchResult = null; let taskIndex = this.tasks.findIndex(function(item) { + if (item.status != 'waiting') {return false;} + if (typeof(platforms) != 'undefined' && platforms && platforms.indexOf(item.platform) == -1) { return false; } @@ -230,6 +237,10 @@ class HeroUnion { //为task生成一个随机密钥,便于爬虫处理完成后回传的时候对数据进行签名 this.tasks[taskIndex].token = this.generateTaskToken(this.tasks[taskIndex].id); + //更新统计数据 + this.taskStatus.waiting --; + this.taskStatus.running ++; + searchResult = this.tasks[taskIndex]; } @@ -434,8 +445,21 @@ class HeroUnion { if (end > this.heros.length) { end = this.heros.length; + }else if (end > this.max_list_hero_num) { + end = this.max_list_hero_num; } + //根据心跳时间从新到旧排序 + this.heros.sort(function(itemA, itemB) { + if (itemA.timestamp > itemB.timestamp) { + return -1; + }else if (itemA.timestamp < itemB.timestamp){ + return 1; + } + + return 0; + }); + return this.heros.slice(start, end); } diff --git a/router_api.mjs b/router_api.mjs index accb575..0368363 100644 --- a/router_api.mjs +++ b/router_api.mjs @@ -18,10 +18,14 @@ router.get('/', async (req, res) => { const apiList = { "/api/": "查看所有API", - "/api/onboard/": "爬虫状态上报到联盟", "/api/stats/": "查看联盟状态", + "/api/heros/": "获取联盟中的爬虫数据", "/api/newtask/": "向联盟提交新的爬虫任务", + "/api/querytask/": "根据任务ID查询任务数据", + + "/api/onboard/": "爬虫状态上报到联盟", + "/api/gettask/": "爬虫从联盟获取待处理任务", }; const data = {