Ну что же. Я собрался с силами и решил, что пришло время второй части про Telegram-бота на Powershell. Если в первой части мы рассматривали основу: как «слушать» своего бота, то во второй приступим к его ответам.
В первой части уже была ссылка на статью данного блога, где я описывал функцию по отправке сообщения, тем не менее я повторюсь, почистим в ней код и сделаем его чуть более логичным.
Начнём с того, что за отправку сообщений отмечает метод sendMessage, его средствами мы и будем отправлять сообщения от имени бота.
Пример функции Send-TelegramMessage
:
function Send-TelegramMessage { [CmdletBinding()] param( [string]$chat_id, [string]$text, [parameter(Mandatory=$true,HelpMessage="Enter Telegram Token")] [string]$tgm_token, [parameter(Mandatory = $false)] [ValidateSet("Markdown", "HTML")] [string]$parse_mode = "Markdown", [switch]$nopreview, [switch]$silent, [int]$replyto, $reply_markup ) $parameters = @{ "chat_id" = $chat_id "text" = $text "parse_mode" = $parse_mode "disable_notification" = $silent.ToString() "disable_web_page_preview" = $nopreview.ToString() "reply_to_message_id" = $replyto } if ($reply_markup) { $parameters += $reply_markup } Invoke-WebRequest ` -Uri ("https://api.telegram.org/bot$tgm_token/sendMessage") ` -Method Post ` -ContentType "application/json;charset=utf-8" ` -Body (ConvertTo-Json -Depth 20 -Compress -InputObject $parameters) }
Простейший пример работы функции. Отправляем markdown-сообщение в чат, при этом отключая оповещения о нём
Send-TelegramMessage -chat_id <id_чата> -text 'Какой-то *форматированный* текст и ссылка для парсинга http://yandex.ru' -silent
В ответ должны увидеть что-то вроде этого:
Подробно описывать все параметры функции смысла не вижу, это всё сделано в документаци метода, ссылку на который я дал выше.
Где взять chat_id
? Ну как же? В первой части мы научились получать сообщения из чата, так вот внутри переменной $content
(если конкретнее: $content.result.message.chat.id
) мы и найдём номер чата.
Вот здесь уже начинается немного более вкусная история. Я намеренно убрал из функции выше параметр Уже вернул параметр reply_markup
обратно, чтобы не дублировать функцию дважды, речь о котором сейчас пойдёт. Он имеет сразу несколько типов, но сейчас мы разберем самый, на мой взгляд, интересный: InlineKeyboardMarkup. Это своего рода клавиатура, которая добавляется к сообщению бота.
Как написано в документации, inline_keyboard
это массив из массивов InlineKeyboardButton
. Вот так это будет выглядеть на powershell (для наглядности и удобства, массив с кнопками $buttons
я вынес за пределы основного $reply_markup
):
Пример массива из кнопок:
$buttons = @( @{ "text" = "⬅ Налево" "callback_data" = "Пойду налево" } @{ "text" = "➡ Направо" "callback_data" = "Пойду направо" } ), @( @{ "text" = "⛔ Тут постою" "callback_data" = "Останусь стоять на месте" } ) $reply_markup = @{ "reply_markup" = @{ "inline_keyboard" = $buttons } } # а пеперь отправим массив reply_markup в нашу функцию Send-TelegramMessage -chat_id <id_чата> -text '*Куда пойдёшь* от камня?' -silent -reply_markup
Этот пример хорош ещё и тем, что по нему понятно, как «строить» каркас из кнопок. Поле callback_data
это то, что мы сможем отловить в переменной $content
после нажатия на кнопку. Подробнее в описании API.
Кажется пока всё. inline_keyboard
умеет не только так, но я снова тыкаю пальцем в документацию. Основу я описал, всё остальное аналогично или очень похоже.