diff --git a/docs/picture.md b/docs/picture.md index c3c9ad6870..56b3c4b462 100644 --- a/docs/picture.md +++ b/docs/picture.md @@ -44,6 +44,12 @@ pageClass: routes +## GirlImg + +### album + + + ## Google Doodles ### 更新 diff --git a/lib/router.js b/lib/router.js index ed12b5e225..dd861aac40 100644 --- a/lib/router.js +++ b/lib/router.js @@ -2529,4 +2529,7 @@ router.get('/ccreports/article', require('./routes/ccreports')); // iYouPort router.get('/iyouport/article', require('./routes/iyouport')); +// girlimg +router.get('/girlimg/album/:tag?/:mode?', require('./routes/girlimg/album')); + module.exports = router; diff --git a/lib/routes/girlimg/album.js b/lib/routes/girlimg/album.js new file mode 100644 index 0000000000..57b19fa452 --- /dev/null +++ b/lib/routes/girlimg/album.js @@ -0,0 +1,57 @@ +const got = require('@/utils/got'); +const CryptoJS = require('crypto-js'); +const password = 'gefdzfdef'; + +module.exports = async (ctx) => { + const tag = ctx.params.tag ? ctx.params.tag : 'all'; + const mode = ctx.params.mode ? ctx.params.mode : 'simple'; + const limit = 'simple' === mode ? 20 : 10; + + const url = `https://girlimg.epio.app/api/articles?lang=en-us&filter={"where":{"tag":"${tag}","lang":"en-us"},"limit":20,"skip":0}`; + + const index_json = await fetchUrl(url); + + const items = await Promise.all( + index_json.slice(0, limit).map(async (item) => { + const simple = { + title: item.title, + link: `https://girlimg.epio.app/article/detail/${item._id}`, + pubDate: new Date(item.release_date).toUTCString(), + }; + let details; + if ('simple' === mode) { + details = { + description: item.cover, + }; + } else { + details = await ctx.cache.tryGet(item._id, async () => { + const data = await fetchUrl(`https://girlimg.epio.app/api/articles/${item._id}?lang=en-us`); + return { + description: data.content, + }; + }); + } + return Promise.resolve(Object.assign({}, simple, details)); + }) + ); + ctx.state.data = { + title: 'girlimg - album', + link: `https://girlimg.epio.app`, + item: items, + }; +}; + +async function fetchUrl(url) { + const encrypt_json = ( + await got({ + method: 'get', + url: url, + headers: { + Referer: 'https://girlimg.epio.app/', + }, + }) + ).data; + + const bytes = CryptoJS.AES.decrypt(encrypt_json.string, password); + return JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); +} diff --git a/package.json b/package.json index 46d8ae2b0c..b081579252 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "chrono-node": "1.4.5", "cloudscraper": "4.6.0", "co-redis": "2.1.1", + "crypto-js": "4.0.0", "currency-symbol-map": "4.0.4", "dayjs": "1.8.24", "dotenv": "8.2.0", diff --git a/yarn.lock b/yarn.lock index 5545bc2e91..f615710f11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3764,6 +3764,11 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +crypto-js@4.0.0: + version "4.0.0" + resolved "https://registry.npm.taobao.org/crypto-js/download/crypto-js-4.0.0.tgz?cache=0&sync_timestamp=1581509247325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcrypto-js%2Fdownload%2Fcrypto-js-4.0.0.tgz#2904ab2677a9d042856a2ea2ef80de92e4a36dcc" + integrity sha1-KQSrJnep0EKFai6i74DekuSjbcw= + crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"