A wrapper for the Telegram Bot API bot telegram-bot telegram
0.1.0 Latest release released


Telegram Bot API (3.2) wrapper for Crystal

Current features

api methods and types:

  • [x] basic message types
  • [x] stickers
  • [x] inline mode
  • [x] payments
  • [x] games

getting updates:

  • [x] long polling
  • [x] webhooks

additional features:

  • [x] white & black lists
  • [x] command handler


Create your bot by inheriting from TelegramBot::Bot.


Define which commands your bot handles via the cmd method in the CmdHandler module. For example, respond world to /hello and perform simple calculation with /add:

require "telegram_bot"

class MyBot < TelegramBot::Bot
  include TelegramBot::CmdHandler

  def initialize
    super("MyBot", TOKEN)

    cmd "hello" do |msg|
      reply msg, "world!"

    # /add 5 7 => 12
    cmd "add" do |msg, params|
      reply msg, "#{params[0].to_i + params[1].to_i}"

my_bot =

Custom handlers

Override any of the following handle methods to handle Telegram updates, be it messages, inline queries, chosen inline results or callback queries:

def handle(message : Message)

def handle(inline_query : InlineQuery)

def handle(chosen_inline_result : ChosenInlineResult)

def handle(callback_query : CallbackQuery)

def handle_edited(message : Message)

def handle_channel_post(message : Message)

def handle_edited_channel_post(message : Message)

For example, to echo all messages sent to the bot:

class EchoBot < TelegramBot::Bot
  def handle(message : Message)
    if text = message.text
      reply message, text

Or to answer inline queries with a list of articles:

class InlineBot < TelegramBot::Bot
  def handle(inline_query : TelegramBot::InlineQuery)
    results = Array(TelegramBot::InlineQueryResult).new

    content = "Article details"
    results <<"article/1", "My first article", content)

    answer_inline_query(, results)

Remember to enable inline mode in BotFather to support inline queries.


All the examples above use the getUpdates method, constantly polling Telegram for new updates, by invoking the polling method on the bot.

Another option is to use the setWebhook method to tell Telegram where to POST any updates for your bot. Note that you must use HTTPS in this endpoint for Telegram to work, and you can use a self-signed certificate, which you can provide as part of the setWebhook method:

# Certificate has the contents of the certificate, not the path to it
bot.set_webhook(url, certificate)

After invoking setWebhook, have your bot start an HTTPS server with the serve command:

bot.serve("", 443, "path/to/ssl/certificate", "path/to/ssl/key")

If you run your bot behind a proxy that performs SSL offloading (ie the proxy presents the certificate to Telegram, and then forwards the request to your app using plain HTTP), you may skip the last two parameters, and the bot will listen for HTTP requests instead of HTTPS.

When running your bot in serve mode, the bot will favour executing any methods by sending a response as part of the Telegram request, rather than executing a new request.


However it's not part of the API you can set black or white lists in the bot's constructor to filter your users by username.

whitelist: if user is not present on the list (or doesn't have username) the message won't be handled

blacklist: if user is present on the list the message won't be handled


Add this to your application's shard.yml:

    github: hangyas/telegram_bot


Contributing is very welcomed!

  1. Fork it ( )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request


  • hangyas Krisztián Ádám - creator, maintainer
  github: hangyas/telegram_bot
  version: ~> 0.1.0
License MIT
Crystal none


Dependencies 0

Development Dependencies 0

Dependents 0

Last synced .
search fire star recently