diff --git a/docs/multimedia.md b/docs/multimedia.md index b94fbf7d34..a8390b78ac 100644 --- a/docs/multimedia.md +++ b/docs/multimedia.md @@ -118,6 +118,12 @@ pageClass: routes +## JavLibrary + +### 用户文章 + + + ## Mp4Ba ### 影视分类 diff --git a/lib/router.js b/lib/router.js index d9931441b4..adbf7d7b35 100644 --- a/lib/router.js +++ b/lib/router.js @@ -2181,4 +2181,7 @@ router.get('/letterboxd/user/diary/:username', require('./routes/letterboxd/user // 网易大神 router.get('/netease/ds/:id', require('./routes/netease/ds')); +// javlibrary +router.get('/javlibrary/posts/:uid', require('./routes/javlibrary/posts')); + module.exports = router; diff --git a/lib/routes/javlibrary/posts.js b/lib/routes/javlibrary/posts.js new file mode 100644 index 0000000000..df9ddd5fe8 --- /dev/null +++ b/lib/routes/javlibrary/posts.js @@ -0,0 +1,35 @@ +const cheerio = require('cheerio'); +const dateUtil = require('@/utils/date'); +const cloudscraper = require('cloudscraper'); +const API = 'http://www.javlibrary.com/cn/userposts.php?u='; + +module.exports = async (ctx) => { + const uid = ctx.params.uid; + const link = API + uid; + const response = await cloudscraper.get(link); + const $ = cheerio.load(response); + const list = $('div#rightcolumn table.comment'); + + ctx.state.data = { + title: `Javlibrary - ${uid} 发表的文章`, + link: link, + item: + list && + list + .map((index, item) => { + item = $(item); + // 文章内容只能抓取到 td.t textarea,若含有图片则替换[img]image-link[/img] => + let comments = item.find('td.t textarea').text(); + comments = comments.replace(new RegExp('\\[img\\]', 'g'), ''); + return { + title: item.find('td > strong').text(), + link: item.find('td > strong > a').attr('href'), + description: `${item.find('table.videoinfo').html()}
+

${comments}

`, + pubDate: dateUtil(item.find('td.date')), + guid: item.find('td > strong > a').attr('href'), + }; + }) + .get(), + }; +}; diff --git a/package.json b/package.json index d9771eaae2..f59d394d5a 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "aes-js": "3.1.2", "art-template": "4.13.2", "cheerio": "1.0.0-rc.3", + "cloudscraper": "4.5.0", "co-redis": "2.1.1", "currency-symbol-map": "4.0.4", "dayjs": "1.8.19", diff --git a/test/middleware/access-control.js b/test/middleware/access-control.js index b855dbcc42..9e755da703 100644 --- a/test/middleware/access-control.js +++ b/test/middleware/access-control.js @@ -1,5 +1,6 @@ const supertest = require('supertest'); let server; +jest.mock('request-promise-native'); async function checkBlock(response) { expect(response.status).toBe(403); diff --git a/test/middleware/cache.js b/test/middleware/cache.js index 75b6f1f0dd..eb66470c69 100644 --- a/test/middleware/cache.js +++ b/test/middleware/cache.js @@ -3,6 +3,7 @@ const Parser = require('rss-parser'); const parser = new Parser(); const wait = require('../../lib/utils/wait'); let server; +jest.mock('request-promise-native'); beforeAll(() => { process.env.CACHE_EXPIRE = 1; diff --git a/test/middleware/debug.js b/test/middleware/debug.js index e696f99321..73d3c85c7a 100644 --- a/test/middleware/debug.js +++ b/test/middleware/debug.js @@ -1,6 +1,7 @@ process.env.NODE_NAME = 'mock'; const supertest = require('supertest'); +jest.mock('request-promise-native'); const server = require('../../lib/index'); const request = supertest(server); const cheerio = require('cheerio'); diff --git a/test/middleware/header.js b/test/middleware/header.js index 4204ba2fe7..3e19a802e5 100644 --- a/test/middleware/header.js +++ b/test/middleware/header.js @@ -1,6 +1,7 @@ process.env.NODE_NAME = 'mock'; const supertest = require('supertest'); +jest.mock('request-promise-native'); const server = require('../../lib/index'); const request = supertest(server); const config = require('../../lib/config').value; diff --git a/test/middleware/onerror.js b/test/middleware/onerror.js index 8c12e8d8d4..3292b3a4ba 100644 --- a/test/middleware/onerror.js +++ b/test/middleware/onerror.js @@ -1,6 +1,7 @@ process.env.SENTRY = 'https://mock@mock.com/1'; const supertest = require('supertest'); +jest.mock('request-promise-native'); const server = require('../../lib/index'); const request = supertest(server); diff --git a/test/middleware/parameter.js b/test/middleware/parameter.js index 23c058d085..3a6f113c55 100644 --- a/test/middleware/parameter.js +++ b/test/middleware/parameter.js @@ -1,4 +1,5 @@ const supertest = require('supertest'); +jest.mock('request-promise-native'); const server = require('../../lib/index'); const request = supertest(server); const Parser = require('rss-parser'); diff --git a/test/middleware/template.js b/test/middleware/template.js index 5102d2ff1a..276d23f4e9 100644 --- a/test/middleware/template.js +++ b/test/middleware/template.js @@ -1,4 +1,5 @@ const supertest = require('supertest'); +jest.mock('request-promise-native'); const server = require('../../lib/index'); const request = supertest(server); const Parser = require('rss-parser'); diff --git a/test/pkg.js b/test/pkg.js index 31b9ff635a..51cdbad2bb 100644 --- a/test/pkg.js +++ b/test/pkg.js @@ -1,3 +1,4 @@ +jest.mock('request-promise-native'); const RSSHub = require('../lib/pkg'); describe('pkg', () => { diff --git a/test/router.js b/test/router.js index c91bbc8068..9943df74b1 100644 --- a/test/router.js +++ b/test/router.js @@ -1,6 +1,7 @@ process.env.SOCKET = 'socket'; const supertest = require('supertest'); +jest.mock('request-promise-native'); const server = require('../lib/index'); const request = supertest(server); const Parser = require('rss-parser'); diff --git a/yarn.lock b/yarn.lock index c45f6952e0..6afa08a3e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3031,6 +3031,13 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +cloudscraper@4.5.0: + version "4.5.0" + resolved "https://registry.npm.taobao.org/cloudscraper/download/cloudscraper-4.5.0.tgz#884108d82ca870a5b02819b834c599e4725aaf50" + integrity sha1-iEEI2CyocKWwKBm4NMWZ5HJar1A= + dependencies: + request-promise "^4.2.4" + co-redis@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/co-redis/-/co-redis-2.1.1.tgz#8bc3717977c9ee5bfb6b28f39ae01bcf724d2dde" @@ -9852,6 +9859,16 @@ request-promise@^4.2.2: stealthy-require "^1.1.1" tough-cookie "^2.3.3" +request-promise@^4.2.4: + version "4.2.5" + resolved "https://registry.npm.taobao.org/request-promise/download/request-promise-4.2.5.tgz?cache=0&sync_timestamp=1572828627911&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest-promise%2Fdownload%2Frequest-promise-4.2.5.tgz#186222c59ae512f3497dfe4d75a9c8461bd0053c" + integrity sha1-GGIixZrlEvNJff5NdanIRhvQBTw= + dependencies: + bluebird "^3.5.0" + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.68.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"