Скрипт для смс авторизации через хотспот

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
mister-repper
Сообщения: 2
Зарегистрирован: 05 янв 2019, 21:31

Здравствуйте друзья! Очень нужна ваша помощь!

Нужно организовать бесплатную wifi точку доступа в кафе по требованиям закона. Нашёл в интернете отличный запись вебинара на эту тему. Автор всё чётко и ясно объясняет но к сожалению его решения работает только с Российскими номерами, а в кафе где нужно настроить wifi часто заходят туристы. Нужно сделать так чтобы скрипт работал с любыми тел.номерами. С HTML страничкой авторизации вроде сам разобрался но что делать со скриптом не знаю. Пожалуйста друзья помогите изменить данный скрипт так чтобы он принимал любые тел.номера.

Скрипты и страница авторизации

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

#Search number in log hotspot

:foreach line in=[/log find buffer=hotspot message~"login failed"] do={
 :do {:local content [/log get $line message];
  :put $content;
  :local pos1 [:find $content " (" 0];
  :put $pos1;
  :if ($pos1 != " ") do={ 
   :local uname ""; 
   :local uname7 "";
   :local uname8 "";
   :local uname9 "";
   :local phone ""; 
   :if ([:pick $content ($pos1-12)] = "8") do={ 
    :set uname [:pick $content ($pos1-10) ($pos1-0)];  
    :put $uname;
    :set uname7 [:put ("7" . {$uname})]
    :set uname8 [:put ("8" . {$uname})]
    :put $uname7
    :put $uname8
    #Password generation 
    :local date [/system clock get time]; 
    :local hour [:pick $date 0 2]; 
    :local min [:pick $date 3 5]; 
    :local sec [:pick $date 6 8]; 
    :local usernumber [:pick $content ($pos1-7) ($pos1-5)];
    :put $usernumber;
    :global pass 27394; 
    :set pass ($hour * $min * $sec - $usernumber); 
    :if ($pass = 0) do={ 
     :set pass 6524;
     }
    :put $pass;
    #Add user to hotspot / user-manager 

    do {/ip hotspot user add name=$uname} on-error={};
    do {/ip hotspot user set password=$pass numbers=[find name=$uname]} on-error={};
    do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname;} on-error={};
    do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={}; 
    ##SMS.ru
    #do {/tool fetch url="http://sms.ru/sms/send?api_id=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&to=$uname&text=$pass"} on-error={}; 
    do {/tool fetch url="https://gate.smsaero.ru/send/\?user=info@1.ru&password=1212121212das&to=$uname7&text=password+$pass&from=name=Asterconf"} on-error={};
    do {/tool sms send usb1 phone-number="$uname7" message="login $uname password $pass"} on-error={};
    #Email
    do {/tool e-mail send to="email@gmail.com" subject="Login $uname password $pass" body="Login $uname password $pass"} on-error={};    
    }
   :if ([:pick $content ($pos1-10)] = "9") do={ 
    :set uname [:pick $content ($pos1-10) ($pos1-0)];  
    :put $uname;
    :set uname7 [:put ("7" . {$uname})]
    :set uname8 [:put ("8" . {$uname})]
    :put $uname7
    :put $uname8
    #Password generation 
    :local date [/system clock get time]; 
    :local hour [:pick $date 0 2]; 
    :local min [:pick $date 3 5]; 
    :local sec [:pick $date 6 8]; 
    :local usernumber [:pick $content ($pos1-7) ($pos1-5)];
    :put $usernumber;
    :global pass 27394; 
    :set pass ($hour * $min * $sec - $usernumber); 
    :if ($pass = 0) do={ 
     :set pass 6524;
     }
    :put $pass;
    #Add user to hotspot / user-manager 

    do {/ip hotspot user add name=$uname} on-error={};
    do {/ip hotspot user set password=$pass numbers=[find name=$uname]} on-error={};
    do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname7;} on-error={};
    do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={}; 
    ##SMS.ru
    #do {/tool fetch url="http://sms.ru/sms/send?api_id=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&to=$uname&text=$pass"} on-error={}; 
    do {/tool fetch url="https://gate.smsaero.ru/send/\?user=info@1.ru&password=1212121212das&to=$uname7&text=password+$pass&from=name"} on-error={};
    do {/tool sms send usb1 phone-number="$uname7" message="login $uname password $pass"} on-error={};
    #Email
    do {/tool e-mail send to="email@gmail.com" subject="Login $uname password $pass" body="Login $uname password $pass"} on-error={};    
    }

   :if ([:pick $content ($pos1-11)] = "7") do={ 
    :set uname [:pick $content ($pos1-10) ($pos1-0)];  
    :put $uname;
    :set uname7 [:put ("7" . {$uname})]
    :set uname8 [:put ("8" . {$uname})]
    :put $uname7
    :put $uname8
    #Password generation 
    :local date [/system clock get time] 
    :local hour [:pick $date 0 2] 
    :local min [:pick $date 3 5] 
    :local sec [:pick $date 6 8] 
    :local usernumber [:pick $content ($pos1-7) ($pos1-4)];
    :global pass 27394 
    :set pass ($hour * $min * $sec - $usernumber) 
    :if ($pass = 0) do={ 
     :set pass 6524 
     } 
    :put $pass
    #Add user to hotspot / user-manager 

    do {/ip hotspot user add name=$uname} on-error={};
    do {/ip hotspot user set password=$pass numbers=[find name=$uname]} on-error={};
    do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname;} on-error={};
    do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
    ##SMS 
    #do {/tool fetch url="http://sms.ru/sms/send?api_id=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&to=$uname&text=$pass"} on-error={}; 
    do {/tool sms send usb1 phone-number="$uname7" message="login $uname password $pass"} on-error={};
    do {/tool fetch url="https://gate.smsaero.ru/send/\?user=info@1.ru&password=1212121212das&to=$uname7&text=password+$pass&from=name=Asterconf"} on-error={};
    #Email
    do {/tool e-mail send to="email@gmail.com" subject="Login $uname password $pass" body="Login $uname password $pass"} on-error={};  

    }
  }
 }
}



