оповещение в телегу

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Аватара пользователя
Brook
Сообщения: 156
Зарегистрирован: 24 май 2022, 00:29

Функцию нужно сохранить в скрипт и развернуть в глобальную переменную, т.е. просто запустить.

При перезагрузке повторить или настроить запуск при старте в шедулере.
Разрешения - ftp,read,policy,write,test. У шедулера должны быть такие же права.

 teSendMessage

Код: Выделить всё


#---------------------------------------------------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]

Последний раз редактировалось Brook 14 окт 2024, 10:12, всего редактировалось 1 раз.


DmSp
Сообщения: 9
Зарегистрирован: 24 сен 2024, 14:04

Огромное спасибо за дополненный код!! :ti_pa:

Вот так вот правильно будет?
:if ([:len $1] != 0) do={

:if ($2 ~ "error") do={
:if ($2 ~ "warning") do={
:if ($2 ~ "critical") do={
# тут какой-то код, например меняем текст сообщения

И чтобы из этих двух скриптов сделать один, надо скрипт teSendMessage поместить над сриптом лога?


hap AC2 / ROS 7.15.2
Аватара пользователя
Brook
Сообщения: 156
Зарегистрирован: 24 май 2022, 00:29

Скрипт teSendMessage надо один раз запустить и поместить в шедулер. Он развернется в функцию, которая появится на вкладке Environment и будет доступна для всех скриптов.

Помещать ее в другой код не надо.

По условиям все верно.


Sertik
Сообщения: 1657
Зарегистрирован: 15 сен 2017, 09:03

Здорово ! Спасибо автору. Теперь не надо бесконечно парсить лог.

Ещё надо сделать страховку чтобы 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"}


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
DmSp
Сообщения: 9
Зарегистрирован: 24 сен 2024, 14:04

" и будет доступна для всех скриптов."
вот чуть выше писал про модульность. но у меня нет задач для остальных модулей. как сделать для одной задачи "отправка логов ошибок" всего один скрипт и не плодить сущности?
опять же писал чуть выше, ни разу не програмист и очень сложно понимаю ответы. я бы и рад сам допилить сурой код, но знаний мало. а так, один готовый скрипт копировать-вставить будет полезен всем сюда заглянувшим.
Спасибо!
P.S. а что написал Sertik ваще нифига не понял. написанное относится к обсуждаемому скрипту?


hap AC2 / ROS 7.15.2
Sertik
Сообщения: 1657
Зарегистрирован: 15 сен 2017, 09:03

а что написал Sertik ваще нифига не понял
Оооо Вау ! Мой уровень сильно вырос ... :-)


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
Brook
Сообщения: 156
Зарегистрирован: 24 май 2022, 00:29

Функцию 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]
Последний раз редактировалось Brook 14 окт 2024, 14:19, всего редактировалось 2 раза.


DmSp
Сообщения: 9
Зарегистрирован: 24 сен 2024, 14:04

Спасибо огромное!
Но не работает вся эта хрень. И так пробовал и эдак. Ну да и ладно.

Brook, вы бы сразу сказали - вот кусок красивого сырого кода, готов продать релиз вариант.
Я бы сразу ответил, что мне для дома. Я не в энтерпрайзе, где есть бабло на такое. И на форумах выкладывают рабочее и бесплатно. Этот подфорум тому доказательство. :-(


hap AC2 / ROS 7.15.2
Аватара пользователя
Brook
Сообщения: 156
Зарегистрирован: 24 май 2022, 00:29

Пардон, в коде была ошибка небольшая. Поправил.

Надеюсь эти переменные Вы заменили на свои...
:local chatID "-100000043443"
:local botToken "bot..."

Который раз убеждаюсь, что благими намерениями дорога в АД вымощена. Специально для Вас написал готовое решение - бесплатно, все-равно плохим остался. Чудны дела твои - Господи.

Да и ладно. Может кому еще пригодится, раз Вы разбираться не хотите.
Последний раз редактировалось Brook 14 окт 2024, 14:19, всего редактировалось 2 раза.


Аватара пользователя
Brook
Сообщения: 156
Зарегистрирован: 24 май 2022, 00:29

Прошу прощения у топикпастера за то, что в его теме нафлудил.


Ответить