Създаваме Telegram-бот в Яндекс.Облака

Създаваме Telegram-бот в Яндекс.Облака

Днес с подръчни материали ще създадем в Яндекс.Облаке Телеграм-бот с използването на Yandex Cloud Functions (или Яндекс-функции — за краткост) и Yandex Object Storage (или Обектно хранилище — за яснота). Кодът ще бъде на Node.js. Но има едно пикантно обстоятелство — една организация, наречена, да речем, РосКомЦензур (цензурата е забранена от член 29 на Конституцията на РФ), не позволява на интернет-провайдите в Русия да предават заявки до Telegram API на адрес: https://api.telegram.org/. Е, няма да го направим — ако не, така да бъде. Все пак в нашата чанта се съдържат т.н. уебхукове — с тях не изпращаме заявки на конкретен адрес, а само изпращаме нашия отговор в ответ на всяка заявка към нас. Тоест, както в Одеса — отговаряме на въпрос с въпрос. Затова Telegram API в нашия код няма да фигурира.

ДисклеймерСпоменатите в тази статия имена на каквито и да е държавни организации са измислени, а всяко съвпадение с имена на реални организации е случайно.

И така, ще направим бот, който ще ни снабдява с умни мисли. Точно като на картинката:

Създаваме Telegram-бот в Яндекс.Облака

Можете да го изпробвате в действие — ето името: @SmartThoughtsBot. Забелязахте бутона «Умение на Алисa»? Это потому, что бот является своеобразным «компаньоном» для одноименного умението на Алиса, т.е. той изпълнява същите функции, като умението на Алиса и, възможно е, те ще могат мирно да съществуват, рекламирайки едно друго. За това как да създадете умение Умни Мисли е разказано в статията Алиса придобива умение. Сега (след някои изменения, направени вече след публикуването на споменатата статия) на смартфона това умение ще изглежда приблизително така:

Създаваме Telegram-бот в Яндекс.Облака

Създаване на бот

Бих искал този туториал да бъде полезен на всички, включително и на начинаещи „ботостроители“. Затова в тази част ще опиша доста подробно как изобщо да се създават в Telegram‘е ботове. За онези, на които тази информация не им е нужна — преминете към следващите раздели.

Отваряме приложението Telegaram, призоваваме баща на всички ботове (при тях всичко е като при хората) — @BotFather — и за начало му даваме команда \/help, за да освежим паметта какво можем да правим. Сега ще ни интересува командата /newbot.

Създаваме Telegram-бот в Яндекс.Облака

Тъй като описваният тук бот вече е създаден, за демонстрационни цели ще създам за кратко друго ботче (после ще го изтрия). Ще го нарека DemoHabrBot. Имената (username) на всички телеграм-ботове трябва да завършват със словото bot, например: MyCoolBot или my_cool_bot — това е за ботовете. Но първо даваме на бота име (име) — и това е за хората. Името може да бъде на какъвто и да е език, да съдържа пробели, не е задължително да завършва на дума bot, и дори не е нужно да е уникално. В този пример нарекох този бот Демо Хабр.

Създаваме Telegram-бот в Яндекс.Облака

Сега избираме име за бота (username, онова, което е за ботове). Нека го наречем DemoHabrBot. Всичко, което се отнася до името на бота (име) съвсем не се отнася до неговото име — username (или се отнася, но с точност до обратно). След успешно създаване на уникално име на бота, трябва да копираме и запазим (в строга тайна!) токена, показан на скриншота с червената стрелка. С негова помощ по-късно ще установим изходяща Telegram‘а уебхук на нашата Яндекс-функция.

Създаваме Telegram-бот в Яндекс.Облака

А сега ще дадем команда на всички ботове: /mybots, и той ще ни покаже списък на всичките създадени от нас ботове. Нека засега оставим новосъздадения бот Демо Хабр (той беше създаден, за да демонстрира как се създават ботове, но още ще го използваме за други демонстрации), и да разгледаме бота Умни Мисли (@SmartThoughtsBot). Натискаме в списъка на ботовете бутона с неговото име.

Създаваме Telegram-бот в Яндекс.Облака

