1

Тема: Автологин в QUIK при двухфакторной авторизации по СМС (на Lua)

BlaZed, я всё же вынесу эту тему отдельным топиком, т.к. она сама по себе может иметь своё параллельное развитие.

В дополнение к теме автологина QUIK
https://quik2dde.ru/viewtopic.php?id=80

Что делать в случае двухфакторной авторизации по SMS ?

2

Re: Автологин в QUIK при двухфакторной авторизации по СМС (на Lua)

Не стал заводить новую тему, так как тема относится к автолигину.

Периодически из-за двухфакторной авторизации автологин не получался, требовался PIN из SMS, а я не всегда около компьютера.
В общем, для себя реализовал автоматизацию двухфакторной авторизации.

Что для этого требуется.

1) USB-модем.
Я взял ZTE MF833R
По умолчанию модем работает в режиме сетевой карты+роутера, нам это не подходит. Надо заставить модем работать в режиме COM-портов.
Для ZTE-модемов есть утилита SCSI.exe (хз почему такое название), которая сбрасывает модем в диагностический режим, в котором модем как раз работает в режиме com-портов. Далее подсовываем драйвера. Первый этап закончен.
Можно подключиться к com-порту модема через терминал, чтобы убедиться что он работает.
Инфу по модемам хорошо искать на форуме 4pda, там много чего интересного.
Предупреждение, неправильными действиями можно легко модем убить, все на свой страх и риск.

2) Получаем SMS с usb-модема
Хотел написать на LUA, но не нашел нормальной библиотеки для работы с COM-портами, поэтому взял на просторах интернета программу nhsms, гуглится по первой же ссылке. Плюсы в том что умеет работать как сервис, настраивается как через гуи так и через конфиг, для наших нужд она будет бесплатна.
Ставим, настраиваем на свой модем, убеждаемся что она работает и принимает sms.
После чего делаем скрипт обработки входящих sms, у меня такой

@echo off
rem Обрабатываем только входящие СМС
if not "%sms_type%" == "SMS-DELIVER" exit /b 0
rem Сохранение в файлы по отправителям
If Not Exist "%DIR%\%sms_sender%" mkdir "%DIR%\%sms_sender%"
echo %sms_readtime% "%sms_messagetext%">> %DIR%\%sms_sender%\all.txt
echo %sms_readtime_year%%sms_readtime_month%%sms_readtime_day%%sms_readtime_hour%%sms_readtime_min%%sms_readtime_sec%> %DIR%\%sms_sender%\last.txt
echo %sms_messagetext%>> %DIR%\%sms_sender%\last.txt

В результате, под каждого отправителя, создается папка, в которой два файла, all.txt и last.txt
В моем случае, для авторизации потребуется файл C:\SMS\OpenQUIK\last.txt в рем всегда будет лежать датавремя и текст последней SMS от брокера кодом авторизации.

3) Выдергиваем из файла с последней sms от брокера pin-код и отправляем его в quik
Тут просто в скрипт автологина добавил несколько функций

function Quik2FA() -- Ищем окно двухфакторной авторизации и вводим PIN для 
  local hWnd=GetWindowHandle("#32770","Двухфакторная аутентификация") -- Получить дескриптор окна Двухфакторной аутентификации
  if hWnd==0 then return end                           -- Дескриптор не найден, выход
  local hPIN=w32.FindWindowEx(hWnd,0,"Edit","")        -- PIN
  local PINCode=GetPINCode()
  if(PINCode~=nil)then
    w32.SetWindowText(hPIN,PINCode)
    w32.PostMessage(hWnd,w32.WM_COMMAND,IDOK,0)
  else
    w32.PostMessage(hWnd,w32.WM_COMMAND,IDCANCEL,0)
  end
end
function GetPINCode() -- Ждем актуальную SMS от брокера и выдергиваем PIN
  local now=string.format("%04d%02d%02d%02d%02d%02d",dt.year,dt.month,dt.day,dt.hour,dt.min,dt.sec)
  local filename="C:\\SMS\\OpenQUIK\\last.txt"
  local n=120 -- Ждем SMS 2 минуты
  message("Ждем SMS с PIN-кодом...")
  while (n>0) do
    local f=io.open(filename,"r")
    if f~=nil then
      local smsdate=tonumber(f:read("*l"))
      local smstext=tostring(f:read("*l"))
      f:close()
      if(smsdate>=now)then
        smstext=dos2win(smstext)
        message("Получена SMS:"..tostring(smstext))
        local pin=string.match(smstext,"%d%d%d%d%d")
        message("Найден PIN:"..tostring(pin))
        return pin
      end
    end
    sleep(1000)
    n=n-1
  end
  message("SMS не получена")
  return nil
end
function dos2win(s) -- Перекодируем SMS из кодировки cp866 в cp1252
  local str=""
  for i=1,string.len(s) do
    byte=string.byte(s,i)
    char=string.char(byte)
    if(byte>=128)and(byte<=175)then char=string.char(byte+64) end
    if(byte>=224)and(byte<=239)then char=string.char(byte+16) end
    if(byte==240)              then char=string.char(168) end
    if(byte==241)              then char=string.char(184) end
    str=str..char
  end
  return str
end

3 (2021-03-27 12:33:01 отредактировано swerg)

Re: Автологин в QUIK при двухфакторной авторизации по СМС (на Lua)

Круто!!

function dos2win(s)
Надо будет в w32 библиотеку такое добавить, в принципе эти функции есть в WinAPI, так что даже логично будет.