Автоматический старт QUIK - это просто

Страницы: 1
RSS
Автоматический старт QUIK - это просто
 
Добрый день,
Если Вам надоело каждый раз при старте квик вручную вводить пароль
и код со смартфона , то расскажу, как делать  это автоматически.
------------------------
Самое простое - это ввод пароля.
для этого использую вот такой простой скрипт на AutoIt.
Код
; Скрипт автоматического ввода пароля для QUIK
; автор nikolz
; --- Настройки ---
$sQuikPath = "C:\QUIK\info.exe"
$sQuikWorkingDir = "C:\QUIK"  ; Рабочая папка (обычно там же, где info.exe)
$sPasswordFile = @ScriptDir & "\password.txt"
; --- Чтение пароля из файла ---
Local $sPassword = FileReadLine($sPasswordFile)
If @error Then
    MsgBox(16, "Ошибка", "Не удалось прочитать файл пароля: " & $sPasswordFile) 
    Exit
EndIf

; --- Запуск QUIK с правильной рабочей папкой и с ключом -clear ---
Run('"' & $sQuikPath & '" -clear', $sQuikWorkingDir)

If @error Then
    MsgBox(16, "Ошибка", "Не удалось запустить QUIK по пути: " & $sQuikPath)
    Exit
EndIf

; --- Ожидание первого окна (ввод пароля) ---
Local $hFirstWindow = WinWait("[CLASS:#32770; TITLE:Идентификация пользователя]", "", 1000)
If Not $hFirstWindow Then
    MsgBox(16, "Ошибка", "Окно ввода пароля не появилось в течение 1000 секунд.")
    Exit
EndIf

; Активируем окно
WinActivate($hFirstWindow)
Sleep(500)

; --- Ввод пароля ---
ControlSend($hFirstWindow, "", "[CLASS:Edit; INSTANCE:2]", $sPassword)
Sleep(300)
ControlSend($hFirstWindow, "", "", "{ENTER}")
Exit
Для его работы надо установить AutoIt
и создать файл "password.txt" с паролем в каталоге скрипта .
------------------------
Могу выложить выложить exe файл, который не требует установки AutoIt, если надо.  
Но решил, что скрипт нагляднее.
-------------------------
Продолжение следует...
 
Автоматическая двухфакторная аутентификация.
--------------------------
Привожу скрипт , который вводит пароль и код из файлов.
Код
; Скрипт автоматического ввода пароля и кода для QUIK
; автор nikolz
; Версия: 3.2 (рабочий поиск окон + правильный запуск)
; --- Настройки ---
$sQuikPath = "C:\QUIK6\info.exe"
$sQuikWorkingDir = "C:\QUIK6"  ; Рабочая папка (обычно там же, где info.exe)
$sPasswordFile = @ScriptDir & "\password.txt"
$sCodeFile = @ScriptDir & "\code.txt"
; --- Чтение пароля из файла ---
Local $sPassword = FileReadLine($sPasswordFile)
If @error Then
    MsgBox(16, "Ошибка", "Не удалось прочитать файл пароля: " & $sPasswordFile)
    Exit
EndIf
; --- Чтение кода из файла ---
Local $sCode = FileReadLine($sCodeFile)
If @error Then
    MsgBox(16, "Ошибка", "Не удалось прочитать файл с кодом: " & $sCodeFile)
    Exit
EndIf
; --- Запуск QUIK с ключом -clear ---
Run('"' & $sQuikPath & '" -clear', $sQuikWorkingDir)
If @error Then
    MsgBox(16, "Ошибка", "Не удалось запустить QUIK по пути: " & $sQuikPath)
    Exit
EndIf
; --- Ожидание первого окна (ввод пароля) ---
; ИСПОЛЬЗУЕМ ТОЧНО ТАКОЙ ЖЕ ПОИСК, КАК В РАБОЧЕМ СКРИПТЕ
Local $hFirstWindow = WinWait("[CLASS:#32770; TITLE:Идентификация пользователя]", "", 1000)
If Not $hFirstWindow Then
    MsgBox(16, "Ошибка", "Окно ввода пароля не появилось в течение 30 секунд.")
    Exit
EndIf
; Активируем окно
WinActivate($hFirstWindow)
Sleep(500)
; --- Ввод пароля ---
; ИСПОЛЬЗУЕМ ТОТ ЖЕ INSTANCE:2, КОТОРЫЙ РАБОТАЛ
ControlSend($hFirstWindow, "", "[CLASS:Edit; INSTANCE:2]", $sPassword)
Sleep(300)
ControlSend($hFirstWindow, "", "", "{ENTER}")
; --- Ожидание второго окна (ввод кода) ---
Local $hSecondWindow = WinWait("[CLASS:#32770; TITLE:Двухфакторная аутентификация]", "", 30)
If Not $hSecondWindow Then
    MsgBox(16, "Ошибка", "Окно ввода кода не появилось в течение 30 секунд.")
    Exit
EndIf
WinActivate($hSecondWindow)
Sleep(500)
; --- Ввод кода ---
ControlSend($hSecondWindow, "", "[CLASS:Edit; INSTANCE:1]", $sCode)
Sleep(300)
ControlSend($hSecondWindow, "", "", "{ENTER}")
Exit
Для дальнейшей автоматизации необходимо подключить к ПК GSM модем, либо передать в файл код, полученный на смартфоне.
---------------------
Для этой задачи собрал GSM модуль из трех деталей:
адаптер USB-UART, модуль SIM800L и корпус 50мм x 25мм x 11мм.
В режиме ожидания модуль потребляет  всего 1 мА.
-------------------
Приложение для работы с модулем написал на Lua.
 
Спасибо за идею скрипта, творчески развил и адаптировал для варианта без модема (AutoIt, Chrome, Android).

  1. Нам потребуется телефон на Android с использованием Google Сообщений в качестве приложения по умолчанию для работы с SMS. Замечание для владельцев Samsung Galaxy ниже S25 - в более новых версиях в качестве "умолчательного" уже используется именно оно, для версий ниже - надо установить и переназначить.
  2. Идем на компе в Chrome на web-версию Google Сообщения, настраиваем связь с телефоном как там описано (вход в аккаунт Google и все такое). Если все сделано правильно, то должны увидеть на странице список своих чатов.
  3. Устанавливаем AutoIt3 - достаточно portable-версии.
Выше - это обязательный перечень, остальные моменты можно настраивать под собственное удобство.
Все приведенные ниже файлы создаем в любом отдельном каталоге.
Код
_login.au3: основной AutoIt-скрипт запуска
Код
; автозапуск QUIK с проходом двухфакторной авторизации
; проверено на Сбер 12.8.4.9

; читаем пароль из _quik.pwd рядом с .au3
$sPathPWD = @ScriptDir & "\_quik.pwd"
Local $sPWD = FileReadLine($sPathPWD)
If @error Then
  MsgBox(16, "Ошибка", "Не удалось прочитать файл пароля: " & $sPathPWD)
  Exit
EndIf

; читаем путь до каталога QUIK из _quik.pth рядом с .au3
$sPathPth = @ScriptDir & "\_quik.pth"
; рабочая папка QUIK
Local $sPathQUIK_WD = FileReadLine($sPathPth)
If @error Then
  MsgBox(16, "Ошибка", "Не удалось прочитать файл пути: " & $sPathPth)
  Exit
EndIf

; путь до самого QUIK (info.exe)
$sPathQUIK = $sPathQUIK_WD & "\info.exe"

; запускаем QUIK с ключом -clear
; для простоты предполагаем рабочей папкой ту, где находится сам info.exe
Run('"' & $sPathQUIK & '" -clear', $sPathQUIK_WD)
If @error Then
  MsgBox(16, "Ошибка", "Не удалось запустить QUIK по пути: " & $sPathQUIK)
  Exit
EndIf