Тук можем да настроим нашия бот. Като натиснем бутона Edit… , ще преминем към редактиране на една или друга опция. Например, като натиснем бутона Edit Name , можем да променим името на бота, да речем вместо Умни Мисли, да напишем Бредови Идеи. Botpic — това е аватар на бота, трябва да е не по-малко от 150 x 150 px. Описание — това е кратко описание, което потребителят вижда при първото стартиране на бота, в отговор на въпроса: Какво може да прави този бот? За — дори по-кратко описание, което се предава с линк към бота (https://t.me/SmartThoughtsBot) или при преглед на информацията за него.

Създаваме Telegram-бот в Яндекс.Облака

Остава ни само да настроим командите. За целта натискаме бутона Edit Commands. За стандартизиране на потребителската практика Telegram препоръчва винаги да използвате две команди: /start и /help, а ако на бота са необходими настройки — допълнителна команда /settings. Нашият бот е прост като топка, затова в момента не му трябват настройки. Записваме първите две команди, които по-късно ще обработим в кода. Сега, ако в полето за въвеждане потребителят въведе наклонена черта (символа: /), ще се появи списък с команди за бърз избор. Всичко е като на картинката: отляво — задаваме командите чрез бота-баща; вдясно тези команди вече са достъпни за потребителите в нашия бот.

Създаваме Telegram-бот в Яндекс.Облака

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

Сега, когато нашият бот е създаден, преминаваме в Yandex.Cloud, за да създадете функция, която ще изпълнява кода на нашия бот. Ако все още не сте работили с Yandex.Cloud , прочетете материала Алиса в страната на Битрикс, а след това — Yandex функциите изпращат имейли. Почти съм сигурен, че тези две сравнително кратки статии ще бъдат напълно достатъчни за основно разбиране на темата.

Така че, в консолата на Yandex.Cloud , в лявото навигационно меню изберете пункта Cloud Functions, и след това натиснете бутона Създай функция. Присвояваме й име, а за себе си — кратко описание.

Създаваме Telegram-бот в Яндекс.Облака

След натискане на бутона Създайте И след няколко секунди, новата функция ще се появи в списъка с всички функции. Натискаме името й — това ще ни отведе на страницата Преглед на нашата функция. Тук трябва да включим (On) превключвателя Публична функция, за да стане достъпна от външния (за Yandex.Cloud) свят, а стойността на полетата Ссылка для вызова и Идентификатор — трябва да се съхранява в дълбока тайна от всички, освен от вас самите и Telegram, за да не може вашата функция да бъде извиквана от различни измамници.

Създаваме Telegram-бот в Яндекс.Облака

Сега с помощта на лявото меню преминаваме към Редактор функции. Нека за момента отклоняем нашите Умни Мисли, и да създадем минимална функция-шаблон за проверка на работоспособността на нашия бот… Всъщност, в този контекст тази функция е нашия бот… С една дума, в момента, точно тук, ще направим най-простия бот, който ще „отражава“ (т.е. ще изпраща обратно) заявките на потребителите. Този шаблон може да се използва винаги при създаването на нови 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
  };
};

В консолата на Yandex.Cloud това трябва да изглежда приблизително така:

Създаваме Telegram-бот в Яндекс.Облака

След това малко по-долу указваме Точка на входаindex.bot, където index това е името на файла (index.js), а bot — името на функцията (module.exports.bot). Всички останали полета оставяме „както са“, и в горния десен ъгъл натискаме бутона Създай версия. След няколко секунди тази версия на функцията ще бъде създадена. В скоро време, след тестването на webhook, ще създадем нова версия — Умни Мисли.

Създаваме Telegram-бот в Яндекс.Облака

Обектно хранилище

Сега, когато имаме създадена Яндекс-функция, нека, докато сме в консолата Yandex.Cloud, да създадем т.н. bucket (bucket, т.е. контейнер на български, определено не букета) за съхранение на файлове с изображения, които ще се използват в нашия бот Умни Мисли. В лявото навигационно меню изберете опцията Object Storage, натискаме бутона Създаване на контейнер, измисляме име, например, img-container, и, най-важното, Достъп за четене на обектите правим публичен — иначе Telegram няма да вижда нашите картинки. Всички останали полета оставяме без промяна. Натискаме бутона Създаване на контейнер.

Създаваме Telegram-бот в Яндекс.Облака

След това списъкът с всички контейнери може да изглежда горе-долу така (ако това е единственият ви контейнер):

Създаваме Telegram-бот в Яндекс.Облака

Сега предлагам да натиснете върху името на контейнера и в него да създадете папка, за да подредите съхранението на изображенията за различните си приложения. Например, за Telegram бота Умни Мисли създадох папка с наименованието tg-bot-smart-thoughts (нищо, разбирам този шифър). Създайте и вие нещо.

Създаваме Telegram-бот в Яндекс.Облака

Сега можете да натиснете върху името на папката, да влезете в нея и да качвате файлове:

Създаваме Telegram-бот в Яндекс.Облака

А като натиснете на името на файла — да получите него URL за използване в нашия бот, и въобще — където и да е (но, не публикувайте този URL без нужда, тъй като трафикът от Обектното хранилище се таксува).

Създаваме Telegram-бот в Яндекс.Облака

Ето, всъщност, и всичко със Обектното хранилище. Сега ще знаете какво да правите, когато видите призив да качите там файлове.

Уебхук

Сега ще настроим уебхук — т.е. когато ботът получи обновление (например, съобщение от потребителя), от сървъра Telegram в нашия Яндекс-функция ще бъде изпратено запитване (request) с данни. Ето реда, който можете просто да поставите в адресното поле на браузъра, и след това да обновите страницата (това трябва да се направи само веднъж): 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 и папката node_modules вътре, например, със заглавие smart.zip.

Създаваме Telegram-бот в Яндекс.Облака

Сега отидете в конзолата на нашата Яндекс-функции, изберете таба ZIP-архив, натиснете бутона Избиране на файл, и качете нашия архив smart.zip. Накрая, в горния десен ъгъл натиснете бутона Създай версия.

Създаваме Telegram-бот в Яндекс.Облака

След няколко секунди, когато функцията се обнови, ще тестваме отново нашия бот. Сега той вече не "огледа", а предоставя умни мисли!

Създаваме Telegram-бот в Яндекс.Облака

Дотук за днес. Други статии следват. На кого му е интересно да чете подобни неща — абонирайте се за известия за нови статии. Можете да се абонирате тук или в Telegram-канала IT Туториал Захар, или Twitter @mikezaharov.

Връзки

Код в GitHub
Yandex Cloud Functions
Yandex Object Storage
Bots: Въведение за разработчици
Telegram Bot API

Донати

Създаваме Telegram-бот в Яндекс.Облака

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster