Будуємо Telegram-бот в Яндекс.Хмарі

Будуємо Telegram-бот в Яндекс.Хмарі

Сьогодні з підручних матеріалів ми зберемо в Яндекс.Хмарі Telegram-бот з використанням Yandex Cloud Functions (або Яндекс-функції - для стислості) і Яндекс Об'єктне сховище (або Об'єктне сховище - Для ясності). Код буде на Node.js. Проте є одна пікантна обставина — якась організація під назвою, скажімо так, РоссКомЦензур (цензура заборонена статтею 29 Конституції РФ), не дозволяє інтернет-провайдерам Росії передавати запити API Telegram за адресою: https://api.telegram.org/. Ну, ми й не будемо — ні так ні. Адже у нашому саквояжі є т.зв. вебхукі — з їх допомогою ми не робимо запити на конкретну адресу, а лише надсилаємо свій запит як відповідь на будь-який запит до нас. Тобто як в Одесі відповідаємо питанням на запитання. Тому API Telegram у нашому коді фігурувати не буде.

ДисклеймерЗгадані в цій статті назви будь-яких державних організацій є вигаданими, а можливі збіги з назвами організацій, що реально існують, — випадковими.

Отже, ми зробимо робота, який буде нас забезпечувати розумними думками. Точно такого, як на картинці:

Будуємо Telegram-бот в Яндекс.Хмарі

Можете випробувати його у справі - ось ім'я: @SmartThoughtsBot. Звернули увагу на кнопку «Навичка Аліси»? Це тому, що бот є своєрідним «компаньйоном» для однойменного навику Аліси, тобто. він виконує ті ж функції, що й навик Аліси і, можливо, що вони зможуть мирно співіснувати, рекламуючи один одного. Про те, як створити навик Розумні Думки розказано у статті Аліса набуває навички. Зараз (після внесення деяких змін вже після публікації вищезгаданої статті) на смартфоні цей навик буде виглядати приблизно так:

Будуємо Telegram-бот в Яндекс.Хмарі

Створення бота

Мені хотілося б, щоб цей туторіал був корисний усім, у т.ч. і початківцям «ботобудівникам». Тому в цьому розділі я досить докладно опишу як взагалі створювати TelegramТе роботів. Для тих, кому ця інформація не потрібна, переходьте до наступних розділів.

Відкриваємо програму Telegaram, Кличемо батька всіх ботів (у них все як у людей) @BotFather - і для початку дамо йому команду /help, щоб освіжити у пам'яті, що ми можемо робити. Зараз нас цікавитиме команда / newbot.

Будуємо Telegram-бот в Яндекс.Хмарі

Оскільки описуваний тут бот вже створено, для демонстраційних цілей я створю на короткий час іншого робота (потім його видалю). Назву його DemoHabrBot. Імена (ім'я користувача) всіх телеграм-ботів повинні закінчуватися на слово морда, Наприклад: MyCoolBot або my_cool_bot - Це для роботів. Але спочатку даємо боту назву (ім'я) - а це для людей. Назва може бути будь-якою мовою, містити прогалини, не повинно закінчуватися на слово морда, і навіть має бути унікальним. У цьому прикладі я назвав цей бот Демо Хабр.

Будуємо Telegram-бот в Яндекс.Хмарі

