Как отправить сообщение в Telegram из PowerShell

22 март 2019, Пятница
19 800
3
1 0
Уведомления, получаемые от систем мониторинга, стали неотъемлемой частью специалистов занимающихся сопровождением информационных систем. Однако, мир не стоит на месте и все чаще появляются новые способы оповещения. К традиционным средствам оповещения о состоянии информационных систем: электронная почта и SMS добавились новые средства доставки уведомлений, такие как мессенджеры. Наибольшей популярностью, для этой цели, у системных администраторов стал мессенджер Telegram. А в системах мониторинга появилась возможность настраивать интеграцию с мессенджерами, с целью оперативной рассылки уведомлений.
Но что делать если централизованной системы мониторинга нет, или в ней нет особой необходимости, а потребность получать уведомления в Telegram есть.
Ниже описан один из способов пошаговой настройки для отправки сообщений в Telegram используя PowerShell.

1. Что такое бот и как создать своего бота Telegram
Что такое бот Telegram? Боты — это специальные аккаунты в Telegram, созданные для того, чтобы автоматически обрабатывать и отправлять сообщения. Чтобы создать своего бота, необходимо: 
  • используя свой аккаунт Telegram написать специальному служебному боту @BotFather команду "/Start" или любое сообщение - в ответ придет список доступных команд.
  • отправить команду /newbot - и ввести уникальное название бота, а затем идентификатор, который обязательно должен заканчиваться символами "bot". 
Допустим наш бот будет называться UserMan.ru и иметь идентификатор UserManRu_bot.
В ответ придет уникальный token для созданного бота, который будет использоваться при отправке сообщений.
Например боту UserManRu_bot был присвоен токен: 819090298:AAGjXP6QLPMkem9t2LflIHOAiE_Q58bA43g

2. Создать группу в Telegram и получить ее идентификатор
Для получения идентификатора группы необходимо создать новую группу в Telegram (или использовать имеющуюся группу) и добавить туда созданного бота UserManRu_bot. А для получения идентификатор учетной записи следует отправить боту UserManRu_bot сообщение /Start и любое тестовое сообщение.

Затем необходимо проверить историю обращений которые были к боту, используя запрос ниже: 
https://api.telegram.org/bot<токен>/getUpdates
В случае с ботом UserManRu_bot это будет:
https://api.telegram.org/bot819090298:AAGjXP6QLPMkem9t2LflIHOAiE_Q58bA43g/getUpdates

В результате мы увидим уникальный идентификатор пользователя (наш идентификатор), он нам понадобится при отправке сообщений
А также уникальный идентификатор группы
{"ok":true,"result":[{"update_id":146972760,&nbsp;"message":{"message_id":2,"from":{"id":<b>172489755</b>,"is_bot":false,"first_name":"Test","last_name":"Test","username":"mynick","language_code":"en"},"chat":{"id":172489755,"first_name":"Test","last_name":"Test","username":"mynick","type":"private"},"date":1553259454,"text":"Test"}},{"update_id":146975361,&nbsp;"message":{"message_id":3,"from":{"id":172489755,"is_bot":false,"first_name":"Test","last_name":"Test","username":"mynick","language_code":"en"},"chat":{"id":<b>-347310642</b>,"title":"UserMan.ru","type":"group","all_members_are_administrators":true},"date":1553257968,"group_chat_created":true}}]}

Из этого набора символов в формате JSON определяем ID пользователя, который отправил сообщение "Test": 172489755
 и Id группы в которую добавили бота: -347310642

3. Сформировать строку Web запроса
Чтобы написать от имени бота пользователю и в группу telegram, необходимо 3 параметра:
  • token — Уникальный идентификатор, который был получен при создании бота
  • chat_id — уникальный идентификатор пользователя или группы. Он определяется запросом getUpdates
  • text — текст сообщения, которое необходимо направить
