JSON парсер JParse для Mikrotik

Автоматизация при помощи встроенного скриптового языка и RouterOS API
Chupakabra303
Сообщения: 31
Зарегистрирован: 24 янв 2017, 11:57

JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 »

Делюсь JSON парсером на скриптовом языке Mikrotik. И примером Telegram bot-а, понимающего команды. Вообще, JSON чудно парсится в ассоциативный массив, что и было проделано. Как использовать: смотрите пример бота. http://www.embest.ru/mikrotik/json-parser-script

Изображение
Последний раз редактировалось Chupakabra303 27 июн 2018, 16:47, всего редактировалось 3 раза.
Sertik
Сообщения: 6
Зарегистрирован: 15 мар 2018, 18:07

Re: JSON парсер JParse для Mikrotik

Сообщение Sertik »

Chupakabra303, простите, сломал себе голову, но так и не понял, какое практическое использование есть у Вашего парсера ?
Что он реально делать может под Микротиком ? (Никогда с такими штуками дел не имел, простите, за глупый вопрос, объясните, пожалуйста, подробнее).
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: JSON парсер JParse для Mikrotik

Сообщение Chupaka »

Там же написано: можно бота сделать, который будет реагировать на команды и делать что-нибудь с роутером :)
Sertik
Сообщения: 6
Зарегистрирован: 15 мар 2018, 18:07

Re: JSON парсер JParse для Mikrotik

Сообщение Sertik »

1. Бот делается в сервисе Телеграмм ?
2. Команды пишутся в бот, Ваш парсер с Микротика его "отслеживает" и ... что он делает - устанавливает глобальные переменные в окружении реппозитория Микротика, которые потом могут отслеживаться другими скриптами через Планировщик - я правильно понимаю или нет ?
3. Какие команды "понимает" парсер ?
4. Есть ли поподробнее "разжеванная" инструкция по применению "для чайников" ?
5. Планируете ли Вы его развитие ?

Заранее спасибо и благодарности автору от меня лично и (думаю не ошибусь если так напишу) всего сообщества пользователей Микротик !
А также с большим уважением, (если скрипты писали Вы, видно по коду скриптов и конструкциям, что Вы профи ...)

P/S. Понимаю, как "старый" немножко программист, что Вам легче написать парсер, чем инструкцию к нему, но все же Ваш парсер пользовался бы огромной популярностью, если бы была инструкция ... Или это коммерческий вопрос ?
Chupakabra303
Сообщения: 31
Зарегистрирован: 24 янв 2017, 11:57

Re: JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 »