# Clear hostpot log

/system logging action set hotspot memory-lines=1;
/system logging action set hotspot memory-lines=1000;


Аватара пользователя
podarok66
Модератор
Сообщения: 4360
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Странно, почему вы решили, что с номерами других стран не работает? Судя по беглому взгляду, ваш скрипт настроен на работу с sms.ru На сайте указано, что отсылка производится в другие страны тоже. Только тарификация пожёстче. Проверьте длину сообщения. Не более 160 латинских символов, включая пробелы и переносы, лучше уложиться в 157. Если кириллица - предел 70 символов, реально лучше 67.
Не получается, ну попробуйте другой смс-сервис, их сейчас достаточно.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
mister-repper
Сообщения: 2
Зарегистрирован: 05 янв 2019, 21:31

podarok66 писал(а): 06 янв 2019, 14:10 Странно, почему вы решили, что с номерами других стран не работает? Судя по беглому взгляду, ваш скрипт настроен на работу с sms.ru На сайте указано, что отсылка производится в другие страны тоже. Только тарификация пожёстче. Проверьте длину сообщения. Не более 160 латинских символов, включая пробелы и переносы, лучше уложиться в 157. Если кириллица - предел 70 символов, реально лучше 67.
Не получается, ну попробуйте другой смс-сервис, их сейчас достаточно.
Да по умолчанию скрипт работает через смс шлюз но если эти строки закоментить можно настроить на отправку смс через USB модем. В скрипте есть некая часть повторяется 3 раза возможно я думаю это проверка на правильность ввода номера


Аватара пользователя
podarok66
Модератор
Сообщения: 4360
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Так, я скрипт полностью не анализировал, не хочу голову забивать. Но если мельком посмотреть, то сразу вызывает вопросы вот этот блок.

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

#Search number in log hotspot

