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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

А откуда там вообще кириллица?


Telegram: @thexvo
Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

vovvw писал(а): 10 авг 2021, 16:38 Кириллица?
попробуйте почистить и отправить небольшой лог для начала, у телеграм есть ограничение на количество символов в сообщении


Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

Вот вам функция для преобразования строки из кирилицы, чтобы можно было в телеграм отправлять.
И функция для замены пробелов.(она включена в функцию преобразования кирилицы)
При копировании будьте внимательны, чтобы не сбилась кодировка кирилицы. Если собьётся то можно руками перенабить Кирилические символы

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

:global FuncStrToTele do={
:local string; :set $string $1;
global SpaceToCode
#  table of the codes of Russian letters UTF8
:local rsimv [:toarray {"À"="D090"; "Á"="D091"; "Â"="D092"; "Ã"="D093"; "Ä"="D094"; "Å"="D095"; "Æ"="D096"; "Ç"="D097"; "È"="D098"; "É"="D099"; "Ê"="D09A"; "Ë"="D09B"; "Ì"="D09C"; "Í"="D09D"; "Î"="D09E"; "Ï"="D09F"; "Ð"="D0A0"; "Ñ"="D0A1"; "Ò"="D0A2"; "Ó"="D0A3"; "Ô"="D0A4"; "Õ"="D0A5"; "Ö"="D0A6"; "×"="D0A7"; "Ø"="D0A8"; "Ù"="D0A9"; "Ú"="D0AA"; "Û"="D0AB"; "Ü"="D0AC"; "Ý"="D0AD"; "Þ"="D0AE"; "ß"="D0AF"; "à"="D0B0"; "á"="D0B1"; "â"="D0B2"; "ã"="D0B3"; "ä"="D0B4"; "å"="D0B5"; "æ"="D0B6"; "ç"="D0B7"; "è"="D0B8"; "é"="D0B9"; "ê"="D0BA"; "ë"="D0BB"; "ì"="D0BC"; "í"="D0BD"; "î"="D0BE"; "ï"="D0BF"; "ð"="D180"; "ñ"="D181"; "ò"="D182"; "ó"="D183"; "ô"="D184"; "õ"="D185"; "ö"="D186"; "÷"="D187"; "ø"="D188"; "ù"="D189"; "ú"="D18A"; "û"="D18B"; "ü"="D18C"; "ý"="D18D"; "þ"="D18E"; "ÿ"="D18F"; "¨"="D001"; "¸"="D191"; "¹"="0023"}]


# encoding of the symbols and ?ssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}
set $StrTele [$SpaceToCode $StrTele]
:return $StrTele;
}

global SpaceToCode do={
local string ""
local char
put $1
for i from=0 to ([len $1]-1) step=1 do={
  #put $i
  set $char [pick $1 $i]
  #put $char
  if ($char=" ") do={set $char "%20"}
  set $string ($string . $char)
  #put $string
  }
return $string
}


vovvw
Сообщения: 20
Зарегистрирован: 25 янв 2021, 10:18

xvo писал(а): 10 авг 2021, 17:55 А откуда там вообще кириллица?
Вот этот скрипт от Sertik использую, он кириллицей сыплет:
viewtopic.php?f=14&t=12275
Virtue писал(а): 30 авг 2021, 23:53 попробуйте почистить и отправить небольшой лог для начала, у телеграм есть ограничение на количество символов в сообщении
Попробую.
Lurker писал(а): 31 авг 2021, 10:39 Вот вам функция для преобразования строки из кирилицы, чтобы можно было в телеграм отправлять.
И функция для замены пробелов.(она включена в функцию преобразования кирилицы)
Спасибо!
А как его правильно интегрировать в тот скрипт, что бы граблей не насобирать?


Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

А как его правильно интегрировать в тот скрипт, что бы граблей не насобирать?
В какой скрипт? тут 7 страниц, их все читать я конечно же не буду.
Но вобщем виде это выглядит так

$telegram [FuncStrToTele "строка для отправки"]
Где $telegram функция отправки строки в телеграм, которой в качестве параметра передаётся только собственно сама строка для отправки (всякие ID у меня заданы глобальными переменными)
или $telegram [SpaceToCode "Строка без кирилицы для отправки"]


vovvw
Сообщения: 20
Зарегистрирован: 25 янв 2021, 10:18

Lurker писал(а): 01 сен 2021, 15:36
А как его правильно интегрировать в тот скрипт, что бы граблей не насобирать?
В какой скрипт? тут 7 страниц, их все читать я конечно же не буду.
Но вобщем виде это выглядит так

$telegram [FuncStrToTele "строка для отправки"]
Где $telegram функция отправки строки в телеграм, которой в качестве параметра передаётся только собственно сама строка для отправки (всякие ID у меня заданы глобальными переменными)
или $telegram [SpaceToCode "Строка без кирилицы для отправки"]
Спасибо, буду пробовать.
Вот последний правленый скрипт этой темы, который пытаюсь использовать:
viewtopic.php?p=77628#p77628


Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

