How I Built A Task Notifier With AWS Lambda and Telegram Bot

11 November 2017 aws lambda, chatbot, side-project

Last weekend I set out to create an app that would allow me to create a reading queue and nag at me daily to action on the top entry until I’ve marked it as read. This stems primarily from my tendency to have a loooong list of articles I want to read but never getting to read them.

1. The Goals

  1. The ability to add and remove task I want to accomplish in a queue.

  2. Scheduled notification which sends me the top task from the queue daily.

  3. I should be able to easily mark the task as “done” (i.e. mark the article as “read”) and it should drop off the queue.

2. The Architecture

How it works

How it works

3. The Process

3.1 CRUD for my reading list

I spent quite some time trying to implement simple CRUD of reading task list but it was boring as hell so I switched to using Todoist as the “datastore” for my reading list. I had been using Todoist on Android for the past few months and I was pleasantly surprised to find out that it provides dead-simple APIs.

Screenshot of Todoist app in my phone.

Screenshot of Todoist app in my phone.

3.2 Building Lambda Function and Setting Up Scheduled Event

Spinning up an EC2 instance just to run Cron jobs seems a lot like an overkill for this very simple task. All I want is a daily job that calls Todoist API to fetch the content of the daily task I’ve queued, and call another API to send me the task of the day. AWS Lambda seems to fit the bill since I can just upload my function and makes it runs upon scheduled CloudWatch Events which acts as a trigger.

Screenshot of the CloudWatch Event used as the trigger for my lambda function.

Screenshot of the CloudWatch Event used as the trigger for my lambda function.

3.3 Setting up Telegram Bot to notify me of the task of the day

Telegram’s Bot creation is real simple. I chatted with BotFather and my bot was created within seconds. You’d get an API access token once the bot is created.

Screenshot of the Telegram bot creation process.

Screenshot of the Telegram bot creation process.

3.4 Creating an API using Amazon API Gateway and Lambda function to mark the task as done

Amazon API gateway let you easily create a REST API to expose your lambda function to a HTTP call. I wrote another lambda function for moving the task out of the queue to an archive folder in Todoist and configured the API Gateway such that a user can click the link to mark it as done.

Lambda function with a API gateway as the trigger.

Lambda function with a API gateway as the trigger.

4. The End Product

What I received everyday at 10AM

What I received everyday at 10AM

5. Closing Thoughts

I’ve got this task (article-of-the-day) notifier running for a week and so far I’ve read 4 articles from the reading queue. That’s a big improvement.

On the technical sides, now that I get the hang of the lambda function, I find it to be incredibly useful and easy to set up. I have configured another lambda function to ping my free heroku instance so it won’t sleep after 30 minutes of inactivity. I’m planning to put the code for this project on Github once I clean it up.