hln
Version:
104 lines (90 loc) • 3.13 kB
JavaScript
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;