browse by category or date

 

My IT Department is using ManageEngine for application/server monitoring. It will send out emails whenever an application/server is down. But, it’s not enough because not everyone have the email sync-ed to their smartphone. So we need to explore new ways to send the notifications. SMS Gateway is definitely out of the equation (I proposed before, but kena shoot down).

Since we already have a WhatsApp group, sending the alerts to the group would be the best solution. But alas, WhatsApp doesn’t provide you API to do this.

Enter Telegram

I have used Telegram for quite sometime now. It was started when I was invited to my high school group. The group was moved from WhatsApp due to its limitation on how many members in a group.

As I read Telegram documentation, I found that Telegram allows you to create bot. The bot can be controlled through HTTP request. Convinced that the API is good enough to meet my needs. I decided to go ahead. Here’s how.

 

Before creating the bot, I need to create the group and invite all my colleagues to join.
chrome_2016-04-06_23-48-30

Note the group id is highlighted in red

Note the group id is highlighted in red

After all my colleagues joined the group, it’s time to create the bot. For that we need to talk to the BotFather :D:D (click the below picture to start talking)

03b57814e13713da37

Once the BotFather’s chat window is open. Follow the following interactions:

  1. chrome_2016-04-07_11-44-26
  2. Reply with the name of the bot.
    chrome_2016-04-07_11-47-36
  3. Reply with the bot’s new user id chrome_2016-04-07_11-49-20

That’s all. Now we have our bot ready. Please record down your bot’s token (highlighted in red rectangle) because we will need it to access the HTTP API.

 

My work emails is stored in MS Exchange Server. So I assumed that it would be dead simple to retrieve email using C#. I was wrong. After googling for this solution, I found that many people take the IMAP route instead of using Exchange Web Service API (only available in Exchange 2007 or later). Since I had a very limited time allocated to this project, I follow the recommended IMAP client library, AE.Net.Mail.

We can install this library through Nuget:

Install-Package AE.Net.Mail

This step is quite simple. First, we retrieve the email. Second, check whether the email’s subject is inside the list of subjects that should be relayed to Telegram. If yes, send the message to Telegram. Finally, delete the email regardless it relayed to Telegram or not.

Here’s my code to retrieve the email.

using System;
using System.Configuration;
using AE.Net.Mail;

//..SNIP..

static void Main(string[] args)
{
   var setting = ConfigurationManager.AppSettings;
   var lastRun = DateTime.Now.AddMinutes(-6);
   var imap = new ImapClient(
        setting["emailHost"], 
		setting["emailUser"],
        setting["emailPassword"], 
		AuthMethods.Login, 
		993,  // IMAP secure port
		true, // is Secure?
		true  // skip SSL validation?
   );
   
   // Entity object containing the list of important email subjects
   var db = new ITBotEntities();  
   
   while (true)
   {
      // Check email every 5 minutes
      if (lastRun.AddMinutes(5) < DateTime.Now)
      {
	     
		 var msgs = imap.SearchMessages(
			SearchCondition.Undeleted().And(        
				SearchCondition.SentSince(lastRun)
			));
		 foreach (var msg in msgs)	
		 {
		    //StripSpaces will remove all the whitespaces
		    var subject = StripSpaces(msg.Subject);
		   
		    foreach (var obj in db.LookupParams)
		    {
		       var objHeader = StripSpaces(obj.header);
		 	   if (subject.Equals(objHeader))
			   {					
			      Console.WriteLine(obj.header);
				  //Send alerts to Telegram
				  var content = SendTelegramMessage(obj.header); 
				  Console.WriteLine(content);
			   }
		    }
		    imap.DeleteMessage(msg);
		 }
		 lastRun = DateTime.Now;
	  }
	  else
   	     Thread.Sleep(5000);
   }
}

So how do we actually make the bot send alerts to the group? It's dead simple. Just remember to replace ##TOKEN## and ##GROUP_ID## with values we obtain in step 2.

private static string SendTelegramMessage(string message)
{
	var request =
		WebRequest.Create(
			"https://api.telegram.org/bot##TOKEN##/sendMessage?chat_id=-##GROUP_ID##&text=" +
			WebUtility.UrlEncode(message));
	var resp = request.GetResponse();
	var reader = new StreamReader(resp.GetResponseStream());
	var content = reader.ReadToEnd();
	/*
	the JSON object returned
	{
		"ok": true,
		"result": {
			"message_id": 7,
			"from": {
				"id": 189119520,
				"first_name": "IT-Bot",
				"username": "rlit_bot"
			},
			"chat": {
				"id": -##GROUP_ID##,
				"title": "Richland IT",
				"type": "group"
			},
			"date": 1459696911,
			"text": "Alarm from the Applications Manager - [ EDI File Monitor is down ]"
		}
	}
	
	*/
	reader.Close();
	resp.Dispose();
	return content;
} 

 

It's really easy to create Telegram Bot and to use to send messages. If we read the API further, we should find that Telegram also provide WebHook. This way we can setup a web service to monitor the messages received by the bot, in real-time. Imagine the unlimited possibilities! Restart a server? Just send message to the bot. If we combine this with Raspberry Pi, Home automation is super achievable! But keep in mind to keep the token secured to prevent the unwanted!.

That's all folks. I hope it helps. Cheers!

About Hardono

Hi, I'm Hardono. I am working as a Software Developer. I am working mostly in Windows, dealing with .NET, conversing in C#. But I know a bit of Linux, mainly because I need to keep this blog operational. I've been working in Logistics/Transport industry for more than 9 years.

Incoming Search

https://sodeve net/2016/04/how-to-make-a-telegram-bot-that-sends-alerts-when-our-serverapplication-is-down/, https://yandex ru/clck/jsredir?from=yandex ru;search;web;;&text=&etext=1822 dNKywGELpvFTHSfBWA6oqgMjuIRW-zLrKs39qUbAGNg ccb30939993a21a6efdc40140ef267581e35cc0c&uuid=&state=_BLhILn4SxNIvvL0W45KSic66uCIg23qh8iRG98qeIXmeppkgUc0YMIVJNtoWDTa6C, monit alert telegram

1 comment so far

Add Your Comment
  1. Thanks for sharing the way to make a telegram bot that sends alerts when our server application is down.
    http://rollingskygame.com/