Skip to content

lesterchan/telegram-bot

Repository files navigation

Telegram Bot

A tutorial on creating a Node.js Telegram bot using AWS Lambda with AWS API Gateway.

Telegram Bot

Build Status

Build Status

Setup

I am choosing Asia Pacific (Singapore) region for AWS Lambda and Asia Pacific (Singapore) region for AWS API Gateway.

Telegram

  1. Go to Telegram Web.
  2. Start a chat with @BotFather.
  3. Type "/start".
  4. Type "/newbot" to create a new bot. I named my bot "lesterchan_bot".
  5. Note the HTTP API access token that @BotFather will reply you after you created the bot.

Checkout Code

$ git clone https://github.com/lesterchan/telegram-bot.git  
$ cd telegram-bot  
$ npm install --production
$ cp token.sample.js token.js

Open up token.js and fill in your Telegram HTTP API access token obtained in the first step then run this command:

$ zip -r telegram-bot.zip *.js node_modules/*

AWS Lambda

  1. Go to AWS Lambda.
  2. Click "Get Started Now".
  3. Under the "Select blueprint" screen, search for "hello-world"and you will see the hello-world blueprint which says "A starter AWS Lambda function.".
  4. Click on "hello-world" (NOT "hello-world-python").
  5. You will be brought to the "Configure Function" page.
  6. Under "Name", you can choose any name for your function. I called it "telegram-bot".
  7. Under "Runtime", ensure it is "Node.js".
  8. Under "Code entry type", choose "Upload a .ZIP file" and click the "Upload" button" to browse for the file "telegram-bot.zip" which you have zipped previously.
  9. Under "Handler", we leave it as "index.handler".
  10. Under "Role", we choose "Basic Execution Role".
  11. You will be brought to a "Role Summary" page.
  12. Under "IAM Role", choose "lambda_basic_execution".
  13. Under "Role Name", choose "oneClick_lambda_basic_execution_.....".
  14. Click "Allow".
  15. You will be brought back to the "Configure Function" page.
  16. Leave "Memory (MB)" as "128MB".
  17. You might want to increase "Timeout" to "15" seconds.
  18. Under VPC, choose "No VPC".
  19. Click "Next".
  20. Click "Create function".

AWS API Gateway

  1. Go to AWS API Gateway.
  2. Click "Get Started Now".
  3. Under "API name", enter the name of your API. I will just name it "Telegram Bot".
  4. Click "Create API".
  5. You will be redirected to the "Resources" page.
  6. Click "Create Method" and on the dropdown menu on the left, choose "POST" and click on the "tick" icon.
  7. Now, you will see the "/ - POST - Setup" page on the right.
  8. Under "Integration Type", choose "Lambda Function".
  9. Under "Lambda Region", choose "ap-southeast-1".
  10. Under "Lambda Function", type "telegram" and it should auto-complete it to "telegram-bot".
  11. Click "Save" and "Ok" when the popup appears.
  12. You will be brought to the "/ - POST - Method Execution" Page.
  13. Click "Integration Request".
  14. Click "Mapping Templates" and the section should expand.
  15. Click "Add Mapping Template" and type in "application/json" and click on the "tick" icon.
  16. Under "Input Passthrough" on the right, click on the "pencil" icon.
  17. Choose "Mapping Template" on the dropdown that appears.
  18. Copy and paste {"body": $input.json('$')} to the template box.
  19. Click on the "tick" icon beside the dropdown once you are done.
  20. Click on "Deploy API" button on the top left.
  21. Under "Deployment Stage", click "New Stage".
  22. Under "Stage Name", I will type in "production".
  23. Click "Deploy".
  24. Note the "Invoke URL" at the top and your API is now live.

Set Telegram Webhook

  1. Replace <ACCESS_TOKEN> with your Telegram HTTP API access token obtained in the first step.
  2. Replace <INVOKE_URL> with your Invoke URL obtained in the previous step.
  3. Run this command:
$ curl --data "url=<INVOKE_URL>" "https://api.telegram.org/bot<ACCESS_TOKEN>/setWebhook"

You should get back a response similar to this:

$ {"ok":true,"result":true,"description":"Webhook was set"}

Testing via Telegram

  1. Message your Telegram Bot that you have created.
  2. Type in "/haze" (without the quotes).
  3. You should get back a nicely formatting response as shown in the first screenshot.

Commands

Singapore Bus Arrival Timings

Usage: /bus <busStopNo> <busNo>
Example: /bus 30111 991

Usage: /bus <busStopNo>
Example: /bus 44591

Singapore Haze Situation

Usage: /haze
Example: /haze

Singapore Weather 2 Hour Forecast

Usage: /weather
Example: /weather

IP Information

Usage: /ipinfo <ip>
Example: /ipinfo 8.8.8.8

Social Stats Count For Links

Usage: /socialstats <url>
Example: /socialstats https://lesterchan.net

See Also

Slack Bot using AWS API Gateway and AWS Lamda