Покрокова інструкція: як створити телеграм-бота на Ruby
Мене звуть Володимир, я QA Automation Engineer у компанії Matic. Люблю автоматизувати процеси й постійно пробую нові та цікаві технології. Найцікавіший проєкт, яким я займався останнім часом, — телеграм-бот мовою програмування Ruby. На цей час телеграм налічує понад 200 мільйонів активних користувачів зі всього світу, і все більше людей встановлюють телеграм собі на пристрої та користуються ним щоденно.
Якщо ви думаєте, що під капотом телеграм-бота знаходиться штучний інтелект чи інша надскладна технологія, то хочу вас запевнити, що все не так страшно. У цій статті я навчу вас писати власних ботів, які будуть показувати погоду в різних містах. Надалі ж ви зможете використати ці підходи для написання інших ботів, що нагадуватимуть вам про дні народження, показуватимуть затори на дорогах, надсилатимуть цікаві новини тощо. Тож перейдімо до роботи, бо хтозна, можливо, вам у майбутньому вдасться монетизувати свого бота.
Ця стаття розрахована на людей, що починають свій шлях в ІТ й хотіли б спробувати щось нове, поекспериментувати з технологіями, створити свій власний проєкт. Не переймайтеся, дуже багато часу це не забере. Орієнтовно 15 хвилин на прочитання і 30 — на реалізацію ідеї.
Для того, щоб створити цей телеграм-бот, нам треба:
- Установити Ruby:
- Установити одне із середовищ розробки (Atom, Sublime, Visual Code, RubyMine (його я й використовую), підійде навіть блокнот).
- Створити акаунт в Openweather Api.
- Акаунт у телеграмі.
Наш бот показуватиме погоду в різних містах на основі даних Оpenweather API. Я вибрав саме цей ресурс — він безплатний і простий у користуванні. Також, як ви вже могли здогадатися, для написання цього телеграм-бота ми використаємо мову Ruby: вона одна з найпростіших для сприйняття мов програмування, бо розроблена для людей, а не машин. Ця мова open-source, має велике ком’юніті, а отже більшість рішень уже є в інтернеті, тому не треба придумувати складні алгоритми.
Створення телеграм-бота
Нам треба створити телеграм-бота, звідки ми можемо взяти токен. Детальніше про те, що таке токен, можете прочитати на Вікіпедії — «Токен автентифікації».
Для цього в телеграмі знайдіть і додайте до своїх контактів @BotFather і введіть команду /start.
Тепер напишіть команду /newbot для створення нового бота.
Настав час придумати назву для вашого бота. Це може бути будь-яке ім’я, наприклад: Weather Bot, Super Mega Weather.
Далі придумайте username, за допомогою якого ми зможемо знаходити нашого бота. Username має закінчуватися словом bot (або Bot), це вимога BotFather.
За допомогою цього нікнейма можна знайти й додати вашого бота до своїх контактів. Збережіть токен, який видасть бот, бо він нам знадобиться згодом.
OpenWeather API
Наш бот інтегруватиметься з OpenWeather, але ви можете використовувати будь-який інший сервіс. Отже, щоб інтегруватися з OpenWeather, насамперед вам треба зареєструватися там та прочитати інструкцію з використання.
Реєструємося та створюємо токен для роботи. Цей токен матиме вигляд набору букв і цифр. Збережіть його також, він нам скоро знадобиться.
Зверніть увагу! Для Api calls через Openweather треба зачекати приблизно годину після реєстрації для того, щоб система додала вас і ваш токен для роботи.
Вітаю! Половину роботи вже зроблено! Це було не складно, погодьтеся, залишилося лише написати трішки коду.
Створення проєкту й встановлення бібліотек
Для початку відкрийте Термінал.
- Windows: Запустіть Командний рядок (Win+R, введіть команду cmd).
- macOS, Linux: Введіть у Spotlight слово terminal і відкрийте його.
Створіть новий проєкт. Якщо використовуєте Rubymine, то натисніть File -> New -> Project.
Перейдіть у теку з проєктом, використовуючи Термінал (для навігації використовуйте команду cd folder_name
).
Установіть менеджер бібліотек для мови Ruby bundler командою в Терміналі: gem install bundler
.
Детальніше про bundler можна почитати тут .
Створимо Gemfile в корені проєкту (без розширення). Цей файл допомагає легко зберігати й установлювати бібліотеки (Gems у мові Ruby). Для створення цього файлу використайте таку команду: bundle init
.
Детальніше про Gemfile — тут.
Використаймо дві бібліотеки, а саме: telegram-bot-ruby — для написання телеграм-бота; rest-client — для api calls.
Тобто кінцевий вигляд нашого Gemfile буде такий:
source 'https://rubygems.org' gem 'rest-client' gem 'telegram-bot-ruby'
Для встановлення бібліотек, які ми прописали в Gemfile, використайте таку команду: bundle install
. Ця команда встановить усі потрібні бібліотеки для роботи з Gemfile. У цей момент будуть додані дві бібліотеки, а саме: rest-client і telegram-bot-ruby.
Написання коду
Весь наш код поміститься в одному файлі. Створімо його та назвімо weather.rb.
Для початку додамо бібліотеку для роботи з API. Для цього в першому рядочку напишемо: require 'rest-client'
.
Створюємо клас для роботи з погодою. Клас — це шаблон, з якого створюються інші об’єкти. Використовуємо таку назву класу:
class Weather end
Додамо всередину класу наш OpenWeather токен, який ми дістали в попередньому пункті та лінку для API. Для цього оголосимо такі константи:
API_URL = 'api.openweathermap.org/data/2.5/'.freeze APPID = 'YOUR_OPEN_API_APPID'.freeze
Константи — це значення, що не мінятимуться.
Додаємо до класу кілька методів. Метод — це набір операцій, що повертають значення.
Додамо конструктор. Конструктор — це набір команд, які виконуватимуться при створенні класу:
def initialize(city) @city = city end
У нашому випадку при створенні класу ми створюватимемо об’єкт city (тобто назву міста).
Додамо акцесор. Акцесор — це метод, що дозволяє читати дані, в нашому випадку @city.
attr_reader :city
Додаємо повідомлення для користувача:
def form_message temperature.nil? ? 'City not found' : "In #{city} city today is #{temperature} celsius #{select_icon(temperature)}" end
Не лякайтеся численних символів. У нашому випадку перевіряємо, чи є температура. Якщо її немає, виводимо повідомлення, що міста немає. Якщо вона є, ми повертаємо таке повідомлення: In <назва_міста> city today <температура> celsius <іконка погоди>
, про яку поговоримо згодом>.
Далі інкапсулюватимемо, тобто писатимемо приватні методи. Інкапсуляція дозволяє приховати методи від використання поза межами цього класу, щоб обмежити доступ до них випадкових змін. Для цього напишемо:private
Додамо лінк для перевірки погоди:
def weather_url "#{API_URL}/weather?q=#{city}&APPID=#{APPID}&units=metric" end
Цей лінк складається з URL для API, назви міста, вашого токена, а також використання метричної системи числення.
Тепер додаємо запит (request) на сервер. Відповідь (response) повернеться у форматі JSON — найпопулярнішому форматі серед API. Перетворимо його на хеш методом JSON.parse:
def weather_response @response_body ||= RestClient.get(weather_url).body JSON(@response_body) end
Тут ми посилаємо get запит з нашою згенерованою URL, звідки дістаємо body. Після цього конвертуємо його в JSON.
Дістанемо температуру з нашого response:
def temperature weather = weather_response return nil unless weather weather.dig('main', 'temp').to_i end
Звідси, з попереднього методу ми дістали response і перевіряємо, чи він не пустий. Якщо він пустий — повертаємося з методу й вертаємо nil, тобто нічого.
Додамо ще головний візуальний елемент — іконки для певних градусів температури:
def weather_icons { 40..49 => 'Похожие статьи:Начинаем подводить итоги года. Любой, кто следит за украинской новостной лентой, твердо знает, что вокруг все плохо. Но только...За кілька місяців повномасштабної війни рф проти України багато українських ІТ-фахівців переїхали за кордон, але...Американська компанія з корпоративного програмного забезпечення Databricks повідомила, що купує АІ-компанію MosaicML....У новому випуску YouTube-рубрики «X питань», де ми розпитуємо представників різних спеціальностей про те,...