В итоге задача сводится к тому, чтобы выполнить следующий Web запрос:
https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat_id>&text=<text>
Например, отправка сообщения Hello в группу с идентификатором -347310642 от имени бота UserManRu_bot будет выглядеть так:
https://api.telegram.org/bot819090298:AAGjXP6QLPMkem9t2LflIHOAiE_Q58bA43g/sendMessage?chat_id=-347310642&text=Hello

Вставляем этот запрос в адресную строку браузера и переходим по ссылке. Сообщение Hello должно прийти сообщение в группу.

4. Сформировать скрипт для отправки сообщения
Чтобы сформировать и выполнить Web запрос выше, используя PowerShell, потребуется небольшой скрипт. Пример скрипта показан ниже:
$token = "819090298:AAGjXP6QLPMkem9t2LflIHOAiE_Q58bA43g"
$chat_id = "-347310642"
$text = "Hello World!"
$URI = "https://api.telegram.org/bot" + $token + "/sendMessage?chat_id=" + $chat_id + "&text=" + $text
$Request = Invoke-WebRequest -URI ($URI) 
После выполнения данного скрипта на группу придет сообщение присвоенное переменной $text.

Чтобы прислать сообщение не на группу, а конкретному пользователю в переменной $chat_id необходимо указать идентификатор пользователя.
ID чата всегда начинается со знака минус, а ID пользователя всегда без знака минус

5. Использование Proxy для отправки запроса
Если вы используете в своей сети прокси сервер или ваш провайдер запрещает доступ к telegram, то можно добавить к PowerShell командлету Invoke-WebRequest параметр -Proxy с указанием прокси сервера и порта, с которых разрешен доступ к Telegram. В этом случае скрипт будет иметь вид:
$token = "819090298:AAGjXP6QLPMkem9t2LflIHOAiE_Q58bA43g"
$chat_id = "-347310642"
$text = "Hello World!"
$URI = "https://api.telegram.org/bot" + $token + "/sendMessage?chat_id=" + $chat_id + "&text=" + $text

$Request = Invoke-WebRequest -URI ($URI) -Proxy "http://134.19.218.94:3128"
Где, 134.19.218.94:3128 - это один из примеров открытого прокси сервера.

Комментарии:
Прокомментировать
  1. Павел Сараничев 28 февраля 2021 02:31
    А как не через бота а через клиент на пк сделать? 

    текст видео картинки
  2. Zanooda 15 сентября 2022 16:27
    Я пришел к выводу, что в случае просто текстового сообщения мне проще загнать весь URI в одину шифрованную переменную, а уж к ней потом добавить текст. И токены не светятся и всё работает, но скрипт при переносе на другой комп придётся по-новой "пересобирать", но для этого у меня automation в KeePass есть.

    $URI="01000000d08c9ddf1e8116ed8ed09fef4dbba62cb5d823d7dd8c8514d0bba070b39545f4
    4303b5e4efe8cc51d5d94bea0fe2f37feb409c984830b907923d8beaa8fb7a2454ee7d3cfe18fef
    295a0f177ff6a0aa94097e03c7da6e04443d4aade5fe0d64762e1b90bc2504b04ddeefa2190bd92
    72570357c5956e43de2167210e13616e56c2b6bdf2cd802178b93641676e763ff18c0e14000000d
    1bcc90e19b853284dc7d9daf32c3b9398fb8375"
    $DecryptedURI=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System
    .Runtime.InteropServices.Marshal]::SecureStringToBSTR(($URI| ConvertTo-SecureString)))
    Invoke-WebRequest ($DecryptedURI+"Hello world!")
  3. Алексей 26 июня 2024 02:54
    так не работает же
    Invoke-WebRequest : Запрос был прерван: Не удалось создать защищенный канал SSL/TLS.
При использовании материалов ссылка на сайт UserMan.ru обязательна.
Политика конфиденциальности
Пользовательское соглашение
UserMan.ru © 2017-2024
Соцсети: VK