Пишем Telegram бота на Ruby в 10 строк

  • Tutorial

После выпуска Telegram Bot Platform многие задумывались о написании своего бота. Этот пост описывает минимальные шаги, необходимые для написания собственного бота на Ruby. Для этого потребуется только аккаунт в Telegram и машина с установленным Ruby на ней.

Я выбрал Ruby из за удобного гема для работы с Telegram bot api.

Первое, что нужно сделать, это создать .rb файл, в котором будет храниться логика бота, к примеру, start_bot.rb, и добавить туда минимальный код, необходимый для работы бота:
require 'telegram/bot'
token = 'YOUR_TELEGRAM_BOT_API_TOKEN'
Telegram::Bot::Client.run(token) do |bot|
  bot.listen do |message|
    case message.text
    when '/start'
      bot.api.sendMessage(chat_id: message.chat.id, text: "Hello, #{message.from.first_name}")
    end
  end
end

Для работы сервера не хватает только установки гема. Установку можно совершить двумя способами:
1. Установка гема непосредственно на машину:
gem install telegram-bot-ruby

2. Используя Gemfile
gem 'telegram-bot-ruby'

с последующим выполнением
bundle

Я для простоты примера использовал первый способ.

Теперь необходимо получить токен для бота.
Заходим в Telegram, добавляем бота @BotFather, и создаем бота:


Далее добавляем токен в файл и получаем готовый сервер для бота:
require 'telegram/bot'
token = '118997426:AAFVFtYa15Z7ckyDUIHb578NazgepL4kmU8'
Telegram::Bot::Client.run(token) do |bot|
  bot.listen do |message|
    case message.text
    when '/start'
      bot.api.sendMessage(chat_id: message.chat.id, text: "Hello, #{message.from.first_name}")
    end
  end
end


Для проверки работы бота в начале запускаем сервер:
ruby start_bot.rb

А после пишем боту в Telegram:


Как видно, все работает.

PS: Бота после я удалил, поэтому мой токен, как и бот, недоступны.

UPD:
3 строки на Ruby
require 'telegram/bot'
token = '<>'
Telegram::Bot::Client.run(token) { |bot| bot.listen { |message| bot.api.sendMessage(chat_id: message.chat.id, text: 'Hi!') if message.text == '/start' } }


