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

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

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

В последних версиях терминала изменилось окно ввода логина и пароля, чтобы этот скрипт мог с ним работать нужно заменить три строки 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: 80 комментариев

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

    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) &amp;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
          Добрый день.
          На данный момент работ в этом направлении не ведётся.

  2. Скрипт вместо Логина подставляет Пароль. А поле пароль оставляет пустым.
    Логин ввожу сюда: 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.
        Здесь нет ошибки?

  3. Привет, когда мы выходим из квика в штатном режиме или жмем кнопку "Сохранить настройки в файл...", то все супер сохраняется, а вот если у нас свет отключили или комп завис в общем аварийный выход из квика, то конфигурация не сохраняется. Вопрос можно ли с помощью этой библиотеки что то сделать, а именно автосохранение например каждые 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.