Ehitus Telegram-bot Yandex.Cloudis

Ehitus Telegram-bot Yandex.Cloudis

Сегодня из подручных материалов мы соберём в Yandex.Cloudist Telegram-бот kasutades Yandex Cloud Functions (või Yandexi funktsioonid — для краткости) и Yandex Object Storage (või Объектное хранилище — для ясности). Код будет на Node.js. Однако, имеется одно пикантное обстоятельство — некая организация под названием, скажем так, РоссКомЦензур (цензура запрещена статьёй 29 Конституции РФ), не позволяет интернет-провайдерам России передавать запросы в Telegram API по адресу: https://api.telegram.org/. Ну мы и не будем — нет так нет. Ведь в нашем саквояже имеются т.н. вебхуки — с их помощью мы не делаем запросы на конкретный адрес, а всего лишь шлём свой запрос в качестве ответа на любой запрос к нам. То есть, как в Одессе — отвечаем вопросом на вопрос. Поэтому Telegram API в нашем коде фигурировать не будет.

Vastutusest loobumineУпомянутые в данной статье названия каких-либо государственных организаций являются вымышленными, а возможные совпадения с названиями реально существующих организаций — случайными.

Итак, мы сделаем бота, который будет нас снабжать умными мыслями. Точно такого, как на картинке:

Ehitus Telegram-bot Yandex.Cloudis

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

Ehitus Telegram-bot Yandex.Cloudis

Создание бота

Мне бы хотелось, чтобы этот туториал был полезен всем, в т.ч. и начинающим «ботостроителям». Поэтому в этом разделе я довольно подробно опишу как вообще создавать в Telegram‘е ботов. Для тех кому эта информация не требуются — переходите к следующим разделам.

Открываем приложение Telegaram, зовём отца всех ботов (у них всё как у людей) — @BotFather — и для начала дадим ему команду /help, чтобы освежить в памяти, что мы можем делать. Сейчас нас будет интересовать команда /newbot.

Ehitus Telegram-bot Yandex.Cloudis

Поскольку описываемый здесь бот уже создан, для демонстрационных целей я создам на короткое время другого бота (потом его удалю). Назову его DemoHabrBot. Имена (username) всех телеграм-ботов должны заканчиваться на слово bot, näiteks: MyCoolBot või my_cool_bot — это для ботов. Но сначала даём боту название (name) — а это для людей. Название может быть на любом языке, содержать пробелы, не обязано заканчиваться на слово bot, и даже не обязано быть уникальным. В данном примере я назвал этот бот Демо Хабр.

Ehitus Telegram-bot Yandex.Cloudis

Теперь выбираем боту имя (username, то, которое для ботов). Назовём его DemoHabrBot. Всё что относилось к названию бота (name) совсем не относится к его имени — username (или относится, но с точностью до наоборот). После успешного создания уникального имени бота, нам надо скопировать и сохранить (в строжайшей тайне!) токен, показанный на скриншоте красной стрелкой. С его помощью мы чуть позже установим исходящий из Telegram‘а вебхук на нашу Yandexi funktsiooni.

Ehitus Telegram-bot Yandex.Cloudis

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

Ehitus Telegram-bot Yandex.Cloudis