:foreach line in=[/log find buffer=hotspot message~"login failed"] do={
 :do {:local content [/log get $line message];
  :put $content;
  :local pos1 [:find $content " (" 0];
  :put $pos1;
  :if ($pos1 != " ") do={ 
   :local uname ""; 
   :local uname7 "";
   :local uname8 "";
   :local uname9 "";
   :local phone ""; 
   :if ([:pick $content ($pos1-12)] = "8") do={ 
    :set uname [:pick $content ($pos1-10) ($pos1-0)];  
    :put $uname;
    :set uname7 [:put ("7" . {$uname})]
    :set uname8 [:put ("8" . {$uname})]
    :put $uname7
    :put $uname8
Вы проверяйте его, там не даром столько раз :put поставлен. Это отладочные строки, их потом можно закомментировать. То есть один этот блок запускайте в консоли при попытке регистрации с номеров разных стран. И сразу станет понятно, что он там пропускает, а что нет. Вроде как заточен исключительно под российские номера. Перепишите блок так, чтобы брал номер независимо от принадлежности, и будет всё работать. Сложно подсказывать, если даже воспроизвести не на чем. А строить всю эту халабуду ради "попробовать" ну никак не хочется.
И вообще, покажите на примере, как там эта запись в логе выглядит полностью.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
anatoliy
Сообщения: 4
Зарегистрирован: 28 янв 2019, 10:18

Скрипт рабочий. В начале задаются переменные, если введённый в форму ввода номер начинается с "7", "8", "9". Соответственно, для каждого из этих вариантов один и тот-же кусочек скрипта с поправками. Лучший вариант это жёстко задать нужный формат в html, например +7-XXX-XXX-XX-XX, и оставить только кусок кода с 9кой.


PAPIruss
Сообщения: 3
Зарегистрирован: 18 июл 2019, 10:02

Коллеги помогите доработать скрипт о котором здесь идет речь.
Авторизацию по нему я поднял все прекрасно работает и через модем и через веб сервисы. Но находятся умники которые не дождавшись смс делают повторные попытки авторизации, на каждую из которых генерируется новый пароль и отправляется новое смс.
Исходя из этого встал вопрос, как бы отловить факт что на данный номер смс уже отправлялось и если это так то не производить дальнейших действий по генерации нового пароля и отправки смс.
Понять что смс уже отправлялось в принципе не сложно. После каждой отправки, создается временный файл (живущий до перезагрузки роутера), с именем такого вида: send-message?username=admin&password=xxxxxxxxxx&to=7903xxxxxxx&message-type=sms.automatic&message=WiFi:xxxx. Где после "to=" идет номер телефона на который было отправлено смс. Как мне кажется можно добавить в секцию "#Password generation" скрипта, функцию поиска в временных файлах совпадения по номеру и телефона, и при обнаружении совпадения прерывать выполнение скрипта. Если у кого то есть свои соображения буду рад их услышать.
[Ниже сам скрипт]

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

#Search number in log hotspot
:foreach line in=[/log find buffer=hotspot message~"login failed"] do={
 :do {:local content [/log get $line message];
  :put $content;
  :local pos1 [:find $content " (" 0];
  :put $pos1;
  :if ($pos1 != " ") do={ 
   :local uname ""; 
   :local uname7 "";
   :local uname8 "";
   :local uname9 "";
   :local phone "";  
   :if ([:pick $content ($pos1-10)] = "9") do={ 
    :set uname [:pick $content ($pos1-10) ($pos1-0)];  
    :put $uname;
    :set uname7 [:put ("7" . {$uname})]
    :set uname8 [:put ("8" . {$uname})]
    :put $uname7
    :put $uname8
    #Password generation 
    :local date [/system clock get time]; 
    :local hour [:pick $date 0 2]; 
    :local min [:pick $date 3 5]; 
    :local sec [:pick $date 6 8]; 
    :local usernumber [:pick $content ($pos1-7) ($pos1-5)];
    :put $usernumber;
    :global pass 27394; 
    :set pass ($hour * $min * $sec - $usernumber); 
    :if ($pass = 0) do={ 
     :set pass 6524;
     }
    :put $pass;
    #Add user to hotspot / user-manager 
    #do {/ip hotspot user add name=$uname} on-error={};
    #do {/ip hotspot user set password=$pass numbers=[find name=$uname]} on-error={};
    do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname7;} on-error={};
    do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
    #sms to sms.xxxxxxxx.pro
    do {/tool fetch url="http://sms.xxxxxxxx.pro:xx/http/send-message\?username=admin&password=7903xxxxxx&to=$uname7&message-type=sms.automatic&message=WiFi:$pass"} on-error={};
    }


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

Исходя из этого встал вопрос, как бы отловить факт что на данный номер смс уже отправлялось и если это так то не производить дальнейших действий по генерации нового пароля и отправки смс.
Так обычно не делается. Если чел отправил еще раз смс ему должен быть выдан другой пароль для авторизации, а предыдущий стерт, чтобы по нему авторизация не проходила.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
PAPIruss
Сообщения: 3
Зарегистрирован: 18 июл 2019, 10:02

Sertik писал(а): 02 окт 2019, 21:18
Исходя из этого встал вопрос, как бы отловить факт что на данный номер смс уже отправлялось и если это так то не производить дальнейших действий по генерации нового пароля и отправки смс.
Так обычно не делается. Если чел отправил еще раз смс ему должен быть выдан другой пароль для авторизации, а предыдущий стерт, чтобы по нему авторизация не проходила.
Так обычно не делается кем?
Со стороны провайдера услуги по отправке смс конечно так делать не надо. Пусть человек отправляет как можно больше запросов на каждый из из которых я буду слать смс, зарабатывая на каждом из них свою копеечку. А как быть человеку который оплачивает это счастье?
Обычно смс приходят быстро, но что делать если где то в цепочке есть задержке пусть даже в минуту? Нетерпеливый клиент за это время успеет сделать несколько попыток авторизации, смс за которые начнут поступать ему постепенно, которые тот начнет вводить по мере их поступления начиная с первой, в то время как первый код уже будет затерт системой. В итоге либо клиент останется недоволен и уйдет, либо в конце концов он войдет в сеть, при этом просадив счет на энное количество денег. При этом я мало того что предоставляю вайфай бесплатно, я еще и теряю на этом деньги. А если сервис провайдера завис на час? Клиент шлет ему смс которые встают в очередь, а потом когда сервис отвиснет и гневный клиент будет уже далеко ему придет 150 смс с кодом который ему уже нах не сдался. Он еще и жалобу куда-нить накатает за спам рассылку... Есть более конструктивные мысли? )


Аватара пользователя
Kato
Сообщения: 271
Зарегистрирован: 17 май 2016, 04:23
Откуда: Primorye

Не понятно как человек делает запрос на авторизацию. Есть отдельная страница? если так, так в ней и сделать задержку. отправил, жди 30-60 сек - отправить повторно не получится, пока время не пройдет.


PAPIruss
Сообщения: 3
Зарегистрирован: 18 июл 2019, 10:02

Kato писал(а): 03 окт 2019, 03:44 Не понятно как человек делает запрос на авторизацию. Есть отдельная страница? если так, так в ней и сделать задержку. отправил, жди 30-60 сек - отправить повторно не получится, пока время не пройдет.
Да станица авторизации есть, в нее человек вводит свой номер телефона и затем полученное смс.
Помежете с реализацией? Я не силен в скриптах (


Ответить