scif_yar: (Default)
[personal profile] scif_yar
Набросок
Давным-давно, в 2006 году Microsoft выпустила PowerShell 1.0 для тогда еще Windows XP, Vista и 2003 сервера.
Даже сейчас PowerShell можно рассматривать только как следующий шаг после вариантов Logo, вместо где-то наверное до сих пор используемых Delphi (или чего постарше), несмотря на наличие в нем циклов, классов, функций, вызова MS GUI, интеграции с Git и так далее.

Под катом:
Как написать очередного простого бота на Powershell и заставить его работать без webhook, белых IP, выделенных серверов, развертываемых виртуалок в облаке и прочая прочая - на обычном домашнем ПК с Windows.
Зачем:
Попросили написать, после очередного вопроса "а как сделать чтобы наш мониторинг отправлял сообщения не только мне, и как это все работает". Часть кода писалась под решение "на коленке" вопроса передачи алертов в телеграм.
Ничего нового в вопросе нет, почти все написанное раньше уже было на Хабре, например в статье Телеграмм-бот для системного администратора


Вместо предисловия, можно пропустить
В 2006 году Microsoft выпустила PowerShell 1.0 для тогда еще Windows XP, Vista и 2003 сервера. В чем-то он заменил такие вещи как, cmd\bat скрипты, vb скрипты, Windows Script Host и JScript. Конечно, используется powershell сравнительно редко, столкнуться с ним можно разве что в виде PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration, PowerShell Web Access и еще десятка-другого редко используемых программ и функций. Возможно, второе дыхание у него появится с выходом WSL2, но это не точно.
Однако, у Powershell есть и три больших плюса:
- Он относительно простой, и про него есть масса литературы и примеров, и даже на русском, например Foreach — из книги PowerShell in depth про разницу () и {}
- Он идет, вместе с графическим редактором ISE, в комплекте с Windows.
- Из него легко вызываются компоненты для построения графического интерфейса

Часть 0. Подготовка.
Нам потребуется:
- ПК с Windows (у меня 10)
- Хоть какой-то выход в интернет (через NAT например)
- Для тех, у кого ограничен доступ к телеграмму - установленный и настроенный freegate, в некоторых случаях совместно с Symple DNS Cryps
- Наличие работающего клиента телеграм на телефоне

Для начала посмотрим, что у нас за powershell, запустим ISE через пуск-выполнить -
powershell ise или найдем его в установленным программах, и посмотрим версию, на выбор: выполнив get-host или $PSVersionTable
У меня 5.1 с чем-то, этого достаточно.
Затем разрешим выполнение неподписанных скриптов powershell:
Set-ExecutionPolicy Unrestricted

Если в дальнейшем зачем-то захочется добавить задачу в планировщик, то придется сделать
-ExecutionPolicy Bypass C:\Firstbot\bot_first.ps1
(считая что код лежит в C:\Firstbot\bot_first.ps1)

Создадим очередного тестового бота. Процесс описан тут, но повторюсь:
В телеграмме открываем контакты, ищем [profile] botfather, говорим ему /newbot, создадим бота Botfortest12344321, назовем его Mynext1234bot, и получим сообщение с уникальным ключем вида 1234544311:AAHy5_XffsyUiZyY3RKgoJdI3RLcfbJwWzk
Ключ берегите и не раздавайте!
Дальше можно бота настроить, например запретить добавление его в группы, но на первых шагах это не нужно.
Спросим у BotFather "/mybot" и поправим настройки, если чего-то не нравится.

Снова откроем контакты, найдем там [profile] botfortest12344321 (начинать поиск с @ обязательно), нажмем "начать" и напишем боту "Слава роботам". Бот, конечно, ничего не ответит.

Чего нужно знать, перед продолжением прочтения.
В телеграмме есть несколько типов групповых чатов (открытые, закрытые). Для данных чатов часть функций различается, в частности в открытых групповых чатах у каждого сообщения есть ID, для закрытых все сложнее.

В дальнейшем считается, что на дворе конец 2019 года, даже широкоизвестный Человек-Оркестр (администратор, юрист, программист и практически MVP) Евгений В. освоил циклы, и отличает простую переменную $Var от массива. Пояснения по синтаксису будут прямо в коде.

Часть 1. Пробуем что и как.
$mytoken = "1234544311:AAHy5_XffsyUiZyY3RKgoJdI3RLcfbJwWzk "
$TimeToSleep = 3 # опрос каждые 3 секунды плюс минус таймаут для сообщений.
$BotVersion = "B100"

Создадим класс и функцию.
class FavoritesExampleObj {
[string]$ChatID # так исторически сложилось
[string]$ChatTitle
[string]$FavNAME
[string]$FavTEXT
[string]$ReplyToMessID # тоже так исторически сложилось
[string]$MessLNK
[string]$Username
[string]$UserLastName
[string]$UserID
[string]$TimeAdd
}

function SayItNow!{
$TimeNow = Get-Date
$TimeNow.ToUniversalTime()
$MessageTime = (Get-Date 01.01.1970)+([System.TimeSpan]::fromseconds($teleg_answer.datetime + $TimeAdjust)) # unix time format
$returntext = "Now is " + $TimeNow + ", request ID time " + $MessageTime + " ID " + $teleg_answer.Message_ID + " ,gID " + $teleg_answer.UpdateId
$string_001 = "https://api.telegram.org/bot"+$mytoken+"/sendmessage?chat_id=" + $teleg_answer.chat_id +"&text="+$returntext
Invoke-WebRequest -Uri $string_001
}


А теперь вывод.
Я посмотрел код, написанный "тогда" - ну кроме того что он написан в стиле "нахрен отступы и правила именования", так еще и занимает 700 строк (ну правда с комментариями и функциями вида kiss_my_shiny_metal_ass), так что такое показывать - ну стыдобища вообще.
Причесывать же его для такого дна как хабр - откровенно лень.
И да, про временные затраты - написание текста на две страницы по образцу выше занимает примерно полтора-два часа. Потому что ссылки надо поставить, текст переписать, вот это все.
Польза же от текста на хабре отсутствует - в приват накидают сообщений про грамматику И ВСЕ.

Profile

scif_yar: (Default)
scif_yar

April 2026

S M T W T F S
   1234
567891011
121314 15161718
19202122232425
2627282930  

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 7th, 2026 05:12 am
Powered by Dreamwidth Studios