diff --git a/lib/router.js b/lib/router.js index 3e78f10e4c50f6..36a357b75135f5 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1047,8 +1047,8 @@ router.get('/im2maker/:channel?', lazyloadRouteHandler('./routes/im2maker/index' router.get('/cninfo/announcement/:column/:code/:orgId/:category?/:search?', lazyloadRouteHandler('./routes/cninfo/announcement')); // 中华人民共和国农业农村部 -router.get('/gov/moa/sjzxfb', lazyloadRouteHandler('./routes/gov/moa/sjzxfb')); -router.get('/gov/moa/:suburl(.*)', lazyloadRouteHandler('./routes/gov/moa/moa')); +// router.get('/gov/moa/sjzxfb', lazyloadRouteHandler('./routes/gov/moa/sjzxfb')); +// router.get('/gov/moa/:suburl(.*)', lazyloadRouteHandler('./routes/gov/moa/moa')); // 香水时代 router.get('/nosetime/:id/:type/:sort?', lazyloadRouteHandler('./routes/nosetime/comment')); diff --git a/lib/routes/gov/moa/sjzxfb.js b/lib/routes/gov/moa/sjzxfb.js deleted file mode 100644 index c9058775dcb7d3..00000000000000 --- a/lib/routes/gov/moa/sjzxfb.js +++ /dev/null @@ -1,20 +0,0 @@ -const got = require('@/utils/got'); - -module.exports = async (ctx) => { - const response = await got({ - method: 'get', - url: `http://zdscxx.moa.gov.cn:8080/misportal/echartReport/webData/%E6%9C%80%E6%96%B0%E5%8F%91%E5%B8%83/page1.json`, - }); - const data = response.data; - - ctx.state.data = { - title: '中华人民共和国农业农村部 - 数据 - 最新发布', - link: `http://zdscxx.moa.gov.cn:8080/nyb/pc/index.jsp`, - item: data.map((item) => ({ - title: item.title, - description: item.content, - link: `http://zdscxx.moa.gov.cn:8080/misportal/public/agricultureMessageViewDC.jsp?page=1&channel=%E6%9C%80%E6%96%B0%E5%8F%91%E5%B8%83&id=${item._id}`, - pubDate: new Date(item.publishTime), - })), - }; -}; diff --git a/lib/v2/gov/maintainer.js b/lib/v2/gov/maintainer.js index b743963c3f5699..ed325940455a1f 100644 --- a/lib/v2/gov/maintainer.js +++ b/lib/v2/gov/maintainer.js @@ -29,6 +29,8 @@ module.exports = { '/miit/zcwj': ['Yoge-Code'], '/miit/wjgs': ['Yoge-Code'], '/miit/zcjd': ['Yoge-Code'], + '/moa/zdscxx/:channel?/:source?': ['MisteryMonster', 'nczitzk'], + '/moa/:suburl': ['Origami404'], '/moe/:type': ['Crawler995'], '/moe/s78/:column': ['TonyRL'], '/mofcom/article/:suffix+': ['LogicJake'], @@ -51,7 +53,8 @@ module.exports = { '/zhengce/govall/:advance?': ['ciaranchen'], '/zhengce/wenjian/:pcodeJiguan?': ['ciaranchen'], '/zhengce/zhengceku/:department': ['zxx-457'], - '/zhengce/zuixin': ['SettingDust'], + '/zhengce/zuixin': ['SettingDust', 'nczitzk'], + '/zhengce/:category?': ['nczitzk'], // province '/anhui/kjt/:path?': ['nczitzk'], '/beijing/bphc/:channel': ['bigfei'], diff --git a/lib/routes/gov/moa/moa.js b/lib/v2/gov/moa/moa.js similarity index 100% rename from lib/routes/gov/moa/moa.js rename to lib/v2/gov/moa/moa.js diff --git a/lib/v2/gov/moa/zdscxx.js b/lib/v2/gov/moa/zdscxx.js new file mode 100644 index 00000000000000..df327047d8b9d6 --- /dev/null +++ b/lib/v2/gov/moa/zdscxx.js @@ -0,0 +1,104 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const { parseDate } = require('@/utils/parse-date'); + +module.exports = async (ctx) => { + const { category } = ctx.params; + const limit = ctx.query.limit ? parseInt(ctx.query.limit, 10) : 5; + + const domain = 'moa.gov.cn'; + const rootFrameUrl = `http://www.${domain}`; + const rootUrl = `http://zdscxx.${domain}:8080`; + const apiUrl = new URL('nyb/getMessages', rootUrl).href; + const apiDetailUrl = new URL('nyb/getMessagesById', rootUrl).href; + const currentUrl = new URL('nyb/pc/messageList.jsp', rootUrl).href; + const frameUrl = new URL('iframe/top_sj/', rootFrameUrl).href; + + let filterForm = {}; + + if (category) { + const apiFilterUrl = new URL('nyb/getMessageFilters', rootUrl).href; + + const { data: filterResponse } = await got.post(apiFilterUrl, { + form: { + type: '', + isLatestMessage: false, + }, + }); + + const filters = filterResponse.result.reduce((filters, f) => { + filters[f.name] = f.data.map((d) => d.name); + return filters; + }, {}); + + filterForm = category.split(/\//).reduce((form, c) => { + Object.keys(filters) + .filter((key) => filters[key].includes(c)) + .forEach((key) => { + form[key] = c; + }); + return form; + }, {}); + } + + const { data: response } = await got.post(apiUrl, { + form: { + page: 1, + rows: limit, + type: '', + isLatestMessage: false, + ...filterForm, + }, + }); + + let items = response.result.table.slice(0, limit).map((item) => ({ + title: item.title, + link: item.id, + guid: `moa-zdscxx-${item.id}`, + pubDate: parseDate(item.date), + })); + + items = await Promise.all( + items.map((item) => + ctx.cache.tryGet(item.guid, async () => { + const { data: detailResponse } = await got.post(apiDetailUrl, { + form: { + id: item.link, + }, + }); + + const data = detailResponse.result; + + item.title = data.title; + item.link = new URL(`nyb/pc/messageView.jsp?id=${item.link}`, rootUrl).href; + item.description = data.content; + item.author = data.source; + item.pubDate = parseDate(data.date); + + return item; + }) + ) + ); + + const { data: frameResponse } = await got(frameUrl); + + const $ = cheerio.load(frameResponse); + + const title = $('title').text(); + const description = '数据'; + const icon = new URL('favicon.ico', rootUrl).href; + + ctx.state.data = { + item: items, + title: `${title} - ${description} - ${category}`, + link: currentUrl, + description, + language: 'zh', + image: $('h1.logo a img').prop('src'), + icon, + logo: icon, + subtitle: category, + author: title, + allowEmpty: true, + }; +}; diff --git a/lib/v2/gov/radar.js b/lib/v2/gov/radar.js index 38e3447bdaddda..d41bede055fa76 100644 --- a/lib/v2/gov/radar.js +++ b/lib/v2/gov/radar.js @@ -816,6 +816,35 @@ module.exports = { }, ], }, + 'moa.gov.cn': { + _name: '中华人民共和国农业农村部', + '.': [ + { + title: '新闻', + docs: 'https://docs.rsshub.app/routes/government#zhong-hua-ren-min-gong-he-guo-jiao-yu-bu-xin-wen', + source: ['/'], + target: '/gov/moa/:suburl', + }, + ], + zdscxx: [ + { + title: '数据', + docs: 'https://docs.rsshub.app/routes/government#zhong-hua-ren-min-gong-he-guo-jiao-yu-bu', + source: ['/nyb/pc/messageView.jsp'], + target: (_params, _url, document) => { + if (!document) { + return '/gov/moa/zdscxx'; + } + const selected = document.querySelectorAll('.colorRed'); + const categories = Array.from(selected) + .map((s) => s.getAttribute('_key')) + .join('/'); + + return `/gov/moa/zdscxx${categories ? `/${categories}` : ''}`; + }, + }, + ], + }, 'moe.gov.cn': { _name: '中华人民共和国教育部', '.': [ @@ -1194,6 +1223,16 @@ module.exports = { source: ['/pushinfo/v150203', '/'], target: '/gov/news/gwy', }, + { + title: '政策', + docs: 'https://docs.rsshub.app/routes/government#zhong-guo-zheng-fu-wang-zheng-ce', + source: ['/zhengce/:category*'], + target: (params) => { + const category = params.category; + + return `/gov/zhengce${category ? `/${category}` : ''}`; + }, + }, { title: '最新政策', docs: 'https://docs.rsshub.app/routes/government#zhong-guo-zheng-fu-wang', diff --git a/lib/v2/gov/router.js b/lib/v2/gov/router.js index ebd1258ecccf17..af1d1c9f2da649 100644 --- a/lib/v2/gov/router.js +++ b/lib/v2/gov/router.js @@ -21,6 +21,9 @@ module.exports = function (router) { router.get('/miit/zcwj', require('./miit/zcwj')); router.get('/miit/wjgs', require('./miit/wjgs')); router.get('/miit/zcjd', require('./miit/zcjd')); + router.get('/moa/sjzxfb/:category*', require('./moa/zdscxx')); + router.get('/moa/zdscxx/:category*', require('./moa/zdscxx')); + router.get('/moa/:suburl(.*)', require('./moa/moa')); router.get('/moe/:type', require('./moe/moe')); router.get('/moe/s78/:column', require('./moe/s78')); router.get('/mofcom/article/:suffix+', require('./mofcom/article')); @@ -43,7 +46,8 @@ module.exports = function (router) { router.get('/zhengce/govall/:advance?', require('./zhengce/govall')); router.get('/zhengce/wenjian/:pcodeJiguan?', require('./zhengce/wenjian')); router.get('/zhengce/zhengceku/:department', require('./zhengce/zhengceku')); - router.get('/zhengce/zuixin', require('./zhengce/zuixin')); + router.get('/zhengce/zuixin', require('./zhengce')); + router.get('/zhengce/:category*', require('./zhengce')); // province router.get(/anhui\/kjt\/([\w\d/-]+)?/, require('./anhui/kjt')); router.get(/beijing\/bphc(\/[\w/-]+)?/, require('./beijing/bphc')); diff --git a/lib/v2/gov/zhengce/index.js b/lib/v2/gov/zhengce/index.js new file mode 100644 index 00000000000000..4e71df7c263bfa --- /dev/null +++ b/lib/v2/gov/zhengce/index.js @@ -0,0 +1,99 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const timezone = require('@/utils/timezone'); +const { parseDate } = require('@/utils/parse-date'); + +module.exports = async (ctx) => { + const { category = 'zuixin' } = ctx.params; + const limit = ctx.query.limit ? parseInt(ctx.query.limit, 10) : 20; + + const rootUrl = 'https://www.gov.cn'; + const currentUrl = new URL(`zhengce/${category.replace(/\/$/, '')}/`, rootUrl).href; + + const { data: response } = await got(currentUrl); + + const $ = cheerio.load(response); + + let items = $('h4 a, div.subtitle a[title]') + .toArray() + .map((item) => { + item = $(item); + + const link = item.prop('href'); + + return { + title: item.text(), + link: link.startsWith('http') ? link : new URL(link, currentUrl).href, + }; + }); + + items = await Promise.all( + items + .filter((item) => /https?:\/\/www\.gov\.cn\/zhengce.*content_\d+\.htm/.test(item.link)) + .slice(0, limit) + .map((item) => + ctx.cache.tryGet(item.link, async () => { + const { data: detailResponse } = await got(item.link); + + const content = cheerio.load(detailResponse); + + const processElementText = (el) => content(el).text().split(/:/).pop().trim() || content(el).next().text().trim(); + + const author = content('meta[name="author"]').prop('content'); + + const agencyEl = content('table.bd1') + .find('td') + .toArray() + .filter((a) => content(a).text().startsWith('发文机关')) + .pop(); + + const sourceEl = content('span.font-zyygwj') + .toArray() + .filter((a) => content(a).text().startsWith('来源')) + .pop(); + + const subjectEl = content('table.bd1') + .find('td') + .toArray() + .filter((a) => content(a).text().startsWith('主题分类')) + .pop(); + + const agency = agencyEl ? processElementText(agencyEl) : undefined; + const source = sourceEl ? processElementText(sourceEl) : undefined; + const subject = subjectEl ? processElementText(subjectEl) : content('td.zcwj_ztfl').text(); + + const column = content('meta[name="lanmu"]').prop('content'); + const keywords = content('meta[name="keywords"]').prop('content')?.split(/;|,/) ?? []; + const manuscriptId = content('meta[name="manuscriptId"]').prop('content'); + + item.title = content('div.share-title').text() || item.title; + item.description = content('div.TRS_UEDITOR').first().html() || content('div#UCAP-CONTENT, td#UCAP-CONTENT').first().html(); + item.author = [agency, source, author].filter((a) => a).join('/'); + item.category = [...new Set([subject, column, ...keywords].filter((c) => c))]; + item.guid = `gov-zhengce-${manuscriptId}`; + item.pubDate = timezone(parseDate(content('meta[name="firstpublishedtime"]').prop('content'), 'YYYY-MM-DD-HH:mm:ss'), +8); + item.updated = timezone(parseDate(content('meta[name="lastmodifiedtime"]').prop('content'), 'YYYY-MM-DD-HH:mm:ss'), +8); + + return item; + }) + ) + ); + + const image = new URL($('img.wordlogo').prop('src'), rootUrl).href; + const icon = new URL($('link[rel="icon"]').prop('href'), rootUrl).href; + const subtitle = $('meta[name="lanmu"]').prop('content'); + const author = $('div.header_logo a[aria-label]').prop('aria-label'); + + ctx.state.data = { + item: items, + title: author && subtitle ? `${author} - ${subtitle}` : $('title').text(), + link: currentUrl, + description: $('meta[name="description"]').prop('content'), + language: 'zh-CN', + image, + icon, + logo: icon, + subtitle, + author, + }; +}; diff --git a/lib/v2/gov/zhengce/zuixin.js b/lib/v2/gov/zhengce/zuixin.js deleted file mode 100644 index 9f329561ab1f3e..00000000000000 --- a/lib/v2/gov/zhengce/zuixin.js +++ /dev/null @@ -1,39 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const { parseDate } = require('@/utils/parse-date'); -const timezone = require('@/utils/timezone'); -const baseUrl = 'http://www.gov.cn'; - -module.exports = async (ctx) => { - const link = `${baseUrl}/zhengce/zuixin/`; - const listData = await got(link); - const $ = cheerio.load(listData.data); - - const list = $('.news_box .list li:not(.line)') - .toArray() - .map((elem) => { - elem = $(elem); - return { - title: elem.find('h4 a').text(), - link: new URL(elem.find('h4 a').attr('href'), baseUrl).href, - pubDate: timezone(parseDate(elem.find('h4 .date').text()), 8), - }; - }); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const contentData = await got(item.link); - const $ = cheerio.load(contentData.data); - item.description = $('#UCAP-CONTENT').html(); - return item; - }) - ) - ); - - ctx.state.data = { - title: '最新政策 - 中国政府网', - link, - item: items, - }; -}; diff --git a/lib/v2/nature/cover.js b/lib/v2/nature/cover.js index c08bb161d467c5..dd733c95e0cf36 100644 --- a/lib/v2/nature/cover.js +++ b/lib/v2/nature/cover.js @@ -18,56 +18,46 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); const { parseDate } = require('@/utils/parse-date'); const { baseUrl, journalMap } = require('./utils'); +const { CookieJar } = require('tough-cookie'); module.exports = async (ctx) => { - const journals = journalMap.items; + const cookieJar = new CookieJar(); + + await got('https://www.nature.com', { cookieJar }); + + const journals = journalMap.items + .filter((j) => j.id) + .map((j) => ({ + ...j, + link: `${baseUrl}/${j.title}/current-issue`, + })); + const out = await Promise.all( - journals - .filter((j) => j.id) - .map(async (journal) => { - // get the lastest volumn and issue id - const pageURL = `${baseUrl}/${journal.title}/current-issue`; - const cookieData = await got - .extend({ - prefixUrl: 'https://idp.nature.com/authorize', - followRedirect: false, - }) - .get(`?response_type=cookie&client_id=grover&redirect_uri=${encodeURI(pageURL)}`) - .then((response) => response.headers['set-cookie'].join(' ')); - const issueURL = await got - .extend({ - prefixUrl: pageURL, - headers: { - cookie: cookieData, - }, - followRedirect: false, - }) - .get('') - .then((response) => response.headers.location); - const capturingRegex = /volumes\/(?\d+)\/issues\/(?\d+)/; - const { volumes, issues } = issueURL.match(capturingRegex).groups; + journals.map((journal) => + ctx.cache.tryGet(journal.link, async () => { + const { id, name } = journal; - const address = `${baseUrl}${issueURL}`; - return ctx.cache.tryGet(address, async () => { - const id = journal.id; - const imageURL = `https://media.springernature.com/full/springer-static/cover-hires/journal/${id}/${volumes}/${issues}?as=webp`; - const contents = `
Volume ${volumes} Issue ${issues}
`; + const response = await got(journal.link, { cookieJar }); - const response = await got(address); - const $ = cheerio.load(response.data); - const date = $('title').text().split(',')[1].trim(); - const issueDescription = $('div[data-test=issue-description]').html() ?? ''; + const capturingRegex = /volumes\/(?\d+)\/issues\/(?\d+)/; + const { volume, issue } = response.url.match(capturingRegex).groups; + const imageUrl = `https://media.springernature.com/full/springer-static/cover-hires/journal/${id}/${volume}/${issue}?as=webp`; + const contents = `
Volume ${volume} Issue ${issue}
`; - const single = { - title: `${journal.name} | Volume ${volumes} Issue ${issues}`, - description: contents + issueDescription, - link: address, - pubDate: parseDate(date, 'MMMM YYYY'), - }; - return single; - }); + const $ = cheerio.load(response.data); + const date = $('title').text().split(',')[1].trim(); + const issueDescription = $('div[data-test=issue-description]').html() ?? ''; + + return { + title: `${name} | Volume ${volume} Issue ${issue}`, + description: contents + issueDescription, + link: response.url, + pubDate: parseDate(date, 'MMMM YYYY'), + }; }) + ) ); + ctx.state.data = { title: 'Nature Covers Story', description: 'Find out the cover story of some Nature journals.', diff --git a/lib/v2/nature/highlight.js b/lib/v2/nature/highlight.js index f8a4bf0cd652ca..d8c6a6a8b41b2c 100644 --- a/lib/v2/nature/highlight.js +++ b/lib/v2/nature/highlight.js @@ -1,12 +1,12 @@ const cheerio = require('cheerio'); const got = require('@/utils/got'); -const { baseUrl, getArticleList, getArticle } = require('./utils'); +const { baseUrl, cookieJar, getArticleList, getArticle } = require('./utils'); module.exports = async (ctx) => { const { journal = 'nature' } = ctx.params; const url = `${baseUrl}/${journal}/articles?type=research-highlight`; - const res = await got(url); + const res = await got(url, { cookieJar }); const $ = cheerio.load(res.data); let items = getArticleList($); diff --git a/lib/v2/nature/news-and-comment.js b/lib/v2/nature/news-and-comment.js index 9b0ebd046c3e6b..d0c73e534f8ca9 100644 --- a/lib/v2/nature/news-and-comment.js +++ b/lib/v2/nature/news-and-comment.js @@ -14,13 +14,13 @@ const cheerio = require('cheerio'); const got = require('@/utils/got'); -const { baseUrl, getArticleList, getArticle } = require('./utils'); +const { baseUrl, cookieJar, getArticleList, getArticle } = require('./utils'); module.exports = async (ctx) => { const journal = ctx.params.journal; const pageURL = `${baseUrl}/${journal}/news-and-comment`; - const pageResponse = await got(pageURL); + const pageResponse = await got(pageURL, { cookieJar }); const pageCapture = cheerio.load(pageResponse.data); const pageDescription = pageCapture('meta[name=description]').attr('content') || 'Nature, a nature research journal'; diff --git a/lib/v2/nature/news.js b/lib/v2/nature/news.js index 911edf0e60904e..717695fc54eabf 100644 --- a/lib/v2/nature/news.js +++ b/lib/v2/nature/news.js @@ -1,11 +1,11 @@ const cheerio = require('cheerio'); const got = require('@/utils/got'); const { parseDate } = require('@/utils/parse-date'); -const { baseUrl, getArticle } = require('./utils'); +const { baseUrl, cookieJar, getArticle } = require('./utils'); module.exports = async (ctx) => { const url = `${baseUrl}/latest-news`; - const res = await got(url); + const res = await got(url, { cookieJar }); const $ = cheerio.load(res.data); let items = $('.c-article-item__content') diff --git a/lib/v2/nature/research.js b/lib/v2/nature/research.js index 3d683bb31a16f4..c28a0b10891a7a 100644 --- a/lib/v2/nature/research.js +++ b/lib/v2/nature/research.js @@ -15,13 +15,13 @@ const cheerio = require('cheerio'); const got = require('@/utils/got'); -const { baseUrl, getArticleList, getDataLayer, getArticle } = require('./utils'); +const { baseUrl, cookieJar, getArticleList, getDataLayer, getArticle } = require('./utils'); module.exports = async (ctx) => { const journal = ctx.params.journal ?? 'nature'; const pageURL = `${baseUrl}/${journal}/research-articles`; - const pageResponse = await got(pageURL); + const pageResponse = await got(pageURL, { cookieJar }); const pageCapture = cheerio.load(pageResponse.data); const pageTitle = getDataLayer(pageCapture).content.journal.title; diff --git a/lib/v2/nature/siteindex.js b/lib/v2/nature/siteindex.js index 055e67f0d1e52d..302affc88edd17 100644 --- a/lib/v2/nature/siteindex.js +++ b/lib/v2/nature/siteindex.js @@ -1,9 +1,9 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); -const { baseUrl } = require('./utils'); +const { baseUrl, cookieJar } = require('./utils'); module.exports = async (ctx) => { - const response = await got(`${baseUrl}/siteindex`); + const response = await got(`${baseUrl}/siteindex`, { cookieJar }); const $ = cheerio.load(response.data); let items = $('li[class^="grid mq640-grid-12"]') @@ -11,7 +11,7 @@ module.exports = async (ctx) => { .map((item) => { item = $(item); return { - title: item.find('a').attr('href').replace('/', ''), + title: item.find('a').attr('href').replaceAll('/', ''), name: item.find('a').text(), link: baseUrl + item.find('a').attr('href'), }; @@ -20,7 +20,7 @@ module.exports = async (ctx) => { items = await Promise.all( items.map((item) => ctx.cache.tryGet(`nature:siteindex:${item.title}`, async () => { - const response = await got(item.link); + const response = await got(item.link, { cookieJar }); const $ = cheerio.load(response.data); delete item.link; @@ -39,7 +39,7 @@ module.exports = async (ctx) => { ctx.state.data = { title: 'Nature siteindex', - link: baseUrl + '/siteindex', + link: response.url, item: items, }; ctx.state.json = { diff --git a/lib/v2/nature/utils.js b/lib/v2/nature/utils.js index ce7dfe6f83047b..c3507ef48532b4 100644 --- a/lib/v2/nature/utils.js +++ b/lib/v2/nature/utils.js @@ -1,7 +1,7 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); const { parseDate } = require('@/utils/parse-date'); - +const { CookieJar } = require('tough-cookie'); const baseUrl = 'https://www.nature.com'; const fixFigure = (html) => { @@ -51,7 +51,9 @@ const getArticleList = (html) => const getArticle = (item, ctx) => ctx.cache.tryGet(item.link, async () => { - const response = await got(item.link); + const response = await got(item.link, { + cookieJar, + }); const $ = cheerio.load(response.data); const responseUrl = new URL(response.url); @@ -59,7 +61,7 @@ const getArticle = (item, ctx) => const meta = getDataLayer($); item.doi = meta.content.article?.doi; item.author = meta.content.contentInfo.authors.join(', '); - item.pubDate = parseDate(meta.content.contentInfo.publishedAt * 1000) || item.pubDate; + item.pubDate = parseDate(meta.content.contentInfo.publishedAt, 'X') || item.pubDate; } else { const meta = JSON.parse($('script[type="application/ld+json"]').html()); const freeAccess = meta.mainEntity.isAccessibleForFree; @@ -69,7 +71,7 @@ const getArticle = (item, ctx) => item.doi = meta.mainEntity.sameAs.replace('https://doi.org/', ''); } item.author = meta.mainEntity.author.map((author) => author.name.replace(', ', ' ')).join(', '); - item.category = meta.mainEntity.keywords.split(','); + item.category = meta.mainEntity.keywords; item.pubDate = parseDate(meta.mainEntity.datePublished) || item.pubDate; fixFigure($); @@ -101,10 +103,12 @@ const getArticle = (item, ctx) => const getDataLayer = (html) => JSON.parse( html('script[data-test=dataLayer]') - .html() + .text() .match(/window\.dataLayer = \[(.*)\];/s)[1] ); +const cookieJar = new CookieJar(); + /** * This is generated by /nature/siteindex.debug.json */ @@ -144,6 +148,10 @@ const journalMap = { id: '43747', description: '43747', }, + { + title: 'bjcreports', + name: 'BJC Reports', + }, { title: 'bcj', name: 'Blood Cancer Journal', @@ -234,6 +242,10 @@ const journalMap = { title: 'commsphys', name: 'Communications Physics', }, + { + title: 'commspsychol', + name: 'Communications Psychology', + }, { title: 'ejcn', name: 'European Journal of Clinical Nutrition', @@ -470,12 +482,20 @@ const journalMap = { id: '41589', description: '41589', }, + { + title: 'natchemeng', + name: 'Nature Chemical Engineering', + }, { title: 'nchem', name: 'Nature Chemistry', id: '41557', description: '41557', }, + { + title: 'natcities', + name: 'Nature Cities', + }, { title: 'nclimate', name: 'Nature Climate Change', @@ -573,6 +593,8 @@ const journalMap = { { title: 'natmentalhealth', name: 'Nature Mental Health', + id: '44220', + description: '44220', }, { title: 'natmetab', @@ -631,6 +653,8 @@ const journalMap = { { title: 'natrevbioeng', name: 'Nature Reviews Bioengineering', + id: '44222', + description: '44222', }, { title: 'nrc', @@ -672,6 +696,10 @@ const journalMap = { id: '43017', description: '43017', }, + { + title: 'natrevelectreng', + name: 'Nature Reviews Electrical Engineering', + }, { title: 'nrendo', name: 'Nature Reviews Endocrinology', @@ -781,6 +809,8 @@ const journalMap = { { title: 'natwater', name: 'Nature Water', + id: '44221', + description: '44221', }, { title: 'npp', @@ -796,10 +826,18 @@ const journalMap = { title: 'npj2dmaterials', name: 'npj 2D Materials and Applications', }, + { + title: 'npjadvmanuf', + name: 'npj Advanced Manufacturing', + }, { title: 'npjamd', name: 'npj Aging', }, + { + title: 'npjamar', + name: 'npj Antimicrobials and Resistance', + }, { title: 'npjbiodivers', name: 'npj Biodiversity', @@ -808,18 +846,42 @@ const journalMap = { title: 'npjbiofilms', name: 'npj Biofilms and Microbiomes', }, + { + title: 'npjbiolphysmech', + name: 'npj Biological Physics and Mechanics', + }, + { + title: 'npjbts', + name: 'npj Biological Timing and Sleep', + }, + { + title: 'npjbiosensing', + name: 'npj Biosensing', + }, { title: 'npjbcancer', name: 'npj Breast Cancer', }, + { + title: 'npjcardiohealth', + name: 'npj Cardiovascular Health', + }, { title: 'npjcleanwater', name: 'npj Clean Water', }, + { + title: 'npjclimataction', + name: 'npj Climate Action', + }, { title: 'npjclimatsci', name: 'npj Climate and Atmospheric Science', }, + { + title: 'npjcomplex', + name: 'npj Complexity', + }, { title: 'npjcompumats', name: 'npj Computational Materials', @@ -836,18 +898,42 @@ const journalMap = { title: 'npjgenmed', name: 'npj Genomic Medicine', }, + { + title: 'npjimaging', + name: 'npj Imaging', + }, { title: 'npjmatdeg', name: 'npj Materials Degradation', }, + { + title: 'npjmatsustain', + name: 'npj Materials Sustainability', + }, { title: 'npjmentalhealth', name: 'npj Mental Health Research', }, + { + title: 'npjmetabhealth', + name: 'npj Metabolic Health and Disease', + }, { title: 'npjmgrav', name: 'npj Microgravity', }, + { + title: 'npjnanophoton', + name: 'npj Nanophotonics', + }, + { + title: 'npjnathazards', + name: 'npj Natural Hazards', + }, + { + title: 'npjoceansustain', + name: 'npj Ocean Sustainability', + }, { title: 'npjparkd', name: "npj Parkinson's Disease", @@ -872,6 +958,10 @@ const journalMap = { title: 'npjregenmed', name: 'npj Regenerative Medicine', }, + { + title: 'npjrobot', + name: 'npj Robotics', + }, { title: 'npjscifood', name: 'npj Science of Food', @@ -880,10 +970,26 @@ const journalMap = { title: 'npjscilearn', name: 'npj Science of Learning', }, + { + title: 'npjspintronics', + name: 'npj Spintronics', + }, + { + title: 'npjsustainagric', + name: 'npj Sustainable Agriculture', + }, + { + title: 'npjsustainmobil', + name: 'npj Sustainable Mobility and Transport', + }, { title: 'npjsba', name: 'npj Systems Biology and Applications', }, + { + title: 'npjunconvcomput', + name: 'npj Unconventional Computing', + }, { title: 'npjurbansustain', name: 'npj Urban Sustainability', @@ -892,6 +998,18 @@ const journalMap = { title: 'npjvaccines', name: 'npj Vaccines', }, + { + title: 'npjviruses', + name: 'npj Viruses', + }, + { + title: 'npjwomenshealth', + name: "npj Women's Health", + }, + { + title: 'dpn', + name: 'NPP—Digital Psychiatry and Neuroscience', + }, { title: 'nutd', name: 'Nutrition & Diabetes', @@ -973,6 +1091,7 @@ const journalMap = { module.exports = { baseUrl, + cookieJar, getArticle, getArticleList, getDataLayer, diff --git a/package.json b/package.json index 51b71a6410212a..774574c357d381 100644 --- a/package.json +++ b/package.json @@ -86,13 +86,13 @@ "@koa/router": "12.0.1", "@notionhq/client": "2.2.13", "@postlight/parser": "2.2.3", - "@sentry/node": "7.80.1", - "@tonyrl/rand-user-agent": "2.0.39", + "@sentry/node": "7.81.0", + "@tonyrl/rand-user-agent": "2.0.40", "aes-js": "3.1.2", "art-template": "4.13.2", "bbcodejs": "0.0.4", "cheerio": "1.0.0-rc.12", - "chrono-node": "2.7.0", + "chrono-node": "2.7.3", "city-timezones": "1.2.1", "crypto-js": "4.2.0", "currency-symbol-map": "5.1.0", @@ -121,7 +121,7 @@ "koa-favicon": "2.1.0", "koa-mount": "4.0.0", "koa-static": "5.0.0", - "lru-cache": "10.0.2", + "lru-cache": "10.0.3", "lz-string": "1.5.0", "mailparser": "3.6.5", "markdown-it": "13.0.2", @@ -150,7 +150,7 @@ }, "devDependencies": { "@microsoft/eslint-formatter-sarif": "3.0.0", - "@stylistic/eslint-plugin-js": "1.3.2", + "@stylistic/eslint-plugin-js": "1.4.0", "@types/aes-js": "3.1.4", "@types/crypto-js": "4.2.1", "@types/eslint": "8.44.7", @@ -182,7 +182,7 @@ "@types/tough-cookie": "4.0.5", "@vercel/nft": "0.24.3", "cross-env": "7.0.3", - "eslint": "8.53.0", + "eslint": "8.54.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.3.1", "eslint-plugin-prettier": "5.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62ff3ddf1506bf..aa32951739107d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,11 +15,11 @@ dependencies: specifier: 2.2.3 version: 2.2.3 '@sentry/node': - specifier: 7.80.1 - version: 7.80.1 + specifier: 7.81.0 + version: 7.81.0 '@tonyrl/rand-user-agent': - specifier: 2.0.39 - version: 2.0.39 + specifier: 2.0.40 + version: 2.0.40 aes-js: specifier: 3.1.2 version: 3.1.2 @@ -33,8 +33,8 @@ dependencies: specifier: 1.0.0-rc.12 version: 1.0.0-rc.12 chrono-node: - specifier: 2.7.0 - version: 2.7.0 + specifier: 2.7.3 + version: 2.7.3 city-timezones: specifier: 1.2.1 version: 1.2.1 @@ -120,8 +120,8 @@ dependencies: specifier: 5.0.0 version: 5.0.0 lru-cache: - specifier: 10.0.2 - version: 10.0.2 + specifier: 10.0.3 + version: 10.0.3 lz-string: specifier: 1.5.0 version: 1.5.0 @@ -203,8 +203,8 @@ devDependencies: specifier: 3.0.0 version: 3.0.0 '@stylistic/eslint-plugin-js': - specifier: 1.3.2 - version: 1.3.2 + specifier: 1.4.0 + version: 1.4.0 '@types/aes-js': specifier: 3.1.4 version: 3.1.4 @@ -299,20 +299,20 @@ devDependencies: specifier: 7.0.3 version: 7.0.3 eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 eslint-config-prettier: specifier: 9.0.0 - version: 9.0.0(eslint@8.53.0) + version: 9.0.0(eslint@8.54.0) eslint-plugin-n: specifier: 16.3.1 - version: 16.3.1(eslint@8.53.0) + version: 16.3.1(eslint@8.54.0) eslint-plugin-prettier: specifier: 5.0.1 - version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.1.0) + version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0) eslint-plugin-yml: specifier: 1.10.0 - version: 1.10.0(eslint@8.53.0) + version: 1.10.0(eslint@8.54.0) fs-extra: specifier: 11.1.1 version: 11.1.1 @@ -747,13 +747,13 @@ packages: kuler: 2.0.0 dev: false - /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.53.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 dev: true @@ -779,8 +779,8 @@ packages: - supports-color dev: true - /@eslint/js@8.53.0: - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -1107,7 +1107,7 @@ packages: resolution: {integrity: sha512-KIKkT44hEqCzqxODYwFMUvYEK0CrdHx/Ll9xiOWgFbBSRuzbxmVy4d/tzfgoucGz72HJZNOMjuyzFTBKntRK5Q==} engines: {node: '>= 14'} dependencies: - eslint: 8.53.0 + eslint: 8.54.0 jschardet: 3.0.0 lodash: 4.17.21 utf8: 3.0.0 @@ -1251,46 +1251,46 @@ packages: selderee: 0.11.0 dev: false - /@sentry-internal/tracing@7.80.1: - resolution: {integrity: sha512-5gZ4LPIj2vpQl2/dHBM4uXMi9OI5E0VlOhJQt0foiuN6JJeiOjdpJFcfVqJk69wrc0deVENTtgKKktxqMwVeWQ==} + /@sentry-internal/tracing@7.81.0: + resolution: {integrity: sha512-mc3tdOEvAE6kaCvT3BpMwCgfTT2yfXjWpC7g+3N8U/yuQEmQSCDZA/ut7EkzU0DyhG3t8HzT0c+CAG3HtilEAQ==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.80.1 - '@sentry/types': 7.80.1 - '@sentry/utils': 7.80.1 + '@sentry/core': 7.81.0 + '@sentry/types': 7.81.0 + '@sentry/utils': 7.81.0 dev: false - /@sentry/core@7.80.1: - resolution: {integrity: sha512-3Yh+O9Q86MxwIuJFYtuSSoUCpdx99P1xDAqL0FIPTJ+ekaVMiUJq9NmyaNh9uN2myPSmxvEXW6q3z37zta9ZHg==} + /@sentry/core@7.81.0: + resolution: {integrity: sha512-FCAKlqo9Z6fku69bkahw1AN+eBfAgRgOL1RpBLZgyG7YBW12vtSkHb5SDvZZTkm541Fo3hhepUTLtX0qmpA4yw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.80.1 - '@sentry/utils': 7.80.1 + '@sentry/types': 7.81.0 + '@sentry/utils': 7.81.0 dev: false - /@sentry/node@7.80.1: - resolution: {integrity: sha512-0NWfcZMlyQphKWsvyzfhGm2dCBk5DUPqOGW/vGx18G4tCCYtFcAIj/mCp/4XOEcZRPQgb9vkm+sidGD6DnwWlA==} + /@sentry/node@7.81.0: + resolution: {integrity: sha512-hFfDxKGB+JhkhpZtM1ntyZDZoMlS8rMsynCSQcqJS39iYcCgdvgy9zOb34mXrX9kXOJNhWWmoloBZGA+KKFTdg==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.80.1 - '@sentry/core': 7.80.1 - '@sentry/types': 7.80.1 - '@sentry/utils': 7.80.1 + '@sentry-internal/tracing': 7.81.0 + '@sentry/core': 7.81.0 + '@sentry/types': 7.81.0 + '@sentry/utils': 7.81.0 https-proxy-agent: 5.0.1 transitivePeerDependencies: - supports-color dev: false - /@sentry/types@7.80.1: - resolution: {integrity: sha512-CVu4uPVTOI3U9kYiOdA085R7jX5H1oVODbs9y+A8opJ0dtJTMueCXgZyE8oXQ0NjGVs6HEeaLkOuiV0mj8X3yw==} + /@sentry/types@7.81.0: + resolution: {integrity: sha512-rbYNYSSrrnwNndC7S+eVT84GRLEyCZNh9oXUQqzgSD6ngXCZ0xFJW6si75uv/XQBWIw4rkj9xfRcy8DU0Tj4fg==} engines: {node: '>=8'} dev: false - /@sentry/utils@7.80.1: - resolution: {integrity: sha512-bfFm2e/nEn+b9++QwjNEYCbS7EqmteT8uf0XUs7PljusSimIqqxDtK1pfD9zjynPgC8kW/fVBKv0pe2LufomeA==} + /@sentry/utils@7.81.0: + resolution: {integrity: sha512-yC9IvfeVbG4dygi4b+iUUMHp9xeHJfCn6XLbqjJVfq3xjAzBGHgfrpw6fYPNyTljXKb6CTiSXSqaNaQJE4CkPA==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.80.1 + '@sentry/types': 7.81.0 dev: false /@sinclair/typebox@0.27.8: @@ -1319,8 +1319,8 @@ packages: '@sinonjs/commons': 3.0.0 dev: true - /@stylistic/eslint-plugin-js@1.3.2: - resolution: {integrity: sha512-GI9ntPKrTYhQguUjY/B/g+15XwTTXi9tZ3nuaZeeujzee2HP+H/pK+0weqtpZGGU8JRzgwiQcx4svFphtairTA==} + /@stylistic/eslint-plugin-js@1.4.0: + resolution: {integrity: sha512-cANyn4ECWu8kxPmBM4K/Q4WocD3JbA0POmGbA2lJ4tynPE8jGyKpfP8SZj6BIidXV0pkyqvxEfaKppB4D16UsA==} dependencies: acorn: 8.11.2 escape-string-regexp: 4.0.0 @@ -1336,8 +1336,8 @@ packages: defer-to-connect: 2.0.1 dev: false - /@tonyrl/rand-user-agent@2.0.39: - resolution: {integrity: sha512-1HBCBR3h6279OqvIHI1XxCbB5AIIHufUaslS+n4vvvDHacDYjsf7Y+TBGYSUFOJUKAOx6d11Rw+NkchWtAaLnQ==} + /@tonyrl/rand-user-agent@2.0.40: + resolution: {integrity: sha512-5H5QMwtiWv8m9v7CqZovrutLCAphqtOga58PiisnrRrFTh7ajNymCoWcuNwTjYh6jxpSXchhrKxdhk+QITyWcQ==} engines: {node: '>=14.16'} dev: false @@ -2473,8 +2473,8 @@ packages: urlpattern-polyfill: 9.0.0 dev: false - /chrono-node@2.7.0: - resolution: {integrity: sha512-0s2vv89LmsbgoibV0AIVgNnGqlU8N5yCCVZXvc3mRCjnmlG/gJw1hCYOmNwjB+AIuwZQdKTXfwvsHDRTs6pwcg==} + /chrono-node@2.7.3: + resolution: {integrity: sha512-M/CusGocGJaubS8OFPEzmSa6IT/MJo2LaVqFyUVaLMo+UWwqyahKHsDe9FQBzwaytVGwR/bwZ5JhnAcu894Owg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dayjs: 1.11.8 @@ -3182,45 +3182,45 @@ packages: source-map: 0.6.1 dev: false - /eslint-compat-utils@0.1.2(eslint@8.53.0): + /eslint-compat-utils@0.1.2(eslint@8.54.0): resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' dependencies: - eslint: 8.53.0 + eslint: 8.54.0 dev: true - /eslint-config-prettier@9.0.0(eslint@8.53.0): + /eslint-config-prettier@9.0.0(eslint@8.54.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.53.0 + eslint: 8.54.0 dev: true - /eslint-plugin-es-x@7.2.0(eslint@8.53.0): + /eslint-plugin-es-x@7.2.0(eslint@8.54.0): resolution: {integrity: sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.8.0 - eslint: 8.53.0 + eslint: 8.54.0 dev: true - /eslint-plugin-n@16.3.1(eslint@8.53.0): + /eslint-plugin-n@16.3.1(eslint@8.54.0): resolution: {integrity: sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==} engines: {node: '>=16.0.0'} peerDependencies: eslint: '>=7.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) builtins: 5.0.1 - eslint: 8.53.0 - eslint-plugin-es-x: 7.2.0(eslint@8.53.0) + eslint: 8.54.0 + eslint-plugin-es-x: 7.2.0(eslint@8.54.0) get-tsconfig: 4.7.0 ignore: 5.2.4 is-builtin-module: 3.2.1 @@ -3230,7 +3230,7 @@ packages: semver: 7.5.4 dev: true - /eslint-plugin-prettier@5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.1.0): + /eslint-plugin-prettier@5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0): resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3245,22 +3245,22 @@ packages: optional: true dependencies: '@types/eslint': 8.44.7 - eslint: 8.53.0 - eslint-config-prettier: 9.0.0(eslint@8.53.0) + eslint: 8.54.0 + eslint-config-prettier: 9.0.0(eslint@8.54.0) prettier: 3.1.0 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true - /eslint-plugin-yml@1.10.0(eslint@8.53.0): + /eslint-plugin-yml@1.10.0(eslint@8.54.0): resolution: {integrity: sha512-53SUwuNDna97lVk38hL/5++WXDuugPM9SUQ1T645R0EHMRCdBIIxGye/oOX2qO3FQ7aImxaUZJU/ju+NMUBrLQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.53.0 - eslint-compat-utils: 0.1.2(eslint@8.53.0) + eslint: 8.54.0 + eslint-compat-utils: 0.1.2(eslint@8.54.0) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 @@ -3281,15 +3281,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.8.0 '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.53.0 + '@eslint/js': 8.54.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -5518,11 +5518,9 @@ packages: engines: {node: '>=8'} dev: false - /lru-cache@10.0.2: - resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==} + /lru-cache@10.0.3: + resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} engines: {node: 14 || >=16.14} - dependencies: - semver: 7.5.4 dev: false /lru-cache@5.1.1: @@ -7108,6 +7106,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} diff --git a/website/docs/routes/government.mdx b/website/docs/routes/government.mdx index 4133a8ce791c41..e6c84c209f83e1 100644 --- a/website/docs/routes/government.mdx +++ b/website/docs/routes/government.mdx @@ -1577,9 +1577,19 @@ Language +### 政策 {#zhong-guo-zheng-fu-wang-zheng-ce} + + + +| 最新政策 | 政策解读 | 图解政策 | +| -------- | -------- | ----------- | +| zuixin | jiedu | jiedu/tujie | + + + ### 最新政策 {#zhong-guo-zheng-fu-wang-zui-xin-zheng-ce} - + ### 最新文件 {#zhong-guo-zheng-fu-wang-zui-xin-wen-jian} @@ -1808,9 +1818,39 @@ Language -### 数据 - 最新发布 {#zhong-hua-ren-min-gong-he-guo-nong-ye-nong-cun-bu-shu-ju-zui-xin-fa-bu} +### 数据 {#zhong-hua-ren-min-gong-he-guo-nong-ye-nong-cun-bu-shu-ju} + + + +#### 报告主题 {#zhong-hua-ren-min-gong-he-guo-nong-ye-nong-cun-bu-shu-ju-bao-gao-zhu-ti} + +| 价格指数 | 供需月报 | 日历信息 | 蔬菜生产 | +| -------- | -------- | -------- | -------- | + +#### 报告来源 {#zhong-hua-ren-min-gong-he-guo-nong-ye-nong-cun-bu-shu-ju-bao-gao-lai-yuan} + +| 农业农村部市场与信息化司 | 农业农村部畜牧兽医局 | 农业农村部种植业管理司 | 农业农村部信息中心 | 农业农村部农业贸易促进中心 | +| ------------------------ | -------------------- | ---------------------- | ------------------ | -------------------------- | + +| 新华网 | 新闻晨报 | 楚天都市报 | 中国兴农网 | 泉州晚报 | +| ------ | -------- | ---------- | ---------- | -------- | + +| 潇湘晨报 | 澎湃新闻 | 环京津网 | 经济日报 | 腾讯网 | +| -------- | -------- | -------- | -------- | ------ | + +| 贵阳晚报 | 山东广播电视台闪电新闻客户端 | 央视网 | 农产品;平衡表;供需分析 | 农民日报 | +| -------- | ---------------------------- | ------ | ---------------------- | -------- | - +| 重庆市黔江区人民政府 | 农业农村部新闻办公室 | 农业农村部市场预警专家委员会 | 农业农村部市场畜牧兽医局 | 其它来源 | +| -------------------- | -------------------- | ---------------------------- | ------------------------ | -------- | + +| 人民网 | 人民日报 | 中央气象台 | 中国证券报 | 中国网 | +| ------ | -------- | ---------- | ---------- | ------ | + +| 中国新闻网 | 南方日报 | 黑龙江省政府新闻办 | +| ---------- | -------- | ------------------ | + + ## 中华人民共和国人力资源和社会保障部 {#zhong-hua-ren-min-gong-he-guo-ren-li-zi-yuan-he-she-hui-bao-zhang-bu} diff --git a/website/docs/routes/multimedia.mdx b/website/docs/routes/multimedia.mdx index bf0aa206e0939e..148286329bc769 100644 --- a/website/docs/routes/multimedia.mdx +++ b/website/docs/routes/multimedia.mdx @@ -1455,7 +1455,7 @@ When `mediaType` is `movie`, `sheet` should be: | 俄剧 | 巴剧 | 加剧 | 西剧 | 意大利剧 | 泰剧 | | ---- | ---- | ----- | ---- | -------- | ----- | -| eju | baju | jiaju | xiju | yidaliju | taiju | +| eju | baju | jiaju | spanish | yidaliju | taiju | | 港台剧 | 法剧 | 澳剧 | | --------- | ---- | ---- |