Sending a message using telegram and scala
In this article we are going to use scala to send a message via Telegram. The process is very simple and pretty much involves setting up a bot and making a GET request to Telegram’s api.
The Telegram app on the phone has more features than its desktop counterpart. I recommend you to use the phone version to make sure you have access to all the required features.
On Telegram
1. Create a Telegram public channel
Telegram requires you to have a public channel to be able to publish messages using a bot.
Go ahead and create a public channel using the app.
2. Create a Bot using the BotFather
The BotFather is a special Bot created by Telegram that allows you to create and maintain your bots. Search for @BotFather
on the app and follow the instructions to create a new bot. You’ll be asked to create a name and a username for it.
3. Add your new bot as administrator to your channel
Add your new bot as administrator to the public channel you created on step 1.
On Scala
1. Add a REST library to your project
Add to your project a library that allows you to send remote requests. If you’re using the PlayFramework you can use ws. In my case, I’m going to go with scalaj, so I have to add it to my build.sbt
file:
libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.1"
2. Create a function
Sending a message to telegram requires you to send a GET
request to Telegram’s send-message endpoint:
https://api.telegram.org/bot$botApiKey/sendMessage
I’m going to create a function that sends a request to this endpoint and returns the api’s response to its caller:
import java.net.URLEncoder
import scalaj.http.{Http, HttpOptions}
val botApiKey = "1234567890:your-bot-api-key"
val chatId = "@your-public-chat-id"
val connectionTimeout = 1000 * 10 // in milliseconds
val readTimeout = 1000 * 10 // in milliseconds
def sendMessage(message: String): Option[String] = {
val url = s"https://api.telegram.org/bot$botApiKey/sendMessage" +
s"?chat_id=${URLEncoder.encode(chatId, "UTF-8")}" +
s"&parse_mode=MarkdownV2" +
s"&text=${URLEncoder.encode(message, "UTF-8")}"
val response = Http(url)
.options(HttpOptions.followRedirects(true))
.timeout(connectionTimeout, readTimeout)
.asString
if (response.is2xx) Some(response.body)
else None
}
The endpoint takes the following parameters:
- chat_id: your public channel id.
- parse_mode: MarkdownV2 or HTML. Yes, Telegram can parse your markdown and html messages.
- text: your message.
The last step is to use your function:
val response: Option[String] = sendMessage("This is *beautiful*")
Making an API request is a blocking operation, so I recommend you to evaluate your use-cases and implement this function using futures.
Happy texting.
References
- Telegram Bot API. sendMessage.
- Bots: An introduction for developers.