vovvw писал(а): 02 сен 2021, 10:27 Вот последний правленый скрипт этой темы, который пытаюсь использовать:
viewtopic.php?p=77628#p77628
Выносите часто используемые куски кода в функции.
Объявите функцию(и не забудьте задать глобальные переменные)
:global telegram do={
:global FuncStrToTele
:global bot
:global chat
set $1 [$FuncStrToTele $1]
:tool fetch url=("https://api.telegram.org/$bot/sendmessa ... at&text=$1") keep-result=no
}

И замените
tool fetch keep-result=no url="https://api.telegram.org/$botID/sendmes ... atID&text= $nameID : %0A$messages"
на
$telegram "$nameID : %0A$messages" (не уверен что так просто строка соберётся, но у вас вроде работает. если нет начние с $telegram $messages а там разберётесь как слепить несколько переменных в одну )
И короче и читаемость кода вырастает, и все преобразования уже есть.


vovvw
Сообщения: 20
Зарегистрирован: 25 янв 2021, 10:18

Lurker писал(а): 02 сен 2021, 11:38 И замените
tool fetch keep-result=no url="https://api.telegram.org/$botID/sendmes ... atID&text= $nameID : %0A$messages"
на
$telegram "$nameID : %0A$messages" (не уверен что так просто строка соберётся, но у вас вроде работает. если нет начние с $telegram $messages а там разберётесь как слепить несколько переменных в одну )
И короче и читаемость кода вырастает, и все преобразования уже есть.
Действительно вот это не работает: $telegram "$nameID : %0A$messages"
Вот собрал все вместе:

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

# Telegram notification script by Virtue
# https://forummikrotik.ru/viewtopic.php?f=14&t=12043
# tested on ROS 6.48
# updated 2021/02/18

:global telegram do={
:global FuncStrToTele
:global botID "botXXX";
:global chatID "-XXX";

set $1 [$FuncStrToTele $1]
:tool fetch url=("https://api.telegram.org/$botID/sendmessage?chat_id=$chatID&text==$1") keep-result=no
}

:global FuncStrToTele do={
:local string; :set $string $1;
global SpaceToCode
#  table of the codes of Russian letters UTF8
:local rsimv [:toarray {"А"="D090"; "Б"="D091"; "В"="D092"; "Г"="D093"; "Д"="D094"; "Е"="D095"; "Ж"="D096"; "З"="D097"; "И"="D098"; "Й"="D099"; "К"="D09A"; "Л"="D09B"; "М"="D09C"; "Н"="D09D"; "О"="D09E"; "П"="D09F"; "Р"="D0A0"; "С"="D0A1"; "Т"="D0A2"; "У"="D0A3"; "Ф"="D0A4"; "Х"="D0A5"; "Ц"="D0A6"; "Ч"="D0A7"; "Ш"="D0A8"; "Щ"="D0A9"; "Ъ"="D0AA"; "Ы"="D0AB"; "Ь"="D0AC"; "Э"="D0AD"; "Ю"="D0AE"; "Я"="D0AF"; "а"="D0B0"; "б"="D0B1"; "в"="D0B2"; "г"="D0B3"; "д"="D0B4"; "е"="D0B5"; "ж"="D0B6"; "з"="D0B7"; "и"="D0B8"; "й"="D0B9"; "к"="D0BA"; "л"="D0BB"; "м"="D0BC"; "н"="D0BD"; "о"="D0BE"; "п"="D0BF"; "р"="D180"; "с"="D181"; "т"="D182"; "у"="D183"; "ф"="D184"; "х"="D185"; "ц"="D186"; "ч"="D187"; "ш"="D188"; "щ"="D189"; "ъ"="D18A"; "ы"="D18B"; "ь"="D18C"; "э"="D18D"; "ю"="D18E"; "я"="D18F"; "Ё"="D001"; "ё"="D191"; "#"="0023"}]

# encoding of the symbols and ?ssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}
set $StrTele [$SpaceToCode $StrTele]
:return $StrTele;
}

global SpaceToCode do={
local string ""
local char
put $1
for i from=0 to ([len $1]-1) step=1 do={
  #put $i
  set $char [pick $1 $i]
  #put $char
  if ($char=" ") do={set $char "%20"}
  set $string ($string . $char)
  #put $string
  }
return $string
}

