В продолжение статьи «Система наблюдения и Telegram-бот» описание того, с чего начать создание своего Telegram-бота на PowerShell. В этих статьях я не буду рассматривать процесс регистрации бота. Эту информацию достаточно легко найти как в официальной документации Telegram, так и на просторах интернета. Здесь же я буду рассматривать исключительно создание бота в контексте PowerShell.
Так как бот подразумивает некую интерактивность, для начала следует определиться, как нам получать обновления (новые события) от него. В документации описаны два варианта:
Самым простым в реализации является первый вариант, его мы и будем рассматривать, но в перспективе следует задуматься о реализации варианта номер два.
Итак мы определились, что будем использовать пуллинг, т.е. ручной запрос к серверу Telegram. В упоминаемой выше документации написано, что пулинг надо производить используя метод getUpdates. В контексте данного метода самым интересным является параметр offset
, этим параметром мы можем определить, как и в каком количестве получать обновления:
0
– получать все обновления (новые, старые, все…)-1
– получить только последнее обновление (одно!)id последнего обновления + 1
– получить только новые события и отметить их просмотренными (логично, что id последнего обновления мы должны заранее знать и, само собой, не забыть сохранить новое)Пример простого скрипта для получания массива всех обновлений бота посредством Invoke-WebRequest:
# определяем переменные $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 секунд.
Продолжение следует…