AutoItSetOption("SendKeyDelay", 100)

; бесконечный цикл, в котором мы проходим оба окна, как только они появляются
; защита от "разлогина" в ходе торговой сессии - по умолчанию выключена
;While True
  ; просто ждем 30 сек
  Sleep(30000)

  ; до 30 сек ждем диалог авторизации с логин-паролем
  Local $hWndPWD = WinWait("[CLASS:#32770; TITLE:Вход в систему]", "", 30)
  If $hWndPWD Then
    ; ставим фокус на диалог
    WinActivate($hWndPWD)
    Sleep(500)

    ; отправляем пароль во 2-й EditBox (1-й - логин уже сохранен по умолчанию)
    ControlSend($hWndPWD, "", "[CLASS:Edit; INSTANCE:2]", $sPWD)
    Sleep(300)
    ControlSend($hWndPWD, "", "", "{ENTER}")
  EndIf

  ; до 30 сек ждем диалог ввода PIN
  ; если так и не появился, то двухфакторка уже принята "с прошлого раза"
  Local $hWndPIN = WinWait("[CLASS:#32770; TITLE:Двухфакторная аутентификация]", "", 30)
  If $hWndPIN Then
    ; запускаем страницу Google SMS в новом окне Chrome
    Run(@ComSpec & " /c start chrome --new-window https://messages.google.com/web/conversations")
    ; ждем появления окна с нужной вкладкой
    Local $hWndChrome = WinWaitActive("[REGEXPCLASS:Chrome;TITLE:Веб-версия Google Сообщений]")

    SendKeepActive($hWndChrome)
    ; вызываем консоль (DevTools)
    Send("{F12}")
    ; ждем 10c, пока прогрузится список чатов
    Sleep(10000)
    ; через консоль активируем первый чат (с большой вероятностью это нужный нам 900)
    ;;Send("$('NAV.conversation-list A').click(){ENTER}")
    Send("$$('NAV.conversation-list A.list-item SPAN').find(span => span.innerText == '900').click(){ENTER}")
    ; ждем 10c, пока прогрузится список сообщений
    Sleep(10000)
    ; берем текст последнего сообщения, вырезаем из него регуляркой PIN (5 цифр подряд) и копируем в буфер обмена
    Send("copy($('DIV.content mws-message-wrapper[is-last=""true""]').innerText.match(/\d{{}5{}}/)[0]){ENTER}")
    Sleep(1000)

    WinClose($hWndChrome)
    WinWaitClose($hWndChrome)

    ; получаем PIN из буфера обмена
    $sPIN = ClipGet()

    WinActivate($hWndPIN)
    Sleep(500)
    ; отправляем PIN в первое поле ввода
    ControlSend($hWndPIN, "", "[CLASS:Edit; INSTANCE:1]", $sPIN)
    Sleep(300)
    ControlSend($hWndPIN, "", "", "{ENTER}")
  EndIf
;Wend

Exit

Код
_quik.pth: файл с путем до папки QUIK
Код
C:\QUIK_SBER

Код
_quik.pwd: файл с паролем
Код
12345678

Код
ai-login.bat: файл для запуска в планировщике задач
Код
cd /d "%~dp0"
C:\#AUTOIT\AutoIt3.exe  _login.au3
Находим через "Пуск" "Планировщик задач", в нем "Создать простую задачу" - и назначаем ai-login.bat на запуск каждый день в 6:45 - перед аукционом открытия.

Код
_logout.au3: AutoIt-скрипт завершения торговой сессии
Код
; закрываем окно QUIK, если оно существовало
WinClose("[CLASS:InfoClass; REGEXPTITLE:QUIK]")
Exit

Код
ai-logout.bat: файл для запуска в планировщике задач
Код
cd /d "%~dp0"
C:\#AUTOIT\AutoIt3.exe  _logout.au3
Аналогично назначаем ai-logout.bat на запуск каждый день в 23:55.


Собственно, все!
Страницы: 1
Читают тему
Наверх