Содержание

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

В продолжение статьи «Система наблюдения и Telegram-бот» описание того, с чего начать создание своего Telegram-бота на PowerShell. В этих статьях я не буду рассматривать процесс регистрации бота. Эту информацию достаточно легко найти как в официальной документации Telegram, так и на просторах интернета. Здесь же я буду рассматривать исключительно создание бота в контексте PowerShell.

С чего начать?

Так как бот подразумивает некую интерактивность, для начала следует определиться, как нам получать обновления (новые события) от него. В документации описаны два варианта:

  1. POLLING – регулярный опрос сервера Telegram на появление новых событий
    1. Прост в реализации
    2. Не требует дополнительной настройки фаервола
    3. Не требует наличия статического IP-адреса (или настройки динамического DNS)
    4. Маленький, но всё же «лишний» трафик из-за регулярных запросов (в дачных условиях может быть критичным)
    5. Менее эффективный и быстрый
  2. WEBHOOKS – подразумивает наличие некой службы с Вашей стороны, которая будет слушать и принимать информацию о новых событиях, посылаемых сервером Telegram в Вашу сторону
    1. Эффективен и практически не потребляет трафика
    2. Сложнее в реализации
    3. Требует настройки фаервола
    4. Требует статический IP-адрес

Самым простым в реализации является первый вариант, его мы и будем рассматривать, но в перспективе следует задуматься о реализации варианта номер два.

Опрашиваем бота

Итак мы определились, что будем использовать пуллинг, т.е. ручной запрос к серверу Telegram. В упоминаемой выше документации написано, что пулинг надо производить используя метод getUpdates. В контексте данного метода самым интересным является параметр offset, этим параметром мы можем определить, как и в каком количестве получать обновления:

Пример простого скрипта для получания массива всех обновлений бота посредством Invoke-WebRequest:

Get-TelegramBotUpdates.ps1
# определяем переменные
$token = <ваш_токен> # указываем свой токен
$ChatTimeout = 3 # таймаут в секундах
$allowed_updates = @("message","channel_post","inline_query","chosen_inline_result","callback_query") # ограничиваем тип получаемых событий
$allowed_updates = ConvertTo-Json -InputObject $allowed_updates # конвертируем тип обновлений в json
$UpdateId = 0 # какие события получаем? 0 - все, -1 только последнее, lastid+1 - получить новые и отметить их просмотренными
 
# формируем URL
$URL = "https://api.telegram.org/bot$token/getUpdates?offset=$UpdateId&allowed_updates=$allowed_updates&timeout=$ChatTimeout"
 
# делаем запрос и преобразуем ответ из json
$Request = Invoke-WebRequest -Uri $URL -Method Get
$content = ConvertFrom-Json $Request.content
 
# смотрим, что получили, но из содержания массива $content "вытащим" только текст сообщений
$content.result.message.text

Разумеется, если мы хотим получить «говорящего» бота, нужно регулярно проверять обновления, чтобы вовремя реагировать на них.

Создаём задание в планировщике

Итак, у нас есть бот, мы умеем «читать» сообщения из чата с ним, теперь нам осталось как-то это автоматизировать. Проще всего запускать наш скрипт заданием из планировщика Windows.

Правда здесь есть одна проблема: планировщик Windows не умеет запускать задачи чаще чем раз в пять минут, а это, согласитесь, достаточно долгая пауза для проверки чата. :-) Но можно обойти это ограничение, просто создав несколько триггеров с необходимым интервалом между ними. Сделаем такую задачу в планировщике (не забудьте изменить путь к скрипту):

# создаём массив из триггеров
$triggers = @()
$triggers += New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([System.TimeSpan]::MaxValue) -At 12:00:00 -Once
$triggers += New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([System.TimeSpan]::MaxValue) -At 12:00:10 -Once
$triggers += New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([System.TimeSpan]::MaxValue) -At 12:00:20 -Once
$triggers += New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([System.TimeSpan]::MaxValue) -At 12:00:30 -Once
$triggers += New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([System.TimeSpan]::MaxValue) -At 12:00:40 -Once
$triggers += New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([System.TimeSpan]::MaxValue) -At 12:00:50 -Once
# определяем действие (запуск нашего скрипта)
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-File ".\Get-TelegramBotUpdates.ps1"' # путь изменить на свой
$settings = New-ScheduledTaskSettingsSet
# формируем задачу...
$task = New-ScheduledTask -Action $action -Trigger $triggers -Settings $settings
# ...и создаём её в планировщике
Register-ScheduledTask 'TelegramBot' -InputObject $task

Вот и всё. Теперь мы проверяем обновления нашего чата каждые 10 секунд.

Продолжение следует…