Здесь мы можем настроить нашего бота. Нажав кнопку Edit… мы перейдём на редактирование той или иной опции. Например, нажав на кнопку Edit Name мы можем изменить название бота, скажем вместо Умные Мысли, написать Бредовые Идеи. Botpic — это аватар бота, должен быть не менее 150 x 150 px. Kirjeldus — это краткое описание, который пользователь видит при первом запуске бота, в качестве ответа на вопрос: Что может делать этот бот? Teave — ещё более краткое описание, которое передаётся с ссылкой на бот (https://t.me/SmartThoughtsBot) или при просмотре информации о нём.

Ehitus Telegram-bot Yandex.Cloudis

Нам осталось только настроить команды. Для этого нажимаем кнопку Edit Commands. Для стандартизации пользовательской практики Telegram рекомендует всегда использовать две команды: /start ja /help, а если боту необходимы настройки — дополнительную команду /settings. Наш бот прост как шар, поэтому настройки ему пока не нужны. Прописываем две первых команды, которые потом мы обработаем в коде. Теперь, если в поле ввода пользователь введёт слеш (знак косой черты: /), появится список команд для их быстрого выбора. Всё как на картинке: слева — устанавливаем команды через бота-отца; справа эти команды уже доступны пользователям в нашем боте.

Ehitus Telegram-bot Yandex.Cloudis

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

Теперь, когда наш бот создан, переходим в Yandex.Cloud, чтобы создать функцию, которая будет выполнять код нашего бота. Если вы ещё не работали с Яндекс.Облаком почитайте материал Aliisa Bitrixi maal, ja seejärel — Yandexi funktsioonid saadavad e-kirju. Я почти уверен, что двух этих относительно небольших статей вам вполне будет достаточно для базового понимания предмета.

Итак, в консоли Яндекс.Облака в левом навигационном меню выбираем пункт Cloud Functions, и затем нажимаем кнопку Loo funktsioon. Присваиваем ей имя, а для себя — краткое описание.

Ehitus Telegram-bot Yandex.Cloudis

Pärast nuppu vajutamist Loo и прошествии пары секунд, новая функция появится в списке всех функций. Нажимаем на её имя — это приведёт нас на страницу Ülevaade нашей функции. Здесь надо включить (Käimas) переключатель Avalik funktsioon, чтобы она стала доступна из внешнего (для Яндекс.Облака) мира, а значение полей Kutse link ja Идентификатор — хранить в глубокой тайне от всех кроме себя самого и Telegram’a, чтобы вашу функцию не могли вызывать различные аферисты.

Ehitus Telegram-bot Yandex.Cloudis

Теперь с помощью левого меню переходим в Redaktor функции. Давайте пока отложим на короткое время в сторону наши Умные Мысли, и создадим минимальную функцию-шаблон для проверки работоспособности нашего бота… Впрочем, в данном контексте эта функция и есть наш бот… Короче говоря, сейчас и прямо вот здесь мы сделаем простейшего бота, который будет «зеркалить» (т.е. отправлять назад) запросы пользователей. Этот шаблон можно использовать всегда при создании новых телеграм-ботов, чтобы убедиться, что связь с 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
  };
};

В консоли Яндекс.Облака это должно выглядеть примерно так:

Ehitus Telegram-bot Yandex.Cloudis

Далее чуть ниже указываем Точку входаindex.bot, kus index это имя файла (index.js), and bot — имя функции (module.exports.bot). Все остальные поля оставляем «как есть», и в правом верхнем углу нажимаем кнопку Loo versioon. Через несколько секунд эта версия функции будет создана. В скором времени, после тестирования вебхука, мы создадим новую версию — Умные Мысли.

Ehitus Telegram-bot Yandex.Cloudis

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

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

Ehitus Telegram-bot Yandex.Cloudis

После этого список всех бакетов может выглядеть примерно так (если это ваш единственный бакет):

Ehitus Telegram-bot Yandex.Cloudis

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

Ehitus Telegram-bot Yandex.Cloudis

Теперь можно нажать на имя папки, зайти в неё и загружать файлы:

Ehitus Telegram-bot Yandex.Cloudis

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

Ehitus Telegram-bot Yandex.Cloudis

Вот, собственно, и всё с Объектным хранилищем. Теперь вы будете знать, что делать, когда увидите призыв загрузить туда файлы.

Вебхук

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

Ehitus Telegram-bot Yandex.Cloudis

Тестируем. Должно «зеркалить».

Ehitus Telegram-bot Yandex.Cloudis

Так и есть. Наши поздравления — теперь Яндекс-функция oli Telegram-ботом!

Умные Мысли

А теперь делаем Умные Мысли. Код открыт и и лежит на GitHub. Он довольно хорошо прокомментирован, и в нём всего сотня строк. Читайте его как оперная дива либретто!

Ehitus Telegram-bot Yandex.Cloudis

Склонируйте проект и установите зависимости:

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.

Ehitus Telegram-bot Yandex.Cloudis

Теперь перейдите в консоле к нашей Yandexi funktsioonid, выберите вкладку ZIP-arhiv, нажмите кнопку Выбрать файл, и загрузите наш архив smart.zip. Наконец, в правом верхнем углу нажмите кнопку Loo versioon.

Ehitus Telegram-bot Yandex.Cloudis

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

Ehitus Telegram-bot Yandex.Cloudis

На сегодня всё. Другие статьи следуют. Кому подобное читать интересно — подписывайтесь на уведомления о новых статьях. Подписаться можно здесь, или на Telegram-канал IT Туториал Захар, või Twitter @mikezaharov.

Lingid

Kood GitHubis
Yandex Cloud Functions
Yandex Object Storage
Bots: An introduction for developers
Telegram Bot API

Toetused

Ehitus Telegram-bot Yandex.Cloudis

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster