QLua(Lua) - скрипт автоматической авторизации в QUIK

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 5, среднее: 5,00 из 5)
Загрузка...

Двухфакторная авторизация прошла успешноДля того, чтобы постоянно вручную не вводить логин/пароль в терминале QUIK, используйте данный скрипт, написанный на языке Lua, или QLua (Lua,  интерпретированный под QUIK).

Для QUIK 8 x64 используйте данное консольное приложение (СКАЧАТЬ), внутри архива 2 файла, само приложение AutoLogin.exe и текстовый файл Login.txt, в первой строке которого укажите Ваш логин, а во второй пароль. Текстовый файл должен находится рядом с EXE-шником. Можете закинуть их в папку автозапуска Windows, чтобы каждый раз не запускать. Если терминал Вы запускаете от имени администратора, то и AutoLogin.exe запускайте от имени администратора.

В последних версиях терминала изменилось окно ввода логина и пароля, чтобы этот скрипт мог с ним работать нужно заменить три строки 35 - 37 следующими четырьмя строками:

local hServer = w32.FindWindowEx(hLoginWnd, 0, "", "")
local hLogin = w32.FindWindowEx(hLoginWnd, hServer, "", "")
local nPassw = w32.FindWindowEx(hLoginWnd, hLogin, "", "")
local nBtnOk = w32.FindWindowEx(hLoginWnd, nPassw, "", "")

Код скрипта:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
-- Автологин терминала QUIK
-- (c) http://quik2dde.ru/
-- Версия: 1.0
 
local w32 = require("w32")
 
-- логин и пароль для терминала
QUIK_LOGIN = "MyLogin"
QUIK_PASSW = "MyPassword"
 
 
function FindLoginWindow()
   hLoginWnd = w32.FindWindow("", "Идентификация пользователя")
   if hLoginWnd == 0 then
      hLoginWnd = w32.FindWindow("", "User identification")
   end
   return hLoginWnd
end
 
timeout = 1000  -- таймаут между попытками поиска окна логина
is_run = true
 
function OnStop()
   timeout = 1
   is_run = false
end
 
function main()
   while is_run do
      sleep(timeout)
 
      if isConnected() == 0 then	  
         local hLoginWnd = FindLoginWindow()
         if hLoginWnd ~= 0 then
            local hLogin = w32.FindWindowEx(hLoginWnd, 0, "", "")
            local nPassw = w32.FindWindowEx(hLoginWnd, hLogin, "", "")
            local nBtnOk = w32.FindWindowEx(hLoginWnd, nPassw, "", "")
 
            w32.SetWindowText(hLogin, QUIK_LOGIN)
            w32.SetWindowText(nPassw, QUIK_PASSW)
 
            w32.SetFocus(nBtnOk)
            w32.PostMessage(nBtnOk, w32.BM_CLICK, 0, 0)
 
            while not isConnected() do sleep(10); end;
         end
      end
   end
end

Скачать скрипт (не забудьте разархивировать перед помещением в папку).

Чтобы использовать данный скрипт, нужно в директорию, в которой установлен терминал QUIK, поместить библиотеку w32.dll, скачать которую можно по данной ссылке (не забудьте разархивировать перед помещением в папку).

Для Quik 8 x64 качайте вот эту w32.dll

Если Вы не знаете как запустить скрипт в торговом терминале QUIK, ознакомьтесь с данной статьей.

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Скрипт взят здесь.

Добавить комментарий

QLua(Lua) - скрипт автоматической авторизации в QUIK: 99 комментариев

  1. Столкнулся с такой проблемой когда работают несколько квиков, то lua - скрипт автозапуска, использующий w32.dll одного квика , может пытаться "вставлять" имя пользователя и пароль в активное окно авторизации другого квика, получается ошибка. Нет ли возможности делать проверку как -то? Скорее всего нет, но все же.

      1. Попробовал вашу библиотеку, в принципе видно, что работает авторизация. Но для приведения алгоритма действий к тому что был на w32.dll и lua скрипте, что приведен в данной статье, надо что - то править в коде. Не знаю сам разберусь ли. Но все равно спасибо.

        1. вот аналог, только проверка делается не по состоянию соединения, а по доступности пункта меню "логин", что даже несколько лучше в нашем случае:
          [lua]
          package.cpath = getScriptPath() .. "/?.dll"
          qres = require "lua_quik_resources"

          quik_resources_lib = "lang_res.dll" -- "lang_rus.dll" for QUIK8!

          qres.HWND_DESKTOP = 0
          qres.WM_COMMAND = 273
          qres.INFOMENU_CONNECT = 100
          qres.INFOMENU_DISCONNECT = 101
          qres.IDOK = 1
          qres.MF_ENABLED = 0

          hQUIK = qres.get_quik_handle()

          function manage_quik_connection(connect, quik_login, quik_password)
          if connect then
          local connect_menu_state = qres.get_menu_state(hQUIK, qres.INFOMENU_CONNECT)
          if (connect_menu_state == qres.MF_ENABLED) then
          local conn_dlg_title = tostring(qres.get_dlg_title(10107))
          qres.post_message(hQUIK, qres.WM_COMMAND, qres.INFOMENU_CONNECT, 0)
          sleep(100)
          local hConnDlg = qres.get_child_handle(qres.HWND_DESKTOP, conn_dlg_title)
          if (hConnDlg ~= 0) then
          qres.set_dlg_item_text(hConnDlg, 10101, quik_login)
          qres.set_dlg_item_text(hConnDlg, 10102, quik_password)
          qres.post_message(hConnDlg, qres.WM_COMMAND, qres.IDOK, 0)
          return "Login sent"
          end
          end
          else
          qres.post_message(hQUIK, qres.WM_COMMAND, qres.INFOMENU_DISCONNECT, 0)
          return "Logout sent"
          end
          return nil
          end

          timeout = 1000

          function OnStop()
          exitflag = true
          end

          function main()
          if (hQUIK ~= 0) then
          while not exitflag do
          local result = manage_quik_connection(true, "login", "password")
          if result ~= nil then message(result, 1); end
          sleep(timeout)
          end
          else
          message("Unable to find QUIK main window handle", 1)
          end
          end
          [/lua]

    1. можно. нужно проверять, что окно создано данным квиком. либа, на которую я дал ссылку, это делает. если мое решение вам не близко, то w32.GetWindowThreadProcessId() вам в руки.

  2. Здравствуйте, пытался запустить скрипт на Квике 8 версии с обновленной библиотекой w32, но ничего не вышло. Пишет ошибку: attempt to call field 'FindWindowEx'(nil value)

          1. Если появилась нормальная w32.dll для версии 8, то получается, как и прежде можно пользоваться скриптом qlua? просто заменить старую w32.dll на новую?

  3. Добрый день.
    А можно создать консольное приложение:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    
    #include <windows.h>
    #include <strsafe.h>
     
    void ErrorExit(LPTSTR lpszFunction);
     
    HWND hLoginWnd,hServer,hLogin,hPass,hBtnOk;
     
    int main(){
     
        while (1)
        {
            hLoginWnd = FindWindow(NULL,"Идентификация пользователя");
            if (hLoginWnd)
            {
                hServer = FindWindowEx(hLoginWnd,NULL,NULL,NULL);
                if (!hServer) ErrorExit((LPTSTR)"FindWindowEx");
                hLogin = FindWindowEx(hLoginWnd,hServer,NULL,NULL);
                if (!hLogin)  ErrorExit((LPTSTR)"FindWindowEx");
                hPass = FindWindowEx(hLoginWnd,hLogin,NULL,NULL);
                if (!hPass)   ErrorExit((LPTSTR)"FindWindowEx");
                hBtnOk = FindWindowEx(hLoginWnd,NULL,NULL,NULL);
     
                SendMessage(hPass,WM_SETTEXT,NULL,(LPARAM)"PASSWORD");
     
                SetFocus(hBtnOk);
                PostMessage(hBtnOk,BM_CLICK,NULL,NULL);
            }
            Sleep(1000);
        }
     
    return 1;
    }
     
    void ErrorExit(LPTSTR lpszFunction){
        LPVOID lpMsgBuf;
        LPVOID lpDisplayBuf;
        DWORD dw = GetLastError();
     
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
                      NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0, NULL );
     
        lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,(lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));
        StringCchPrintf((LPTSTR)lpDisplayBuf,LocalSize(lpDisplayBuf) / sizeof(TCHAR),
                        TEXT("%s завершилась с ошибкой %d: %s"),lpszFunction, dw, lpMsgBuf);
        MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
     
        LocalFree(lpMsgBuf);
        LocalFree(lpDisplayBuf);
    }

    Ярлыки этого ехешника и инфо закинуть в папку автозапуска. После запуска системы эта программка будет каждую секунду пытаться выполнить вход. Логин не вводится, стоит галка "Запомнить имя"

    Доработать напильником.........

    1. КОММЕНТАРИЙ:
      А в чем же отличие????????
      авторский скрипт, для заполнения полей управленния,верхнего окна, использует функции SetWindowText.
      Однако, эта функция, работает только в пределах процесса.
      ИЗ MSDN :
      ...Однако SetWindowText не может изменить текст органа управления в другом приложении.

      Данная консолька, шлет сообщение полю управления с полученым дескриптором напрямую...

        1. Что_то переклинило во мне:

          Сколько помню себя, вижу этот пост:

          22.04.2015 12:17:42
          Добрый день.
          Работаете ли вы над созданием 64-битной версией QUIK? Или хотя бы есть ли в планах перевод версии на 64-bit?

          Zoya Vdovina
          QUIK clients support
          22.04.2015 17:29:53
          Добрый день.
          На данный момент работ в этом направлении не ведётся.

  4. Скрипт вместо Логина подставляет Пароль. А поле пароль оставляет пустым.
    Логин ввожу сюда: QUIK_LOGIN
    А пароль сюда: QUIK_PASSW
    В чем может быть ошибка?

      1. Да, внутри кавычек.

        Подскажите, вот в этих строчках:

        1
        2
        3
        4
        
         
        local hLogin = w32.FindWindowEx(hLoginWnd, 0, "", "")
                    local nPassw = w32.FindWindowEx(hLoginWnd, hLogin, "", "")
                    local nBtnOk = w32.FindWindowEx(hLoginWnd, nPassw, "", "")

        Почему напротив hLogin второй аргумент 0, а напротив nPassw → hLogin, nBtnOk → nPassw.
        Здесь нет ошибки?

  5. Привет, когда мы выходим из квика в штатном режиме или жмем кнопку "Сохранить настройки в файл...", то все супер сохраняется, а вот если у нас свет отключили или комп завис в общем аварийный выход из квика, то конфигурация не сохраняется. Вопрос можно ли с помощью этой библиотеки что то сделать, а именно автосохранение например каждые 5 минут - т.е. скрипт работает и делает сохранение конфигурации на автомате?

      1. я понимаю что ты сказал - просто я же не знаю как эти блин "кнопки" "эмулятивные" ну ты меня понял - суть то в этом - а запрос есть такой - ЛЮДЯМ надо - да я сам иной раз парюсь восстанавливать что да как - посмотри пожалуйста и тема то нужная и просто всем отдать раздать и тебя я разрекламирую еще сильнее ну а я в сторонке постою (во я борзота)

          1. Спасибо, не надо. Я тоже немного помучился и сделал.
            hWnd = FindWindow("InfoClass", NULL); // основное окно квика
            дальше ищем нужное дочернее функцией FindWindowEx() и развертываем
            ShowWindow(hWndChild, SW_SHOWNORMAL);

    1. Здравствуйте! А Вы вот эти строки видели в статье?:
      "Чтобы использовать данный скрипт, нужно в директорию, в которой установлен терминал QUIK, поместить библиотеку w32.dll, скачать которую можно по данной ссылке (не забудьте разархивировать перед помещением в папку)."

      1. Проглядел... Спасибо большое! Еще такой вопрос: очень долго не мог запустить код, в котором используются сервисные функции (getscriptPath, message и тд). Все в итоге запустилось только через добавление скрипта в QUIK. Через программу lExecutor и через командную строку запускать не удавалось, писал: attempt to call a global 'getScriptPath' (a nil value). Не подскажете, как можно запускать данные скрипты не через QUIK? Спасибо.

        1. Всегда пожалуйста.Язык QLua специально для QUIK разрабатывался, это надстройка над Lua, без квика скрипты написанные на QLua нет никакого смысла запускать, если Вам нужны обычные скрипты Lua, то установите LuaForWindows и пишите их на чистом Lua.