Pull to refresh

Comments 22

не поехало, проверял на двух микротиках, первый домашний hex s, второй CHR поднятый у AWS. Тестил скрипт Notify-log, BotID\MyChatID поменял.
отправка сообщений через tool fetch проходит успешно, в чём затык?
ну если fetch проходит. должно быть все ок. вы после того как скрипт закидываете.
создаете какой то прецедент, который вам должно отправить? попробуйте подключиться с заведомо неверными логин паролем к примеру.
кавычки не те :) при вставке кода видимо заменило. сейчас исправлю.
проверьте должны быть такие и дальше по коду аналогично.
:global botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:global myChatID "YYYYYY" ;
Подскажите а как при этом решаете проблему доступа к api.telegram.org а то он вроде как заблокирован.
Ну по началу пока провайдер не научился нормально блокировать, отшибал их заглушку и все замечательно работало. Но через пол года они начали как то жестко блокать, (даже переписал скрипты под SLACK. Но не весь функционал получился нормальным) разбираться уже не стал, просто кинул FreeVpn, чисто для телеги на Mikrotik. Работает все отлично.
Если не затруднит не подскажете какой бесплатный VPN вы используете?
Ну CHR это я так понимаю VPN сервер на AWS ?).
Я не стал заморачиваться, пользую халявный.
так же пользую халявный))
AWS на год халявный, потом перерегать и залить конфиг не долго.
я слишком ленивый. :) этож через год какие то манипуляции делать надо будет. Но спасибо за инфо, надо будет посмотреть :) давно хотел познакомиться с AWS.
ИМХО использование :while ( true ) без задержки — лишняя нагрузка на ваш роутер и потеря встроенного функционала scheduler, но каждому своё.
В любом случае, если вы решили использовать этот подход — лучше не писать response на диск, учитывая что у вас там одно короткое сообщение.
:local httpResponse [:tool fetch url=$requestUrl as-value output=user]
:local content ($httpResponse->"data");
Спасибо за совет.
Заменить этот код
:tool fetch url=("https://api.telegram.org/$botID/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60") dst-path="getUpdates";
:local content [/file get [/file find name=getUpdates] contents]


На этот
:local httpResponse [:tool fetch url="https://api.telegram.org/$botID/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60" as-value output=user];
:local content ($httpResponse->"data");

я правильно понимаю, :tool fetch сохраняет на диске некий файл (флешка в роутере? изнашивается?)
поэтому правильнее использовать конструкцию local httpresponse [:tool fetch...
просто там ниже по тексту есть еще один tool fetch

я правильно понимаю, :tool fetch сохраняет на диске некий файл 

нет. tool fetch просто дергает url .

на диске некий файл (флешка в роутере? изнашивается?)

это верно

поэтому правильнее использовать конструкцию local httpresponse [:tool fetch...

да, лучше так

просто там ниже по тексту есть еще один tool fetch

ага, который дергает url для отправки сообщениея и не сохраняет никаких файлов.

Попробовал немного изменить код скрипта, в результате теперь приходят уведомления о логине на устройство и о подключении юзеров по vpn, но failure-сообщения отвалились, что я делаю не так?

код
:global lastTime
:global output
:global mtIdentity [/system identity get name];
:global botID «botXXXXXXXX:YYYYYYYYYYYYYYYYY»;
:global myChatID «ZZZZZZZZZ»;

:local LogGet [ :toarray [ /log find topics~«critical» || message~«login failure» || message~"[Ff]ailure" ] ];
:local LogGet [ :toarray [ /log find topics~«account» || message~«logged» || message~"[Ll]ogged" ] ];
:local LogGet [ :toarray [ /log find topics~«account» || message~«connected» || message~"[Cc]onnected" ] ];

:local LogtLineCount [ :len $LogGet ];
if ($LogtLineCount > 0) do={
:local currentTime "$[ /log get [ :pick $LogGet ($LogtLineCount -1) ] time ]";
:if ([:len $currentTime] = 10 ) do={
:set currentTime [ :pick $currentTime 0 10 ];
}
:set output "$currentTime — $[/log get [ :pick $LogGet ($LogtLineCount-1) ] message ]";
:if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
:set lastTime $currentTime;
:tool fetch url=(«api.telegram.org$botID/sendmessage\?chat_id=$myChatID&text=\»$mtIdentity\": $output") keep-result=no
}
}


P.S если в шедульке указать запуск каждые 5 минут и быстро залогиниться\разлогиниться, то отобразится только одно сообщение о логоне.

Вы переменной LogGet три раза подряд присваиваете разные значения. LogGet будет содержать значение, присвоенное последним. Не нашел в мануале функций для работы с массивами, поэтому придётся использовать три разные переменные — свою для каждой выборки из лога.

Согласен, но почему тогда обрабатываются вот эти две строчки?

код
:local LogGet [ :toarray [ /log find topics~«account» || message~«logged» || message~"[Ll]ogged" ] ];
:local LogGet [ :toarray [ /log find topics~«account» || message~«connected» || message~"[Cc]onnected" ] ];


P.S

починил!
:global lastTime
:global output
:global mtIdentity [/system identity get name];
:global botID «botxxxxxxxxxx:yyyyyyyyyyyyyy»;
:global myChatID «zzzzzzzzzzz»;

:local LogGet [ :toarray [ /log find topics~«system» || message~«login failure» || message~"[Ff]ailure" ] ];
:local LogGet [ :toarray [ /log find topics~«system» || message~«logged» || message~"[Ll]ogged" ] ];
:local LogGet [ :toarray [ /log find topics~«system» || message~«connected» || message~"[Cc]onnected" ] ];

:local LogtLineCount [ :len $LogGet ];
if ($LogtLineCount > 0) do={
:local currentTime "$[ /log get [ :pick $LogGet ($LogtLineCount -1) ] time ]";
:if ([:len $currentTime] = 10 ) do={
:set currentTime [ :pick $currentTime 0 10 ];
}

:set output "$currentTime — $[/log get [ :pick $LogGet ($LogtLineCount-1) ] message ]";
:if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
:set lastTime $currentTime;
:tool fetch url=(«api.telegram.org$botID/sendmessage\?chat_id=$myChatID&text=\»$mtIdentity\": $output") keep-result=no

}
}


только теперь все события с тикетом system будут лететь в телегу))
Можно добавить искомые строки logged и connected в одну переменную:
LogGet
:local LogGet [ :toarray [ /log find topics~«system» || message~«login failure» || message~«logged» || message~«connected» || message~"[Ff]ailure" ] ];

И что бы не заморачиваться с блокировками телеги можно использовать push, я использую pushover_net.
Столкнулся с проблемой, на MikroTik hAP ac lite (RB952Ui-5ac2nD-TC), при отправке боту не поддерживаемой команды, в первые 2 раза от отправляет корректный ответ, однако после этого, идёт «зацикливание» скрипта, растёт загрузка CPU, и бот начинает отправлять по 3-7 сообщений в ответ. Прошу пользователей скрипта проверить у себя, и если баг есть, я был бы вам очень благодарен, за помощь в его исправлении.

Дополнительно столкнулся с тем что бот не воспринимает команду если перед ней стоит /, если просто отправить сообщение боту, с названием скрипта, то всё ок.
Всё нашел свою ошибку, забыл убрать интервал.
Sign up to leave a comment.

Articles