UNPKG

hln

Version:

104 lines (90 loc) 3.13 kB
const got = require('got'); const xmlParser = require('fast-xml-parser'); const htmlparser = require('htmlparser2'); const pRetry = require('p-retry'); const categories = [ 'nieuws/binnenland', 'nieuws/buitenland', 'bizar', 'geld', ]; const hln = {}; hln.findRecentArticles = async (category) => { const response = await got(`https://www.hln.be/${category}/rss.xml`); return xmlParser.parse(response.body).rss.channel.item .map((rssItem) => { const { title, description, pubDate, link } = rssItem; const id = link.split('~a')[1].split('/')[0]; return { id, title, description, link, pubDate, }; }); }; hln.findRecentCommentsForArticle = async (articleId) => { const time = new Date().getTime(); const response = await got(`https://www.hln.be/ajax/comments/${articleId}/start/ts_${time}`, { headers: { cookie: 'pwv=1; pws=functional|analytics|content_recommendation|targeted_advertising|social_media; ' + '_wingify_pc_uuid=333923217b0a447b9b96dbab5bc683dc; gr_reco=167318f92c4-a99ca317c85daf53; ' + 'gr_rt=167318f92c4-a99ca317c85daf53; ' + 'gig_hasGmid=accounts; ' + 'paywall_tracking_id="mVyiKnYBTC-PM_jlbd_fgg=="' }}); let parsing; let comment = {}; const comments = []; var parser = new htmlparser.Parser({ onopentag(name){ if(name === 'h2') { parsing = 'author'; } else if (name === 'p') { parsing = 'comment'; } else if (name === 'time') { parsing = 'time'; } }, ontext(text){ if (parsing) { comment[parsing] = text; if (parsing === 'time') { comments.push(comment); comment = {}; } } }, onclosetag(){ parsing = undefined; } }, {decodeEntities: true}); parser.write(response.body); parser.end(); return comments; }; async function randomAttempt() { const randomCategory = random(categories); const recentArticles = await hln.findRecentArticles(randomCategory); const randomArticle = random(recentArticles); const comments = await hln.findRecentCommentsForArticle(randomArticle.id); const randomComment = random(comments); if (randomComment) { randomComment.article = randomArticle; return randomComment; } throw new Error('Nope'); } function random(items) { return items[Math.floor(Math.random()*items.length)]; } hln.random = function () { const run = () => randomAttempt(); pRetry(run, { retries: 10}).then((result) => { if (result) { console.log(`"${result.comment}"`); console.log(`--${result.author.toUpperCase()}, reactie op '${result.article.title}'`); } }); }; module.exports = hln;