diff --git a/docs/en/other.md b/docs/en/other.md index 79a9f6239a..39acb454cd 100644 --- a/docs/en/other.md +++ b/docs/en/other.md @@ -126,6 +126,18 @@ Official Website: +## Instructables + +### Projects + + + +| All | Circuits | Workshop | Craft | Cooking | Living | Outside | Teachers | +| --- | -------- | -------- | ----- | ------- | ------ | ------- | -------- | +| | circuits | workshop | craft | cooking | living | outside | teachers | + + + ## Japanpost ### Track & Trace Service diff --git a/docs/other.md b/docs/other.md index ebadb88941..16f539f479 100644 --- a/docs/other.md +++ b/docs/other.md @@ -157,6 +157,18 @@ pageClass: routes +## Instructables + +### Projects + + + +| All | Circuits | Workshop | Craft | Cooking | Living | Outside | Teachers | +| --- | -------- | -------- | ----- | ------- | ------ | ------- | -------- | +| | circuits | workshop | craft | cooking | living | outside | teachers | + + + ## iYouport ### 首页(旧版) diff --git a/lib/v2/instructables/maintainer.js b/lib/v2/instructables/maintainer.js new file mode 100644 index 0000000000..49bfd89fcf --- /dev/null +++ b/lib/v2/instructables/maintainer.js @@ -0,0 +1,3 @@ +module.exports = { + '/projects/:category?': ['wolfg1969'], +}; diff --git a/lib/v2/instructables/projects.js b/lib/v2/instructables/projects.js new file mode 100644 index 0000000000..db2ebeffbb --- /dev/null +++ b/lib/v2/instructables/projects.js @@ -0,0 +1,55 @@ +const got = require('@/utils/got'); + +module.exports = async (ctx) => { + const category = ctx.params.category ?? 'all'; + + const siteDomain = 'www.instructables.com'; + const apiKey = 'NU5CdGwyRDdMVnVmM3l4cWNqQzFSVzJNZU5jaUxFU3dGK3J2L203MkVmVT02ZWFYeyJleGNsdWRlX2ZpZWxkcyI6WyJvdXRfb2YiLCJzZWFyY2hfdGltZV9tcyIsInN0ZXBCb2R5Il0sInBlcl9wYWdlIjo1MH0='; + + let pathPrefix, projectFilter; + if (category === 'all') { + pathPrefix = ''; + projectFilter = ''; + } else { + pathPrefix = `${category}/`; + const filterValue = `${category.charAt(0).toUpperCase()}${category.slice(1)}`; + projectFilter = category !== 'teachers' ? ` && category:=${filterValue}` : `&& teachers:=${filterValue}`; + } + + const link = `https://${siteDomain}/${pathPrefix}projects?projects=all`; + + const response = await got({ + method: 'get', + url: `https://${siteDomain}/api_proxy/search/collections/projects/documents/search`, + headers: { + Referer: link, + Host: siteDomain, + 'x-typesense-api-key': apiKey, + }, + searchParams: { + q: '*', + query_by: 'title,stepBody,screenName', + page: 1, + per_page: 50, + sort_by: 'publishDate:desc', + include_fields: 'title,urlString,coverImageUrl,screenName,publishDate,favorites,views,primaryClassification,featureFlag,prizeLevel,IMadeItCount', + filter_by: `featureFlag:=true${projectFilter}`, + }, + }); + + const data = response.data; + + ctx.state.data = { + title: 'Instructables Projects', // 项目的标题 + link, // 指向项目的链接 + description: 'Instructables Projects', // 描述项目 + language: 'en', // 频道语言 + item: data.hits.map((item) => ({ + title: item.document.title, + link: `https://${siteDomain}/${item.document.urlString}`, + author: item.document.screenName, + pubDate: new Date(item.document.publishDate).toUTCString(), + category: item.document.primaryClassification, + })), + }; +}; diff --git a/lib/v2/instructables/radar.js b/lib/v2/instructables/radar.js new file mode 100644 index 0000000000..74d910faab --- /dev/null +++ b/lib/v2/instructables/radar.js @@ -0,0 +1,19 @@ +module.exports = { + 'instructables.com': { + _name: 'Instructables', + '.': [ + { + title: 'All Projects - Instructables', + docs: 'https://docs.rsshub.app/other.html#instructables', + source: ['/projects'], + target: '/instructables/projects', + }, + { + title: 'Projects - Instructables', + docs: 'https://docs.rsshub.app/other.html#instructables', + source: ['/:category/projects'], + target: (params) => `/instructables/projects/${params.category}`, + }, + ], + }, +}; diff --git a/lib/v2/instructables/router.js b/lib/v2/instructables/router.js new file mode 100644 index 0000000000..0aaba1274d --- /dev/null +++ b/lib/v2/instructables/router.js @@ -0,0 +1,3 @@ +module.exports = (router) => { + router.get('/projects/:category?', require('./projects')); +};