:do {
    :local nameID  [/system identity get name];
    :delay 10;
    :local timeNow [/system clock    get time];
    :local logs;
    :if ([:pick $timeNow 0 2] < 03) do={
        :local date [/system clock get date];
        :foreach h in=[/log find] do={
            :local htime [/log get $h time];
            :if (($htime ~ [:pick $date 0 6]) and ([:pick $htime 7 15] > ($timeNow - 00:01:00))) do={ :set logs ($logs, $h); }
        }
    } else={ :set logs [/log find time >= ($timeNow - 00:01:00)]; }
    :if ([:len $logs] > 0 ) do={
        :local messages;
        :local presence false;
        :foreach i in=$logs do={
            :local imessage [/log get $i message];
            :local topics   [/log get $i topics];
            :if ($imessage ~"telnet" and $imessage ~"logged in") do={} else={
                :if ($topics ~"caps" || $topics ~"wireless") do={
                    :if ($imessage ~ "[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
                        :foreach k  in=[/ip dhcp-server lease find dynamic=no disabled=no] do={
                            :local mac [/ip dhcp-server lease get $k mac-address];
                            :if ($imessage ~ "$mac") do={ :set presence true; }
                        }
                    }
                    :if (presence = false) do={
                        :local currentTime [ /log get $i time ];
                        :set messages ($messages.$currentTime." ".$imessage."%0A%0A");
                    }
                }
                :if ($topics ~"warning" || $topics ~"error" || $topics ~"critical" || $imessage ~"logged in") do={
                    :if ($imessage ~ "[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
                        :foreach k  in=[/ip dhcp-server lease find dynamic=no disabled=no] do={
                            :local mac [/ip dhcp-server lease get $k mac-address];
                            :if ($imessage ~ "$mac") do={ :set imessage ($imessage." / ".[/ip dhcp-server lease get $k comment]); }
                        }
                    }
                    :local currentTime [ /log get $i time ];
                    :set messages ($messages.$currentTime." ".$imessage."%0A%0A");
                }
            }
        }
        :if ([:len $messages] > 0 ) do={
            put ($messages);
            $telegram $messages;
      }
    }
}
Запустил в шедулере, обрезал лог до 500 строк(1000 не работало видимо режет телега), все работает и кириллица приходит в телегу, но каждую минуту прилетает одно и тоже сообщение отфильтрованного лога... не пойму где ошибка?


Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

я тоже с этого начинал. ИМХО это тупиковый путь т.к. костылей там немеряно.
Правильнее перебирать лог по ID. Вот скрипт
idd-номер цаписи с которой начинать обработку лога я объявляю её как 0 при старте микротика
TeleLogExept -функция которая проверяет надо ли отправлять такую запись в телеграм.
Обратите внимание тут ещё банит за неудачный вход по ipsec
ip firewall address-list add address=$adr list="fail2ban 248d"

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

:global telegram
:global num2id
:global idd
global TeleLogExept
local logarray
local end
local adr
local message
local time
if (idd=0) do={
  $telegram ([/log get *0 time] . " ÿ âêëþ÷èëñÿ")
  set $idd ($idd+1)
  }
:local idh [$num2id $idd]
while (true) do={
  #put "while true do"
  set logarray [log get $idh]
  set $message [log get $idh message]  
  set $time [log get $idh time]
  if ([typeof $message] != "nil") do={
    #put "typeofmessage"
    if ([$TeleLogExept "" $message] = false) do={
      #put "no tele exept"
      set $end [find $message " phase1 negotiation failed"]
      #put $end
      if ($end > 5) do={
        #put "end>5"
        set $adr [pick $message 0 $end]
        #put $adr
        #put [ip firewall address-list print as-value where address=$adr]
        #put ([ip firewall address-list print as-value where address=$adr]~"^\$")
        if ([ip firewall address-list print as-value where address=$adr]~"^\$") do={
          ip firewall address-list add address=$adr list="fail2ban 248d"
          $telegram ([pick $logarray 3] . "%0AÁàí çà ïîïûòêó íåñàíêöèîíèðîâàííîãî äîñòóïà ïî ipsec c àäðåñà " . $adr)
          } else {
          $telegram ([pick $logarray 3] . "%0AÏîïûòêà äîñòóïà ïî ipsec c çàáàíåííîãî àäðåñà " . $adr)
          }
        } else {
        put ([pick $logarray 3] . "%0A" . [tostr [pick $logarray 4]] . "%0A" . $message)
        #$telegram ([pick $logarray 3])
        #$telegram ([tostr [pick $logarray 4]])
        put [$message]
        put [$FuncStrToTele $message]
        $telegram ($time . " " . $message)
        #$telegram ([pick $logarray 3] . "%0A" . [tostr [pick $logarray 4]] . "%0A" . $message)
        }
      }
    set $idd ($idd+1)
    set $idh [$num2id $idd]} else {
    delay 10
    }
  }
Функции Если какую забыл-пишите

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

:global num2hex do={
  :local number  [:tonum $1]
  :local hexadec "0"
  :local remainder 0
  :local hexChars "0123456789ABCDEF"
  :if ($number > 0) do={:set hexadec ""}
  :while ( $number > 0 ) do={
        :set remainder ($number % 16)
        :set number (($number-$remainder) / 16)
        :set hexadec ([:pick $hexChars $remainder].$hexadec)
  } 
  :return "0x$hexadec"
}

global num2id do={
  global num2hex
  set $1 ("*" . [pick [$num2hex $1] 2 99])
  return $1
  }


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

Может пригодится:

viewtopic.php?f=14&t=11996

не понимаю, почему тут у топикастеров возникают проблемы с отправкой на Телеграмм пробелов. Мои функции спокойно пересылают пробелы без всякой дополнительной их обработки.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить