const cheerio = require('cheerio'); const got = require('@/utils/got'); const { parseDate } = require('@/utils/parse-date'); module.exports = async function fetch(address) { const res = await got(address); const capture = cheerio.load(res.data); capture('.gIMvvS').remove(); let metaInfoBox = capture('.ffAPnj') .filter((index) => index === 0) .get(); // For photography if (metaInfoBox.length === 0) { metaInfoBox = capture('.deNvJY') .filter((index) => index === 0) .get(); } const acquire = cheerio.load(metaInfoBox); let time = acquire('.gimsRe').text(); // For `photography` if (!time) { time = acquire('.kHluJP').text(); } // # Author(s) of the article // // There exists two formats for this section. // 1. 文字 /...` with `摄影 / ..` in separate line, or // 2. just a simple line starts with `文/ ...` // For the first condition, we use a array // to record the list of author(s), and use // `;` to connect two lines. const authors = []; if (acquire('.loxoWO').text() === '') { for (const item of acquire('.flciyI').get()) { const $ = cheerio.load(item); const job = $('.hGsNtm').text(); // An article may have multiple authors const name = []; for (const item of $('.cidPTd > a').get()) { const $ = cheerio.load(item); name.push($('.fJSaZP').text()); } const author = job + '/' + name.join(','); authors.push(author); } } else { authors.push(acquire('.loxoWO').text()); } const author = authors.join(';'); // contents = cover photo + italic intro + text const contents = '' + capture('.hxFBKc').html() + '
' + capture('.jONJYq').html(); return { author, description: contents, link: address, guid: address, pubDate: parseDate(time, 'M/D/YYYY'), }; };