После выпуска 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()]

Комментарии (35)


  1. storoj
    17.08.2015 14:40
    +20

    require 'telegram/bot'
    

    базара нет, в остальные 9 строк можно и уложиться


  1. MaximChistov
    17.08.2015 15:03
    +12

    *заменить питон на руби*
    image


    1. lybin
      17.08.2015 22:53

      Плагиатим в 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


      1. egor_masalitin
        17.08.2015 23:03

        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
        


        1. lybin
          17.08.2015 23:37

          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'):
          


          1. lybin
            17.08.2015 23:47

            Если в api get_updates сделать генератором, хорошая идея кстати, то до 5 сократить можно. И в ruby два end убрать, будет по 5, таки ниже правы :)


          1. egor_masalitin
            17.08.2015 23:49

            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
            


            1. lybin
              17.08.2015 23:57

              Вот это интереснее статьи :) Я думаю :) Здесь надо было не «4 строки на Ruby :)», а «4 строки на Ruby :P»
              P.S. почему 4, там же 3? Скобки скобки так не любимые питонистами, эх :(


              1. egor_masalitin
                18.08.2015 00:01

                Вы правы, 3, да:)


                1. robux
                  20.08.2015 08:41

                  Короче, 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' } }
                  


            1. lybin
              18.08.2015 00:19

              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-х думаю :)


            1. lybin
              18.08.2015 00:23

              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()]
              


              1. egor_masalitin
                18.08.2015 00:32

                Да, отлично:) короче никак:) 1 на либу, 1 на токен, 1 на логику:)


                1. lybin
                  18.08.2015 00:42

                  А я вот понял, что без вас я бы остановился на 6 строках :) Конкуренция — двигатель, да :)


              1. Invision70
                19.08.2015 19:36

                На ruby приятнее выглядит и читается ;)


                1. lybin
                  19.08.2015 19:46

                  Потому что пришлось извратиться ибо в python нет скобок, конечно так писать не надо :) Вы сравните первые 8 python строк и 10 ruby.


          1. lybin
            18.08.2015 00:09

            у меня опечатка кстати:

            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
            


  1. Antex
    17.08.2015 16:23
    +9

    image


    1. egor_masalitin
      17.08.2015 16:35

      Простите, но что из примера выше не понятно? Я поясню, если есть еще вопросы.


      1. ErshoVV
        17.08.2015 17:01
        +1

        Описания синтаксиса логики бота не хватает.


        1. egor_masalitin
          17.08.2015 17:15

          Возможно вы правы, но пост планировался как Hello World, входная точка, для которой не требуются подробные теоретические описания. Но это мое мнение, почему так и сделал. В следующий раз буду описывать гораздо более подробно. Спасибо.


          1. Silaev
            18.08.2015 00:39

            Мне кажется ссылки на гитхаб было бы достаточно. Там и поинформативней.


      1. mukizu
        17.08.2015 17:21
        +2

        Я думаю вопрос не в понятности, а в том, что инетересно было бы почитать про разработку библиотеки, подводные камни какие-то итп.
        То, что элементарный бот при использовании библиотеки занимает пару строк (а в сложном все идет на откуп фантазии автора) и так понятно в общем-то.


        1. xakpc
          18.08.2015 01:43

          да нет там никаких подводных камней. API простой и прозрачный — писал для него .net либу, вообще все отлично.


          1. mukizu
            19.08.2015 00:55

            Никто и не утверждает, что есть. Я просто говорю, что статья аля «Hello World» — это как-то несерьезно, тем более что подобное что-то было уже.


            1. xakpc
              19.08.2015 02:03

              было и не раз. по моим подсчётам на хабре сейчас минимум 5 статей начинающихся с фразы «захотел создать бота» :)


  1. Neuronix
    17.08.2015 16:49
    +2

    Да как бы, использование библиотеки — это конечно хорошо, но не интересно.


    1. BupycNet
      17.08.2015 17:30
      +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 и полная инструкция.
      Боты в телеграме может осилить даже тот, кто вообще никогда не программировал. Может хватит уже по нему писать одинаковые статьи? (обращение авторам)


      1. MaximChistov
        17.08.2015 22:39

        вот это уже покруче :)


  1. fanat1k
    17.08.2015 19:24
    -2

    Спасибо автору. Для моего уровня это было полезно и я смог применить информацию из статьи на практике. Предыдущие статьи на аналогичную тему мною были упущены…


  1. googol
    18.08.2015 07:59

    Пожалуйста не называйте гемы c префиксом/суффиксом 'ruby'. Оно и так очевидно что рубишный гем это библиотека для руби.


  1. Shablonarium
    18.08.2015 11:36

    Для сокращателей кода — если вы делаете одну гигантскую строку, это вовсе не значит, что код стал короче. Содержимое скобок обозначающих блок кода должно идти отдельной строкой, тоже самое касается выражений под управляющими операторами вроде while, if и for.


    1. Silaev
      18.08.2015 18:29

      Не всегда.


  1. TimsTims
    18.08.2015 23:17

    Статья хоть и бестолковая, но благодаря ей, я узнал, что telegram запустил ботов, а то пропустил прошлую темы о запуске ботов.

    Поэтому спасибо!


  1. L0NGMAN
    19.08.2015 14:50

    Telegram bot на PHP: http://github.com/akalongman/php-telegram-bot