
Днес ще съберем в Telegram-бот с използване на (или функции на Yandex — за краткост) и (или Обектно хранилище — за яснота). Кодът ще бъде на Node.js. Въпреки това, има едно пикантно обстоятелство — някаква организация, наречена, да кажем, РусКомЦензур (цензурата е забранена от член 29 на Конституцията на Руската федерация), не позволява на интернет доставчиците в Русия да предават заявки към Telegram API на адрес: https://api.telegram.org/. Е, и няма значение — няма как, няма. В нашето саквояжче имаме т.н. вебхукове — с тях не правим заявки на конкретен адрес, а всъщност изпращаме нашата заявка като отговор на всяка заявка към нас. Тоест, както в Одеса — отговаряме на въпрос с въпрос. Затова Telegram API в нашия код няма да фигурира.
ДисклеймерСпоменатите в тази статия имена на държавни организации са измислени, а всякакви съвпадения с наименования на реално съществуващи организации са случайни.
И така, ще направим бот, който ще ни снабдява с умни мисли. Точно такъв, какъвто е на изображението:
Можете да го изпробвате — ето името: @SmartThoughtsBot. Забелязахте ли бутона «Умение на Алиса»? Это потому, что бот является своеобразным «компаньоном» для одноименного умението на Алиса, т.е. той изпълнява същите функции, които има умението на Алиса , и е възможно те да могат мирно да съществуват, рекламирайки се взаимно. За това как да създадете умението Умни Мисли е разказано в статията . Сега (след направени промени след публикуването на горепосочената статия) на смартфона това умение ще изглежда приблизително така:
Създаване на бот
Бих искал този туториал да бъде полезен за всички, включително за начинаещи „ботостроители“. Затова в този раздел ще опиша доста подробно как изобщо се създават в Телеграмботове. За тези, на които тази информация не е необходима — преминете към следващите раздели.
Отваряме приложението Telegram, извикваме бащата на всички ботове (при тях всичко е като при хората) — @BotFather — и за начало му даваме команда /help, за да освежим паметта си какво можем да правим. Сега ще се заинтересуваме от командата /newbot.

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

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

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

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

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

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

След натискване на бутона Създаване И след като изминат няколко секунди, новата функция ще се появи в списъка с всички функции. Натискаме името й — това ще ни отведе на страницата Преглед наша функция. Тук трябва да включим (On) бутона Публична функция, за да стане достъпна от външния (за Yandex.Cloud) свят, а стойността на полетата Линк за извикване и Идентификатор — да се държи в дълбока тайна от всички, освен от себе си и 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 това трябва да изглежда приблизително така:

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

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

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

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

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

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

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

Тествайте. Трябва да «зеркалите».

Така и е. Нашите поздравления — сега Яндекс-функция стана Телеграм-бот!
Умни Мисли
А сега правим Умни Мисли. Кодът е отворен и се намира на . Той е доста добре коментиран и има само сто реда. Четете го като оперна дива либрето!

Клонирайте проекта и инсталирайте зависимостите:
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.

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

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

Дотук за днес. Други статии предстоят. За тези, на които им е интересно да четат подобно — абонирайте се за уведомления за нови статии. Можете да се абонирате тук, или на Телеграм-канал , или Twitter .
Връзки
Донати
Източник: habr.com