Тепер вибираємо боту ім'я (ім'я користувача, те, що для роботів). Назвемо його DemoHabrBot. Все що стосувалося назви бота (ім'я) зовсім не відноситься до його імені ім'я користувача (або відноситься, але з точністю навпаки). Після успішного створення унікального імені бота, нам треба скопіювати та зберегти (в найсуворішій таємниці!) токен, показаний на скріншоті червоною стрілкою. З його допомогою ми трохи пізніше встановимо вихідний з TelegramТа вебхук на нашу Яндекс-функцію.

Будуємо Telegram-бот в Яндекс.Хмарі

А зараз дамо команду батькові всіх роботів: /mybotsі він покаже нами список всіх створених нами ботів. Давайте поки дамо спокій свіжоспечений бот Демо Хабр (він був створений щоб показати як створювати ботів, але ми ще ним сьогодні скористаємося для інших демонстраційних цілей), і розглянемо бот Розумні думки (@SmartThoughtsBot). Натискаємо у списку роботів кнопку з його ім'ям.

Будуємо Telegram-бот в Яндекс.Хмарі

Тут ми можемо налаштувати наш бот. Натиснувши кнопку Редагувати… ми перейдемо на редагування тієї чи іншої опції. Наприклад, натиснувши кнопку Редагувати ім'я ми можемо змінити назву бота, скажімо замість Розумні думки, написати Маячні Ідеї. Botpic - це аватар бота, повинен бути не менше 150 150 х точок. Опис - це короткий опис, який користувач бачить при першому запуску бота, як відповідь на запитання: Що може робити цей бот? МЕНЮ ще більш короткий опис, який передається з посиланням на бот (https://t.me/SmartThoughtsBot) або під час перегляду інформації про нього.

Будуємо Telegram-бот в Яндекс.Хмарі

Нам залишилося лише налаштувати команди. Для цього натискаємо кнопку Edit Commands. Для стандартизації користувальницької практики Telegram рекомендує завжди використовувати дві команди: /почати и / допомога, а якщо роботові необхідні налаштування - додаткову команду /settings. Наш бот простий як куля, тому налаштування йому поки що не потрібні. Прописуємо дві перші команди, які потім ми опрацюємо в коді. Тепер, якщо в полі введення користувач введе слєш (знак косої межі: /), з'явиться список команд для їхнього швидкого вибору. Все як на картинці: ліворуч - встановлюємо команди через бота-батька; праворуч ці команди вже доступні користувачам у нашому боті.

Будуємо Telegram-бот в Яндекс.Хмарі

Яндекс-функція

Тепер, коли наш бот створений, переходимо в Яндекс.Хмарастворити функцію, яка буде виконувати код нашого бота. Якщо ви ще не працювали з Яндекс.Хмарою почитайте матеріал Аліса в країні Бітрікс, а потім - Яндекс-функції розсилають пошту. Я майже впевнений, що двох цих відносно невеликих статей вам буде достатньо для базового розуміння предмета.

Отже, у консолі Яндекс.Хмари у лівому навігаційному меню вибираємо пункт Хмарні функції, а потім натискаємо кнопку Створити функцію. Присвоюємо їй ім'я, а для себе короткий опис.

Будуємо Telegram-бот в Яндекс.Хмарі

Після натискання кнопки Створити і після декількох секунд, нова функція з'явиться в списку всіх функцій. Натискаємо на її ім'я - це приведе нас на сторінку Огляд нашої функції. Тут треба включити (On) перемикач Публічна функція, щоб вона стала доступною із зовнішнього (для Яндекс.Хмари) світу, а значення полів Посилання для виклику и ідентифікатор - зберігати в глибокій таємниці від усіх, крім себе самого і Telegram'a, щоб вашу функцію не могли викликати різні аферисти.

Будуємо Telegram-бот в Яндекс.Хмарі

Тепер за допомогою лівого меню переходимо до Редактор функції. Давайте поки що відкладемо на короткий час у бік наші Розумні думки, і створимо мінімальну функцію-шаблон для перевірки працездатності нашого бота ... Втім, в даному контексті ця функція і є наш бот ... Коротше кажучи, зараз і прямо ось тут ми зробимо найпростішого бота, який буде "дзеркалити" (тобто відправляти назад ) запити користувачів. Цей шаблон можна використовувати завжди при створенні нових телеграм-ботів, щоб переконатися, що зв'язок з Telegram'ом працює нормально. Натискаємо Створити файлназиваємо його index.js, і в он-лайн Редактор коду вставляємо в цей файл наступний код:

module.exports.bot = async (event) => {
  
  const body = JSON.parse(event.body);

  const msg = {
    'method': 'sendMessage',
    'chat_id': body.message.chat.id,
    'text': body.message.text
  };

  return {
    'statusCode': 200,
    'headers': {
      'Content-Type': 'application/json'
    },
    'body': JSON.stringify(msg),
    'isBase64Encoded': false
  };
};

У консолі Яндекс.Хмари це має виглядати приблизно так:

Будуємо Telegram-бот в Яндекс.Хмарі

Далі трохи нижче вказуємо Точку входу - index.bot, Де індекс це ім'я файлу (index.js), А морда - Ім'я функції (module.exports.bot). Всі інші поля залишаємо "як є", і в правому верхньому кутку натискаємо кнопку Створити версію. Через кілька секунд цю версію функції буде створено. Незабаром після тестування вебхука, ми створимо нову версію Розумні думки.

Будуємо Telegram-бот в Яндекс.Хмарі

Об'єктне сховище

Тепер, коли у нас створено Яндекс-функція, давайте, поки ми знаходимося в консолі Яндекс.Хмари, створимо т.зв. бакет (відро, тобто. відро російською мовою, аж ніяк не букет) для зберігання файлів зображень, які будуть використовуватися в нашому боті Розумні думки. У лівому навігаційному меню вибираємо пункт Об'єкт зберігання, натискаємо кнопку Створити бакет, вигадуємо йому назву, наприклад, img-bucket, і головне, Доступ до читання об'єктів робимо публічним - інакше Telegram'у наших картинок не видно. Усі інші поля залишаємо без змін. Натискаємо кнопку Створити бакет.

Будуємо Telegram-бот в Яндекс.Хмарі

Після цього список всіх бакетів може виглядати приблизно так (якщо це ваш єдиний бакет):

Будуємо Telegram-бот в Яндекс.Хмарі

Зараз я пропоную натиснути на ім'я бакета, і всередині нього створити папку, щоб упорядкувати зберігання картинок для різних додатків. Наприклад, для телеграм-бота Розумні думки я створив папку під назвою tg-bot-smart-thoughts (Нічого, я зрозумію цей шифр). Створіть і ви якусь.

Будуємо Telegram-бот в Яндекс.Хмарі

Тепер можна натиснути на ім'я папки, зайти до неї та завантажувати файли:

Будуємо Telegram-бот в Яндекс.Хмарі

А натиснувши на ім'я файлу – отримати його URL для використання в нашому боті, і взагалі де або (але, не публікуйте цей URL без потреби, оскільки трафік з Об'єктного сховища тарифікується).

