После выпуска 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:
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
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)
MaximChistov
17.08.2015 15:03+12*заменить питон на руби*
lybin
17.08.2015 22:53Плагиатим в 8 строк на python xDfrom 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.botapiegor_masalitin
17.08.2015 23:037 строк на 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
lybin
17.08.2015 23:376 строк, с 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'):
lybin
17.08.2015 23:47Если в api get_updates сделать генератором, хорошая идея кстати, то до 5 сократить можно. И в ruby два end убрать, будет по 5, таки ниже правы :)
egor_masalitin
17.08.2015 23:495 строк на 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
lybin
17.08.2015 23:57Вот это интереснее статьи :) Я думаю :) Здесь надо было не «4 строки на Ruby :)», а «4 строки на Ruby :P»
P.S. почему 4, там же 3? Скобки скобки так не любимые питонистами, эх :(egor_masalitin
18.08.2015 00:01Вы правы, 3, да:)
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' } }
lybin
18.08.2015 00:194 pythonfrom 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-х думаю :)lybin
18.08.2015 00:233 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()]
egor_masalitin
18.08.2015 00:32Да, отлично:) короче никак:) 1 на либу, 1 на токен, 1 на логику:)
lybin
18.08.2015 00:42А я вот понял, что без вас я бы остановился на 6 строках :) Конкуренция — двигатель, да :)
Invision70
19.08.2015 19:36На ruby приятнее выглядит и читается ;)
lybin
19.08.2015 19:46Потому что пришлось извратиться ибо в python нет скобок, конечно так писать не надо :) Вы сравните первые 8 python строк и 10 ruby.
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
Antex
17.08.2015 16:23+9egor_masalitin
17.08.2015 16:35Простите, но что из примера выше не понятно? Я поясню, если есть еще вопросы.
ErshoVV
17.08.2015 17:01+1Описания синтаксиса логики бота не хватает.
egor_masalitin
17.08.2015 17:15Возможно вы правы, но пост планировался как Hello World, входная точка, для которой не требуются подробные теоретические описания. Но это мое мнение, почему так и сделал. В следующий раз буду описывать гораздо более подробно. Спасибо.
mukizu
17.08.2015 17:21+2Я думаю вопрос не в понятности, а в том, что инетересно было бы почитать про разработку библиотеки, подводные камни какие-то итп.
То, что элементарный бот при использовании библиотеки занимает пару строк (а в сложном все идет на откуп фантазии автора) и так понятно в общем-то.xakpc
18.08.2015 01:43да нет там никаких подводных камней. API простой и прозрачный — писал для него .net либу, вообще все отлично.
Neuronix
17.08.2015 16:49+2Да как бы, использование библиотеки — это конечно хорошо, но не интересно.
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 и полная инструкция.
Боты в телеграме может осилить даже тот, кто вообще никогда не программировал. Может хватит уже по нему писать одинаковые статьи? (обращение авторам)
fanat1k
17.08.2015 19:24-2Спасибо автору. Для моего уровня это было полезно и я смог применить информацию из статьи на практике. Предыдущие статьи на аналогичную тему мною были упущены…
googol
18.08.2015 07:59Пожалуйста не называйте гемы c префиксом/суффиксом 'ruby'. Оно и так очевидно что рубишный гем это библиотека для руби.
Shablonarium
18.08.2015 11:36Для сокращателей кода — если вы делаете одну гигантскую строку, это вовсе не значит, что код стал короче. Содержимое скобок обозначающих блок кода должно идти отдельной строкой, тоже самое касается выражений под управляющими операторами вроде while, if и for.
TimsTims
18.08.2015 23:17Статья хоть и бестолковая, но благодаря ей, я узнал, что telegram запустил ботов, а то пропустил прошлую темы о запуске ботов.
Поэтому спасибо!
storoj
базара нет, в остальные 9 строк можно и уложиться