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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сега, когато нашият бот е създаден, преминаваме в Яндекс.Облако, за да създадете функция, която ще изпълнява кода на нашия бот. Ако не сте работили с 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). Всички останали полета оставяме 'както са', и в горния десен ъгъл натискаме бутона Създайте версия. След няколко секунди тази версия на функцията ще бъде създадена. Скоро, след теста на уебхука, ще създадем нова версия — Умни Мисли.

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

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

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

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

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

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

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

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

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

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

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

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

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

Уебхук

Сега ще настроим уебхука — т.е. когато ботът получи обновление (например, съобщение от потребител), от сървъра Телеграм в нашата Яндекс-функция ще бъде изпратено запитване (request) с данни. Ето реда, който можете просто да поставите в адресното поле на браузъра и след това да обновите страницата (това трябва да се направи само веднъж): https://api.telegram.org/bot{bot_token}/setWebHook?url={webhook_url}
Само ще заменим {bot_token} с токена, получен от нас от бота-родител при създаването на нашия бот, а {webhook_url} — с URL нашата функции на Yandex. Минутка! Но нали РусКомЦензур забранява на доставчиците в РСФ да обслужват адреса https://api.telegram.org. Да, вярно. Но измислете нещо. Все пак можете да помолите баба си в Украйна, Израел или Канада — там няма никакви «росскомцензур», и само Бог знае как живеят хората без това. В крайна сметка, запитването-отговор при настройка на уебхука трябва да изглежда така:

Създаваме 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-бот в Яндекс.Облаке

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

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

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

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

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

Връзки

Код на GitHub
Yandex Cloud Functions
Yandex Object Storage
Bots: An introduction for developers
Telegram Bot API

Донати

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

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

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