An Interest In:
Web News this Week
- April 2, 2024
- April 1, 2024
- March 31, 2024
- March 30, 2024
- March 29, 2024
- March 28, 2024
- March 27, 2024
March 27, 2022 06:22 am GMT
Original Link: https://dev.to/scumdograscalhous/ghienieriruiem-xlsx-iz-rss-fida-4fpo
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:
Tweet
View Full Article
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To