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

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

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

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

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

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

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

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

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

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

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

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

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

Тестваме. Трябва да «отразява».

Така и е. Нашите поздравления — сега Яндекс-функция стана 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.

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

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

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