Страница 14 из 16
Re: оповещение в телегу
Добавлено: 13 окт 2024, 20:12
Brook
Функцию нужно сохранить в скрипт и развернуть в глобальную переменную, т.е. просто запустить.
При перезагрузке повторить или настроить запуск при старте в шедулере.
Разрешения -
ftp,read,policy,write,test. У шедулера должны быть такие же права.
Код: Выделить всё
#---------------------------------------------------teSendMessage--------------------------------------------------------------
# Function sends a message to the recipient.
# Params for this function:
# 1. fChatID - Recipient id
# 2. fText - Message text
# 3. fReplyMarkup - Reply markup
# 4. fBotID - ID for bot - format - "botxxxxxxxxx:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
# Function return $messageID or 0 or "lengthError"
#---------------------------------------------------teSendMessage--------------------------------------------------------------
:global teSendMessage
:if (!any $teSendMessage) do={ :global teSendMessage do={
:local botID $fBotID
:local disableWebPagePreview true
:local parseMode "html"
:local tgUrl []; :local result []; :local content []
:if ([:len $fText] >= 4096) do={:return [error message="lengthError"]}
:if ([:len $fReplyMarkup] != 0) do={
:set tgUrl "https://api.telegram.org/$botID/sendmessage\?chat_id=$fChatID&text=$fText&parse_mode=$parseMode&disable_web_page_preview=$disableWebPagePreview&reply_markup=$fReplyMarkup"
}
:if ([:len $fReplyMarkup] = 0) do={
:set tgUrl "https://api.telegram.org/$botID/sendmessage\?chat_id=$fChatID&text=$fText&parse_mode=$parseMode&disable_web_page_preview=$disableWebPagePreview"
}
do {
:set content [:tool fetch ascii=yes url=$tgUrl as-value output=user]
} on-error={ :return 0 }
:if ($content->"status" = "finished") do={
:local tmpStr [:pick ($content->"data") ([:find ($content->"data") "message_id"]) ([:find ($content->"data") "_id"]+20)]
:local messageID [:pick $tmpStr ([:find $tmpStr "message_id"]+12) ([:find $tmpStr ","])]
:set result $messageID
:return $result
} else={ :return 0 }
}
}
Этот код надо тоже сохранить в скрипт и запускать при старте через шедулер.
Разрешения -
ftp,read,policy,write,test. У шедулера должны быть такие же права.
Код: Выделить всё
:global EventHandler do={
:global teSendMessage
:local oneFeed "%0D%0A"
:local logDefaultPicture "\F0\9F\93\84"
:local chatID "-100234567890"
:local botToken "botxxxxxxxxx:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
:local messageText "$logDefaultPicture <b>$1 - $2 - $3</b> $oneFeed$oneFeed$4 $oneFeed"
:if ([:len $1] != 0) do={
:if ($2 ~ "error") do={
# тут какой-то код, например меняем текст сообщения
}
:if ($2 ~ "memory") do={
# тут какой-то код, например меняем текст сообщения
}
# Вызываем функцию отправки после всех условий. Если надо отправлять только error, то перенести ее в блок :if ($2 ~ "error")
$teSendMessage fChatID=$chatID fText=$messageText fBotID=$botToken
}
:return 0
}
log/print follow-only where [$EventHandler $time $topics $buffer $message]
Re: оповещение в телегу
Добавлено: 13 окт 2024, 23:46
DmSp
Огромное спасибо за дополненный код!!
Вот так вот правильно будет?
:if ([:len $1] != 0) do={
:if ($2 ~ "error") do={
:if ($2 ~ "warning") do={
:if ($2 ~ "critical") do={
# тут какой-то код, например меняем текст сообщения
И чтобы из этих двух скриптов сделать один, надо скрипт teSendMessage поместить над сриптом лога?
Re: оповещение в телегу
Добавлено: 14 окт 2024, 09:01
Brook
Скрипт teSendMessage надо один раз запустить и поместить в шедулер. Он развернется в функцию, которая появится на вкладке Environment и будет доступна для всех скриптов.
Помещать ее в другой код не надо.
По условиям все верно.
Re: оповещение в телегу
Добавлено: 14 окт 2024, 09:31
Sertik
Здорово ! Спасибо автору. Теперь не надо бесконечно парсить лог.
Ещё надо сделать страховку чтобы EventHandler случайно себя не плодил
(я бы сделал по этой идее
https://forum.mikrotik.com/viewtopic.ph ... 4#p1009493)
и какую-нибудь команду для функции EventHandler, чтобы убить мониторинг при необходимости типа [$EventHandler kill]
(набросок художника:
:global jobID *0
:set jobID [/system script job find.....]
/log info "kill the EventHandler"
/system script job remove [find where .id=$jobID]
)
Ну и можно менять эмоджи взависимости от типа сообщений:
:if ($2~"critical") do={:set emotico "\E2\98\A0\20"}
:if ($2~"error") do={:set emotico "$emotico\E2\9D\8C\20"}
:if ($2~"warning") do={:set emotico "$emotico\E2\9A\A0\20"}
Re: оповещение в телегу
Добавлено: 14 окт 2024, 11:48
DmSp
" и будет доступна для всех скриптов."
вот чуть выше писал про модульность. но у меня нет задач для остальных модулей. как сделать для одной задачи "отправка логов ошибок" всего один скрипт и не плодить сущности?
опять же писал чуть выше, ни разу не програмист и очень сложно понимаю ответы. я бы и рад сам допилить сурой код, но знаний мало. а так, один готовый скрипт копировать-вставить будет полезен всем сюда заглянувшим.
Спасибо!
P.S. а что написал Sertik ваще нифига не понял. написанное относится к обсуждаемому скрипту?
Re: оповещение в телегу
Добавлено: 14 окт 2024, 12:03
Sertik
а что написал Sertik ваще нифига не понял
Оооо Вау ! Мой уровень сильно вырос ...

Re: оповещение в телегу
Добавлено: 14 окт 2024, 13:04
Brook
Функцию
teSendMessage можно и в начало скрипта добавить, так тоже будет работать. В остальном все индивидуально. Для каждого важны разные события.
Расписал подробнее. Дальше уже некуда. Тут не дают готовых решений, это в другом топике и за деньги.
Код: Выделить всё
#---------------------------------------------------teLogSend--------------------------------------------------------------
# Function sends the specified events to the chat or group
# Params for this function:
# 1. fLogTopic - name of topics
# 2. fLogChatID - log Chat ID
# 4. fLogName - name of log
# 5. fLogMessage - text from log message
# 6. fLogPicture - Picture for log message
#---------------------------------------------------teLogSend--------------------------------------------------------------
:global EventHandler do={
:global teSendMessage
:local oneFeed "%0D%0A"
:local logDefaultPicture "\F0\9F\93\84"
:local chatID "-103456345645643"
:local botToken "bot..."
:local messageText "$logDefaultPicture <b>$1 - $2 - $3</b> $oneFeed$oneFeed$4 $oneFeed"
:if ([:len $1] != 0) do={
:if ($2 ~ "system") do={
:local messageText "$logDefaultPicture <b>$1 - $2 - $3</b> $oneFeed$oneFeed$4 $oneFeed"
$teSendMessage fChatID=$chatID fText=$messageText fBotID=$botToken
:return 0
}
:if ($2 ~ "warning") do={
:local messageText "\E2\9A\A0 <b>$1 - $2 - $3</b> $oneFeed$oneFeed$4 $oneFeed"
$teSendMessage fChatID=$chatID fText=$messageText fBotID=$botToken
:return 0
}
:if ($2 ~ "error") do={
:local messageText "\E2\9D\97 <b>$1 - $2 - $3</b> $oneFeed$oneFeed$4 $oneFeed"
$teSendMessage fChatID=$chatID fText=$messageText fBotID=$botToken
:return 0
}
:if ($2 ~ "critical") do={
:local messageText "\E2\9B\94 <b>$1 - $2 - $3</b> $oneFeed$oneFeed$4 $oneFeed"
$teSendMessage fChatID=$chatID fText=$messageText fBotID=$botToken
:return 0
}
# $teSendMessage fChatID=$chatID fText=$messageText
}
:return 0
}
log/print follow-only where [$EventHandler $time $topics $buffer $message]
Re: оповещение в телегу
Добавлено: 14 окт 2024, 13:44
DmSp
Спасибо огромное!
Но не работает вся эта хрень. И так пробовал и эдак. Ну да и ладно.
Brook, вы бы сразу сказали - вот кусок красивого сырого кода, готов продать релиз вариант.
Я бы сразу ответил, что мне для дома. Я не в энтерпрайзе, где есть бабло на такое. И на форумах выкладывают рабочее и бесплатно. Этот подфорум тому доказательство.

Re: оповещение в телегу
Добавлено: 14 окт 2024, 14:13
Brook
Пардон, в коде была ошибка небольшая. Поправил.
Надеюсь эти переменные Вы заменили на свои...
:local chatID "-100000043443"
:local botToken "bot..."
Который раз убеждаюсь, что благими намерениями дорога в АД вымощена. Специально для Вас написал готовое решение - бесплатно, все-равно плохим остался. Чудны дела твои - Господи.
Да и ладно. Может кому еще пригодится, раз Вы разбираться не хотите.
Re: оповещение в телегу
Добавлено: 14 окт 2024, 14:15
Brook
Прошу прощения у топикпастера за то, что в его теме нафлудил.