Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
March 27, 2022 06:22 am GMT

xlsx rss

rss , . : rss , , .

:

yarn add rss-parseryarn add --dev exceljs moment posthtml progress request request-promise yargs

! :

const ExcelJS = require('exceljs')const Parser = require('rss-parser')const posthtml = require('posthtml')const rp = require('request-promise')const moment = require('moment')const ProgressBar = require('progress')const yargs = require("yargs")const parser = new Parser()

, :

const options = yargs    .usage(`Usage: -f <rss uri>`)    .option('f', {        alias: 'feed',        describe: 'RSS feed uri',        type: 'string',        demandOption: true    })    .option('a', {        alias: 'amount',        describe: 'Needed RSS feed posts amount',        type: 'string'    })    .option('n', {        alias: 'outputFileName',        describe: 'XLS output file name',        type: 'string'    })    .option('o', {        alias: 'cellOptions',        describe: 'Sheet cell additional options',        type: 'array'    })    .argvprocess.stdout.write(`great options, bruh, let's start already!
`)entry(options.feed, options.amount, options.outputFileName, options.cellOptions)

, . :

let entry = async (rssFeed, amount = 5, outputFileName = 'result', cellOptions = []) => {    process.stdout.write(`parsing your rss feed...
`) let feed = await parser.parseURL(rssFeed) process.stdout.write(`creating excel workbook...
`) const workbook = new ExcelJS.Workbook() const worksheet = workbook.addWorksheet(outputFileName) worksheet.columns = [{ header: 'text', key: 'col_text' }, { header: 'url', key: 'col_url' }, { header: 'images', key: 'col_images' }, { header: 'time', key: 'col_time' } ]}

:

process.stdout.write(`generating posts from rss feed...
`)let generatedRows = await generatePostsMetaFromFeed(feed, amount)let generatedRowsBar = new ProgressBar('[:bar] :current/:total table rows generated
', { incomplete: ' ', complete: '#', total: generatedRows.length})

generatePostsMetaFromFeed :

let convertFeedToPosts = feed => [...feed.items.map(item => item.link)] //       let generatePostsMetaFromFeed = async (feed, amount) => {    let res = []    let posts = []    let feedLink = feed.link    if (amount > 10) {        process.stdout.write(`wow, so much posts? taking care of it...
`) let pages = Math.round(amount / 10) // let pagesLoadingBar = new ProgressBar('[:bar] :current/:total processed
', { incomplete: ' ', complete: '#', total: pages }) posts.push(...convertFeedToPosts(feed)) process.stdout.write(`loading needed pages...
`) for (let i = 2; i <= pages; i++) { await rp(encodeURI(`${feedLink}?feed=rss&paged=${i}`)) .then(async rssPage => { let parsedRSSFeed = await parser.parseString(rssPage) let isLastPage = i === pages if (isLastPage) { let modItems = parsedRSSFeed.items.filter((_, index) => index < amount % 10) posts.push(...convertFeedToPosts({ items: modItems })) } else { posts.push(...convertFeedToPosts(parsedRSSFeed)) } pagesLoadingBar.tick() }) .catch(err => { console.error('huh, rss pagination failed', err.code) }) } } else { process.stdout.write(`not a lot of posts, gonna be quick!
`) posts.push(...convertFeedToPosts({ items: feed.items.slice(0, amount) })) } process.stdout.write(`time to generate some text for our table!
`) let postsHandlingBar = new ProgressBar('[:bar] :current/:total posts handled
', { incomplete: ' ', complete: '#', total: posts.length }) for (let i = 0; i < posts.length; i++) { let postLink = posts[i] let title, description, image await rp(postLink) .then(html => { process.stdout.write(`wuush, working on it...
`) posthtml().use(tree => { // tree.match({ tag: 'title' }, node => { title = node.content[0] }) tree.match({ attrs: { name: 'description' }, tag: 'meta' }, node => { description = node.attrs.content }) tree.match({ attrs: { property: 'og:image' }, tag: 'meta' }, node => { image = node.attrs.content }) }).process(html) postsHandlingBar.tick() }) .catch(err => { console.error('huh, post parsing failed', err) }) res.push({ title, description, image, link: postLink }) } return res}

, entry worksheet, addRow:

process.stdout.write(`making some rows for your sheet...
`)for (let i = 0; i < generatedRows.length; i++) { let { title, description, image, link } = generatedRows[i] let columnText = `${title}

${description}

${link}` if (cellOptions.length) { cellOptions.forEach(cOption => { if (cOption === 'noImage') { image = '' } if (cOption === 'noOGCard') { link = '' } }) } worksheet.addRow({ col_text: columnText, col_url: link, col_images: image, col_time: moment().add(i, 'days').format('DD/MM/YYYY hh:mm').toString() }) generatedRowsBar.tick()}

lift off! :

process.stdout.write(`creating your ${outputFileName} file...
`)await workbook.xlsx.writeFile(`${outputFileName}.xlsx`) .then(() => { process.stdout.write(`${outputFileName} created allright!
`) }) .catch((err) => { process.stdout.write('huh, creating error: ', err) })process.stdout.write(`all done, love!
`)

, profit!

: https://github.com/arkatriymfalnaya/xlsx-from-rss-generator


Original Link: https://dev.to/scumdograscalhous/ghienieriruiem-xlsx-iz-rss-fida-4fpo

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To