Доброго времени суток.
1. Бот делается в телеграме.
2. Команды отсылаются стандартно боту в чат в телеграм-клиенте.
У меня реализовано 2 варианта, простой и c webhook.
Простой:
Cкрипт просто периодически читает (вызывается из планировщика) getUpdates api telegram, после разбора ответа делает if-else выбор действия по переменной $v->"message"->"text":
:if ($v->"message"->"text" ~ "uptime") do={
/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$[/system resource get uptime]" keep-result=no
} else={
:if ($v->"message"->"text" ~ "ip") do={
/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$[/ip dhcp-client print as-value]" keep-result=no
} else={
:if ($v->"message"->"text" ~ "parse") do={
/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$[$fJParsePrintVar]" keep-result=no
} else={
/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$($v->"message"->"text")" keep-result=no
}
Нужны какие-то свои функции - просто добавляете else-if. К сожалению нет switch-case стуктуры, чтобы это упростить в языке mikrotik.
Минус: скорость ответа микротика на запрос определяется частотой вызова скрипта, при каждом вызове происходит чтение getUpdates api telegram, парсинг, в общем, полный цикл запроса-анализа, что нагружает процессор. Чтобы избавиться от этих минусов есть вариант скрипта webhook, т.е. когда api telegram сам "долбится" по заданному адресу, чтобы прислать новые сообщения. Продолжение следует.
Последний раз редактировалось Chupakabra303 19 апр 2018, 12:35, всего редактировалось 1 раз.
Chupakabra303
Сообщения: 31
Зарегистрирован: 24 янв 2017, 11:57

Re: JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 »

Продолжение.
Второй вариант скрипта Telegram bot-а на базе Webhook. Mikrotik, конечно, не умеет делать пользовательский web server внутри себя, который требуется для полноценной работы Webhook уведомлений от API Telegram. Но можно хитро обойти эту проблему. Для этого нужно мониторить некий несуществующий TCP сокет, в который будет "долбиться" Webhook, это делается с помощью Mangle правила. В API Telegram включается работа с Webhook, указывается IP mikrotik-а и TCP порт, SSL сертификат тут роли не играет никакой! По значению счетчика пакетов Mangle правила можно понять, что в несуществующий TCP порт "долбится" Webhook (или что-то другое ;), но можно отсечь фильтром src-address=149.154.167.192/26). Затем в API Telegram отключаются Webhook-и и делается чтение и обработка сообщений как в первом варианте скрипта (polling), затем опять включается Webhook и по новой. Я накидал небольшую диаграмму работы скрипта.
Минусы: Для Webhook нужен реальный IP адрес mikrotik, желательно привязанный к домену (у меня работает с динамическим IP и сервисом динамического DNS).
Плюсы: Основная часть скрипта фактически спит все время, ожидая входящий пакетов на суррогатный сокет. Если скрипт вызывать часто (у меня раз в секунду), то Webhook-и отрабатываются очень быстро, как в нормальных Telegram ботах.
MikrotikTelegramBorAlgorithm.png
Продолжение следует.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Chupakabra303
Сообщения: 31
Зарегистрирован: 24 янв 2017, 11:57

Re: JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 »

3. Парсер не понимает никакие команды, команды "понимает" бот, использующий данные на выходе парсера. Парсер же просто извлекает данные из JSON строки и формирует из них ассоциативный массив, который удобно использовать в скриптах Mikrotik. Команды - это как бы пользовательский уровень уже, тут каждый сам решает, какие функции управления ему реализовать. Вот, например, у меня есть команда, которая добавляет на 10 минут IP адрес в разрешающий список адресов ExtAccessIPList.
:if ($v->"message"->"text" ~ "add") do={
:local addIP [:toip [:pick ($v->"message"->"text") 4 [:len ($v->"message"->"text")]]]
:if ([:typeof $addIP] = "ip") do={
:do {/ip firewall address-list add address=$addIP list=ExtAccessIPList timeout=10m comment="temp"} on-error={:put "ip in list error"}
}
:local Str1 ""
:foreach item in=[/ip firewall address-list print as-value where list=ExtAccessIPList and dynamic] do={:set Str1 ($Str1 . "$($item->"address") $($item->"timeout") $($item->"comment")\r\n")}
:do {/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$Str1" keep-result=no} on-error={:put "sendmessage error"}

Пример запроса и ответа в telegram, последняя строка это уже добавленный в IP List временный адрес:
>add 1.1.1.1
>> 90.0.0.97 h*******
100.0.0.157 6*******
90.0.0.2 i*******.ru
100.0ю0.66 b*******.ru
1.1.1.1 00:10:00 temp

4. Инструкции в классическом понимании не будет скорее всего. Но на вопросы готов ответить.
5. Активное развитие не планирую, текущий результат меня устраивает, но готов рассмотреть предложения по усовершенствованию.
Winand
Сообщения: 1
Зарегистрирован: 29 июл 2018, 00:13

Re: JSON парсер JParse для Mikrotik

Сообщение Winand »

Это просто великолепно.) ...когда разберёшься как пользоваться. До этого я использовал apify, чтобы выдрать из json одно значение. Теперь можно делать так:

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

#Load file "tmp" to JSONIn variable
:global JSONIn [/file get tmp contents]
#initialize environment
/system script run "JParseFunctions"
#parse JSONIn then get ParsedResults[0].ParsedText value
:global fJParse
:local response [([$fJParse]->"ParsedResults"->0->"ParsedText")]
#trim value
:local password [:pick $response 0 [:find $response " "]]
:log info "Current VPNBook password is $password"
#Remove "tmp" file
/file remove tmp
Sertik
Сообщения: 6
Зарегистрирован: 15 мар 2018, 18:07

Re: JSON парсер JParse для Mikrotik

Сообщение Sertik »

Для Chupakabr`ы:

Здравствуйте, вопрос не по теме, но к Вам, если позволите.
Прочитал Вашу статью Почти "OCR для получения пароля VPNBook. PHP + Mikrotik" на Хабре (https://habr.com/post/420373/)
Сам пользуюсь freeVPN сервером. Хочу получать на Микротик его новый пароль-картинку и расшифровывать ее OCR API

Картинку-пароль могу забрать с сервера вот так:
/tool fetch url="https://www.vpnbook.com/password.php?bg ... 1542205437" mode=http dst-path=VPNpass.png

Но никак не могу разобраться, как ее переслать OCR-ресурсу https://www.newocr.com/api/
(Правила обращения к нему по этой же ссылке)
Нужно сформировать POST запрос-строку для /tool fetch Микротика, чувствую интуитивно, что он это может, но не могу догнать конкретно.

Можете помочь ?
Sertik
Сообщения: 6
Зарегистрирован: 15 мар 2018, 18:07

Re: JSON парсер JParse для Mikrotik

Сообщение Sertik »

Ну где же ВЫ !?????

Нашел другой OCR-сервис, проще и удобнее предыдущего:

https://convertio.co/ru/ocr/

У него есть удобный API: https://developers.convertio.co/ru/

Сначала нужно на нем зарегистрироваться и получить APIKEY - регистрация занимает не больше 1 минуты и разрешает в день конвертировать 25 минут бесплатно !

Так вот. С WEB-странички сервиса пароль vpnbook.com сервера конвертируется из картинки в текст элементарно на УРА !

Но когда делаю тоже самое через API (текст с WEB-страничек API) выдается не тот результат.

Микротик тоже спокойно работает с этим API вот так:

1. Обращается к сервису с POST-запросом на распознавание файла-картинки с паролем VPN-сервера vbnbook.com:
обращаю внимание все кавычки в http-data нужно, как известно, экранировать обратным слешем.

/tool fetch http-method=post http-content-type="application/json" http-data="{\"apikey\": \"ВАШ API-KEY\", \"file\":\"https://www.vpnbook.com/password.php\", \"outputformat\": \"txt\"}" url="http://api.convertio.co/convert" dst-path="vpnOCR.txt"

В файле vpnOCR.txt в данном случае получаем в формате JSON ответ OCR-сервиса - всё мол OK и ID-файла результата распознавания (file-ID).

2. /tool fetch url="http://api.convertio.co/convert/file-ID/dl/base64" dst-path="vpnPASS.txt"

Обращаемся повторно GET-запросом чтобы забрать результат по полученному ID. И получаем в файл vpnPASS.txt ответ.

НО ! во-первых он (ответ) не правильный - не соответствует тексту на картинке, а во-вторых в формате base64 и больше никак. Это было бы еще полбеды - можно написать в скрипте перекодировщик, но и в base64 неправильный ответ.

В чем может быть проблема ?

Пожалуйста, помогите !
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: JSON парсер JParse для Mikrotik

Сообщение Chupaka »

Он тут с августа отсутствует :(

Если результат не соответствует - может, они кэшируют как-то файлы запрашиваемые? Попробуйте что-нибудь типа

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

\"file\":\"https://www.vpnbook.com/password.php?t=12345\"
Sertik
Сообщения: 6
Зарегистрирован: 15 мар 2018, 18:07

Re: JSON парсер JParse для Mikrotik

Сообщение Sertik »

Пробовал. Не выходит. Такой же результат.
Chupakabra303
Сообщения: 31
Зарегистрирован: 24 янв 2017, 11:57

Re: JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 »

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