За Python спасибо lybin
3 строки на Python
from twx.botapi import TelegramBot
token = '<>'
while True: [lambda update: TelegramBot(token).send_message(update.message.chat.id, 'test message body') if update.message.text.startswith('/start') else None for update in TelegramBot(token).get_updates().wait()]

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 35

    +20
    require 'telegram/bot'
    

    базара нет, в остальные 9 строк можно и уложиться
      +12
      *заменить питон на руби*
      image
        0
        Плагиатим в 8 строк на python xD
        from twx.botapi import TelegramBot
        token = '<>'
        bot = TelegramBot(token)
        while True:
            updates = bot.get_updates().wait()
            for update in updates:
                if update.message.text.startswith('/start'):
                    bot.send_message(update.message.chat.id, 'test message body')
        

        Протокол в исходнике норм читаем, github.com/datamachine/twx.botapi
          0
          7 строк на Ruby :)
          require 'telegram/bot'
          token = '118997426:AAFVFtYa15Z7ckyDUIHb578NazgepL4kmU8'
          Telegram::Bot::Client.run(token) do |bot|
            bot.listen do |message|
               bot.api.sendMessage(chat_id: message.chat.id, text: "Hello, #{message.from.first_name}") if message.text == '/start'
            end
          end
          

            0
            6 строк, с token не мухлюем! :)
            from twx.botapi import TelegramBot
            token = '<>'
            with TelegramBot(token) as bot:
                while True:
                    for update in bot.get_updates().wait():
                            bot.send_message(update.message.chat.id, 'test message body') if update.message.text.startswith('/start'):
            

              0
              Если в api get_updates сделать генератором, хорошая идея кстати, то до 5 сократить можно. И в ruby два end убрать, будет по 5, таки ниже правы :)
                0
                5 строк на Ruby :)
                require 'telegram/bot'
                token = '<>'
                Telegram::Bot::Client.run(token) do |bot|
                  bot.listen { |message| bot.api.sendMessage(chat_id: message.chat.id, text: 'Hi!') if message.text == '/start' }
                end
                


                4 строки на Ruby :)
                require 'telegram/bot'
                token = '<>'
                Telegram::Bot::Client.run(token) { |bot| bot.listen { |message| bot.api.sendMessage(chat_id: message.chat.id, text: 'Hi!') if message.text == '/start' } }
                

                  0
                  Вот это интереснее статьи :) Я думаю :) Здесь надо было не «4 строки на Ruby :)», а «4 строки на Ruby :P»
                  P.S. почему 4, там же 3? Скобки скобки так не любимые питонистами, эх :(
                    0
                    Вы правы, 3, да:)
                      0
                      Короче, 2 строки на Ruby (и это всё содержание статьи :):
                      require 'telegram/bot'
                      Telegram::Bot::Client.run('AAFVFtYa15Z7ckyDUIHb578NazgepL4kmU8') { |bot| bot.listen { |mes| bot.api.sendMessage(chat_id: mes.chat.id, text: 'Hi!') if mes.text == '/start' } }
                      
                    0
                    4 python
                    from twx.botapi import TelegramBot
                    token = '<>'
                    with TelegramBot(token) as bot:
                        while True: [lambda update: bot.send_message(update.message.chat.id, 'test message body') if update.message.text.startswith('/start') else None for update in bot.get_updates().wait()]
                    

                    до 3-х думаю :)
                      0
                      3 python, мир дружба? :)
                      from twx.botapi import TelegramBot
                      token = '<>'
                      while True: [lambda update: TelegramBot(token).send_message(update.message.chat.id, 'test message body') if update.message.text.startswith('/start') else None for update in TelegramBot(token).get_updates().wait()]
                      

                        0
                        Да, отлично:) короче никак:) 1 на либу, 1 на токен, 1 на логику:)
                          0
                          А я вот понял, что без вас я бы остановился на 6 строках :) Конкуренция — двигатель, да :)
                          0
                          На ruby приятнее выглядит и читается ;)
                            0
                            Потому что пришлось извратиться ибо в python нет скобок, конечно так писать не надо :) Вы сравните первые 8 python строк и 10 ruby.
                        0
                        у меня опечатка кстати:
                        bot.send_message(update.message.chat.id, 'test message body') if update.message.text.startswith('/start'):
                        

                        а верно:
                        bot.send_message(update.message.chat.id, 'test message body') if update.message.text.startswith('/start') else pass
                        
                  +9
                  image
                    0
                    Простите, но что из примера выше не понятно? Я поясню, если есть еще вопросы.
                      +1
                      Описания синтаксиса логики бота не хватает.
                        0
                        Возможно вы правы, но пост планировался как Hello World, входная точка, для которой не требуются подробные теоретические описания. Но это мое мнение, почему так и сделал. В следующий раз буду описывать гораздо более подробно. Спасибо.
                          0
                          Мне кажется ссылки на гитхаб было бы достаточно. Там и поинформативней.
                        +2
                        Я думаю вопрос не в понятности, а в том, что инетересно было бы почитать про разработку библиотеки, подводные камни какие-то итп.
                        То, что элементарный бот при использовании библиотеки занимает пару строк (а в сложном все идет на откуп фантазии автора) и так понятно в общем-то.
                          0
                          да нет там никаких подводных камней. API простой и прозрачный — писал для него .net либу, вообще все отлично.
                            0
                            Никто и не утверждает, что есть. Я просто говорю, что статья аля «Hello World» — это как-то несерьезно, тем более что подобное что-то было уже.
                              0
                              было и не раз. по моим подсчётам на хабре сейчас минимум 5 статей начинающихся с фразы «захотел создать бота» :)
                      +2
                      Да как бы, использование библиотеки — это конечно хорошо, но не интересно.
                        +4
                        Да тут как бы статья вообще странная. Я такого бота на php могу вообще в две строчки написать без каких либо сторонних библиотек.
                        $gram=json_decode(file_get_contents('php://input'),true);
                        file_get_contents('https://api.telegram.org/botID:KEY/sendMessage?disable_web_page_preview=1&chat_id='.$gram['message']['chat']['id'].'&text='.urlencode('Привет'.$gram['message']['chat']['last_name']));
                        


                        PS. И вообще странно, я 2 месяца назад как бы делал статью через 2 дня после выхода бота. Там был Hello World и полная инструкция.
                        Боты в телеграме может осилить даже тот, кто вообще никогда не программировал. Может хватит уже по нему писать одинаковые статьи? (обращение авторам)
                          0
                          вот это уже покруче :)
                        –2
                        Спасибо автору. Для моего уровня это было полезно и я смог применить информацию из статьи на практике. Предыдущие статьи на аналогичную тему мною были упущены…
                          0
                          Пожалуйста не называйте гемы c префиксом/суффиксом 'ruby'. Оно и так очевидно что рубишный гем это библиотека для руби.
                            0
                            Для сокращателей кода — если вы делаете одну гигантскую строку, это вовсе не значит, что код стал короче. Содержимое скобок обозначающих блок кода должно идти отдельной строкой, тоже самое касается выражений под управляющими операторами вроде while, if и for.
                              0
                              Не всегда.
                              0
                              Статья хоть и бестолковая, но благодаря ей, я узнал, что telegram запустил ботов, а то пропустил прошлую темы о запуске ботов.

                              Поэтому спасибо!
                                0
                                Telegram bot на PHP: http://github.com/akalongman/php-telegram-bot

                                Only users with full accounts can post comments. Log in, please.