Будуємо Telegram-бот в Яндекс.Хмарі

Ось, власне, і все з Об'єктним сховищем. Тепер ви знатимете, що робити, коли побачите заклик завантажити туди файли.

Вебхук

Зараз ми встановимо вебхук - Тобто. коли бот отримає оновлення (наприклад, повідомлення від користувача), з сервера Telegram на нашу Яндекс-функцію буде надіслано запит (запросити) з даними. Ось рядок, який можна просто вставити в адресне поле браузера, а потім оновити сторінку (це треба зробити всього один раз): https://api.telegram.org/bot{bot_token}/setWebHook?url={webhook_url}
Тільки замінимо {bot_token} на токен отриманий нами від бота-батька при створенні нашого бота, а {webhook_url} - на URL нашої Яндекс-функції. Хвилинку! Але ж РоссКомЦензур забороняє провайдерам РФ обслуговувати адресу https://api.telegram.org. Так правильно. Але ви придумайте щось. Адже можна, наприклад, попросити про це свою бабусю в Україні, Ізраїлі чи Канаді — там немає жодних «роскомуцензур», і один бог знає, як люди живуть без цього. У результаті запит-відповідь при установці вебхука повинен виглядати так:

Будуємо Telegram-бот в Яндекс.Хмарі

Тестуємо. Повинно "дзеркалити".

Будуємо Telegram-бот в Яндекс.Хмарі

Так і є. Наші привітання - тепер Яндекс-функція стала Telegram-Ботом!

Розумні думки

А тепер робимо Розумні Думки. Код відкритий і лежить на GitHub. Він досить добре прокоментований, і в ньому лише сотня рядків. Читайте його як оперна діва Лібретто!

Будуємо Telegram-бот в Яндекс.Хмарі

Схиляйте проект і встановіть залежність:

git clone https://github.com/stmike/tg-bot-smart-thoughts.git
cd tg-bot-smart-thoughts
npm i

Внесіть необхідні вам зміни до файлу index.js (опціонально; можна нічого не міняти). Створіть ZIP-архів, з файлом index.js та папкою вузли_модулі усередині, наприклад, під назвою smart.zip.

Будуємо Telegram-бот в Яндекс.Хмарі

Тепер перейдіть у консолі до нашої Яндекс-функції, виберіть вкладку ZIP-архів, натисніть кнопку Вибрати файл, та завантажте наш архів smart.zip. Нарешті, у верхньому правому куті натисніть кнопку Створити версію.

Будуємо Telegram-бот в Яндекс.Хмарі

Через кілька секунд, коли функція оновиться, знову протестуємо нашого бота. Тепер він уже не «дзеркало», а постачає розумні думки!

Будуємо Telegram-бот в Яндекс.Хмарі

На сьогодні все. Інші статті йдуть. Комусь подібне читати цікаво — підписуйтесь на повідомлення про нові статті. Підписатися можна тут, або на Telegram-канал IT Туторіал Захар, або Twitter @mikezaharov.

Посилання

Код GitHub
Yandex Cloud Functions
Яндекс Об'єктне сховище
Bots: An introduction for developers
API бота Telegram

Донати

Будуємо Telegram-бот в Яндекс.Хмарі

Джерело: habr.com

Додати коментар або відгук