tldr
: I built https://currentevents.email
Intro
For many years I haven't been reading any news at all. *HackerNews doesn't count
While this is great for my cortisol levels, I do feel a bit uninformed.
I recently discovered that wikipedia has daily summary of key events happening around the world.
I decided that is the perfect replacement for news. I've been reading this every day to keep updated. Although it's not hard, I do find the processes of opening the page everyday a bit tedious.
Wikipedia supports RSS, but I've never been much of an RSS user. And so while thinking of something to build this weekend I figured I would create a daily, automated email of the events listed on Wikipedia.
Here is the result: https://currentevents.email
How I built it
The build didn't actually take too long. These are the things I used.
1. Get the content
First I fetch the html content using cheerio. The content requires a bit of cleaning - removing some of the styling etc - but it was a fairly simple process. Here are the key parts:
const request = require('request')
const cheerio = require('cheerio')
const moment = require('moment')
const currentMonth = moment().format('MMMM_YYYY')
const URL_TO_PARSE = `https://en.wikipedia.org/wiki/Portal:Current_events/${currentMonth}`
request(URL_TO_PARSE, async (err, response, body) => {
const $ = cheerio.load(body)
$('*').removeAttr('style')
cleanseLinks($) // Not included here
styleHeaders($) // Not included here
styleLists($) // Not included here
styleLinks($) // Not included here
// Loop through all days this month
var startOfMonth = moment.startOf('month').format('YYYY-MM-DD')
var today = moment().subtract(1, 'day')
for (var m = moment(startOfMonth); m.isBefore(today); m.add(1, 'days')) {
const currentDayEvents = $('.description', `div#${m.format('YYYY_MMMM_d')}`)
console.log(currentDayEvents.html())
}
})
2. Create the email template
Anybody who has tried to create a nice email quickly finds that it's nearly impossible to design something which works on all email clients.
Luckily i found this email template on Github which did all the hard work.
I simply removed the content in the email template and replaced it with the currentDayEvents.html()
in the code snippet above.
3. Sending it to subscribers
I needed a transactional email provider for people to subscribe and to send the emails. I chose SendGrid. They provide a hosted signup page and also an API for sending the email.
4. Sending it every day
The solution to this one was quite cool. I discovered that Github Actions can be run on a schedule, so I created a action that runs at 1 minute past midnight every day. Here is the action:
name: 'Current Events Bot'
on:
schedule:
- cron: '1 0 * * *' # Run at 1 min past midnight every day
jobs:
bot:
runs-on: ubuntu-16.04 # Download the server
steps:
- uses: actions/checkout@v2 # Check out the code
- uses: actions/setup-node@v1 # Set up node
with:
node-version: '12.x'
- run: npm install # Install the modules
- run: npm run build # Run the "build" script that I created
- name: Commit files # Commit all the changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git commit -m "Today's events" --allow-empty
- name: Push changes # Push the changes to the repo
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.CURRENT_EVENTS_TOKEN }}
- run: SENDGRID_API_KEY=${{ secrets.SENDGRID_API_KEY }} npm run send # Run the email script that I created
Conclusion
It took a few hours to build, even though it was quite simple. I also bought the domain name and hosted the content on Netlify, so the set up took a bit of time.
Feel free to comment if you want to get the full code.
Top comments (0)