shared-hugo-scripts/twitter/app.js

65 lines
2.3 KiB
JavaScript

require('checkenv').check();
const logger = require('winston')
const Twitter = require('twitter')
const dateFormat = require('dateformat')
const fs = require('fs-extra')
const outputDirectory = '../../../site/content/entry'
const client = new Twitter({
consumer_key: process.env.TWITTER_CONSUMER_KEY,
consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET
});
// https://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url/22648406#22648406
function isURL(str) {
var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
var url = new RegExp(urlRegex, 'i');
return str.length < 2083 && url.test(str);
}
const run = async () => {
console.info(`Getting user timeline information for ${process.env.TWITTER_SCREEN_NAME}.`)
let tweets = await client.get('statuses/user_timeline', {screen_name: process.env.TWITTER_SCREEN_NAME}).then(tweets => {
return tweets.slice(0, process.env.TWITTER_TIMELINE_COUNT + 1 || 50 + 1).map((x, index) => {
return {
id: x.id_str,
date: new Date(x.created_at),
author: x.user.screen_name,
message: x.text
}
})
})
console.info(`Got ${tweets.length} tweets from the Twitter API.`)
// Write each tweet as entry content.
return tweets.forEach(async (x) => {
if (isURL(x.message)) {
console.warn(`Skipping frontmatter generation for tweet ${x.id} -- just a URL.`)
return
}
let tweetRef = `tweet_${x.id}`
let frontmatterPath = `${outputDirectory}/${tweetRef}/index.md`
let frontmatterContents = `+++
date = "${x.date.toISOString()}"
title = "Tweet ${x.id} by ${x.author}"
twitter = true
twitterId = ${x.id}
twitterUrl = "https://twitter.com/${x.author}/status/${x.id}"
+++
${x.message}`
await fs.outputFile(frontmatterPath, frontmatterContents)
logger.info(`Wrote '${frontmatterPath}' to filesystem.`)
})
}
run().catch(err => {
logger.error(err);
process.exit(1);
});