Содержание

Telegram-Bot на PowerShell (часть 2)

Ну что же. Я собрался с силами и решил, что пришло время второй части про 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 умеет не только так, но я снова тыкаю пальцем в документацию. Основу я описал, всё остальное аналогично или очень похоже.