Блог им. kulakov74

Автологин для квика на javascript

Надоело логиниться в квик каждый день по 10 раз, всё время за логином-паролем лазить в файл и копипастить. Сделал скрипт, к-й это автоматизирует. Работает на javascript, так что от версии Windows зависеть не должно.

Сам скрипт кладётся в файл типа C:\Util\Js\Q.js или куда угодно, только не у всех на виду. На этот скрипт делается ярлык, он кладётся на рабочий стол куда-то в угол, и ему прописывается горячая клавиша типа Ctrl-Alt-X или любая другая буква. После этого вы запускаете квик, появляется окно логина, нажимаете Ctrl-Alt-X и через полсекунды оно срабатывает. Важно, что ярлык должен быть на рабочем столе, иначе горячая клавиша не работает. 

Вообще вводить данные в другую программу можно двумя способами: copy&paste и эмуляция клавиш. Я в данном случае пошёл по второму пути, хотя и первый тоже реализуем и даже чем-то лучше, т.к. там не надо парится с языком. Из-за этого, если вы хотите использовать этот скрипт, нужно проверить ряд моментов и при необходимости внести исправления. 

⦁ В варианте, к-й я выкладываю, логин/пароль должны быть прописаны прямо в скрипте, но можно и читать из файла. У меня дома рабочий вариант вообще ищет их в rtf-файле где много всяких данных. Если логин/пароль положить во внешний файл, то их можно конечно и закодировать. 
⦁ Чтобы отработало правильно, надо чтобы текущий язык ввода (по сути язык ввода по умолчанию в системе) в квике был русский. Если это не так, то вначале надо поменять bEngSystem=true
⦁ У меня логин русский, а пароль английский, так что между ними производится переключение клавиатуры. Если у вас что угодно из этого не так, надо в нужных местах убрать или добавить переменную LangSwitch, к-я содержит клавиши «Alt-Shift». Если у вас опять же язык переключается по-другому, там надо прописать другие клавиши.
⦁ У меня вводится и логин и пароль. Если у вас вводится только пароль, то поменять тоже нужно и не сложно. 

В общем, можно было бы написать более универсальную версию, чтобы определяеть, когда надо переключать языки автоматом, но мне не нужно, а кому надо разберутся. Или же можно переписать через copy&paste. Делать полностью автоматизированный логин, когда вообще ничего нажимать не нужно я не хочу, потому что тогда любой, кто получит доступ к вашему компьютеру сможет получить доступ и к вашим деньгам, просто кликнув на квике. Так хоть комбинацию клавиш знать надо. 

bEngSystem=false; //язык системы по умолчанию
LangSwitch="%+!";

WshShell=WScript.CreateObject("WScript.Shell");
InitKeys();
KeysSeq=GetData();
if (KeysSeq) EnterData(KeysSeq);

//------------------------------------------------------------------------

function GetData(){
//(Возможно) читаем данные из файла и преобразуем в последовательность клавиш
//"!" означает паузу для специальных клавиш, к-е требуют время обработки
var DataFN, oStream, Data, Pos1, Pos2, Line;

if (0){ //данные в файле
	DataFN='C:/...';
	FSO=new ActiveXObject("Scripting.FileSystemObject"); 
	oStream=FSO.OpenTextFile(DataFN, 1); Line=oStream.ReadAll(); oStream.Close();
	}
else Line='имя:password';

//Tab должен быть и вначале, потому что при фокусировке квика текущее поле - список серверов
Line="{Tab}!"+Line.replace(/:/g, "{Tab}!"+LangSwitch); 
//Переключение языка в самом начале если логин русский
if (bEngSystem) Line=LangSwitch+Line; 
//конвертация русских символов
Line=Line.replace(/[А-Яа-я]/g, RusCB);

return Line;
}

function EnterData(KeysSeq){
var ret;

WScript.Sleep(300); //Пауза позволяет убрать руки от клавиатуры до того, как скрипт начал работать

ret=WshShell.AppActivate("Идентификация пользователя"); if (ret==0) return;
WScript.Sleep(100); 

aSeq=KeysSeq.split('!');
for(var i=0; i<aSeq.length; i++){
	Seq=aSeq[i]; 
	if (Seq!=''){
		WshShell.SendKeys(Seq); WScript.Sleep(100); 
		}
	}

WshShell.SendKeys("{Enter}");
//WshShell.SendKeys("%+"); WScript.Sleep(100); //switch to Russian
//WshShell.SendKeys("{Tab}"); WScript.Sleep(100); 
//WshShell.SendKeys("^V"); WScript.Sleep(100); //paste
}

function RusCB(s){
var n, ch, i;

if (s.length==1){
	ch=s;
	}
else{ //rtf
	//код символа в Ansi
	s=s.substr(2); n=parseInt(s, 16); ch=String.fromCharCode(n);
	}

//Преобразовать в Utf и найти в русских клавишах
i=RusKeys.indexOf(Ansi2Utf(ch));
//Найти соотв. латинскую клавишу
return LatKeys.charAt(i);
}

//------------------------------------------------------------------------

function Ansi2UtfN(Code){
if (Code>=192 && Code<=255) Code+=848;
else if (Code==168) Code=1025; else if (Code==184) Code=1105;
return String.fromCharCode(Code);
}

function Utf2AnsiN(Code){
if (Code>=1040 && Code<=1103) Code-=848;
else if (Code==1025) Code=168; else if (Code==1105) Code=184;
return String.fromCharCode(Code);
}

function Ansi2Utf(Str, bRev){
var Buf='', Ch, Res='', c=0, L, n, f;

L=Str.length; f=(!bRev ? Ansi2UtfN : Utf2AnsiN);
for(n=0; n<L; n++){
	Ch=Str.charCodeAt(n); Buf+=f(Ch); c++;
	if (c>=100){Res+=Buf; Buf=''; c=0;}
	}
return Res+Buf;
}

//------------------------------------------------------------------------

function alert(S){WScript.Echo(S);}

function InitKeys(){
//Проблема в том, что влияет текущий язык в той программе!
//Можно нажимать только английские клавиши. Если надо нажимать русские, надо вычислить какие им соответствуют английские
RusKeys="йцукенгшщзхъфывапролджэячсмитьбю"; LatKeys="qwertyuiop[]asdfghjkl;'zxcvbnm,.";
RusKeys=RusKeys+RusKeys.toUpperCase(); LatKeys=LatKeys+LatKeys.toUpperCase();
}

Есть другие решения: Автологин для Quik 8 x64.
  • обсудить на форуме:
  • QUIK
★15
31 комментарий
Можно и на QLua написать. Просто запускаешь Квик и он сам логинится.

— Автологин терминала QUIK
— © qui2dde.ru/
— Версия: 1.0
ScriptPath = getScriptPath()
package.cpath = ScriptPath.."\\w32.dll;"
local w32 = require(«w32»)

— логин и пароль для терминала
QUIK_LOGIN = "****"
QUIK_PASSW = "****"


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 hServer = w32.FindWindowEx(hLoginWnd, 0, "", "")
local hLogin = w32.FindWindowEx(hLoginWnd, hServer, "", "")
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)

end
end

end
end

avatar
Karim, только вот у меня квик при старте сбрасывает все загруженные скрипты то?
avatar
Petr S, Сочувствую, у меня все работает нормально.
avatar
Petr S, почему? у меня не сбрасывает 
avatar
Petr S, по всей видимости Вы запускаете QUIK не через info.exe, а батником, который удаляет все log и dat файлы, такие батники брокера любят подбрасывать клиентам, считается что ускоряет прогрузку терминала. Только вот инфа по загруженным скриптам тоже в датнике лежит, потому скрипты у Вас и сбрасываются. Запускайте просто сам экзешник, и будет Вам счастье.
avatar
Karim, пишет ошибку
Syntax error while compiling D:\Quik\login.lua: D:\Quik\login.lua:3: unexpected symbol near '«'
avatar
VpnS, У вас в третей строке ошибка. Уберите символ '«'. И не редактируйте скрипт Блокнотом, квик ругается. Используйте Notepad++
avatar
Karim, да, открыл в блокноте
ругался на первую строку так же, где комментарии к проге --

этот символ есть в строке local w32 = require(«w32»)
avatar
VpnS, А библиотека эта у вас есть w32.dll?
avatar
Karim, создал и сохранил файл в Notepad++, теперь ругается на unexpected symbol near 'В'
avatar
VpnS, И в какой строке этот символ?

avatar
Karim, я скопировал код сверху
только логин и пароль вставил
avatar
VpnS, Скрин скинь, как квик ругается. И библиотека w32.dll у вас есть?
avatar
Karim, видимо нет
где взять и куда забросить?
avatar
VpnS, в личку почту скинь, я отправлю. Или на сайте поищи, адрес в начале скрипта.
avatar
Karim, а скидывать в тело программы квика?
avatar
VpnS, zonalka@bk.ru это моя почта. Отправь что нибудь, я скину библиотеку.
avatar
Karim, я библиотеку отсюда взял
quik2dde.ru/static-img/78/w32.dll.zip

avatar
VpnS, и красивые кавычки « надо заменить на обычные ", причём везде, хотя не факт.
avatar
СергейК, поменял кавычки, скрип запустился, ошибок нет
но не соединяет, вообще ничего не происходит
avatar
VpnS, ну т.к. скрипт не мой и я вообще в Lua не разбираюсь, то помочь не могу, можете попробовать мой скрипт, если ещё нет. 
avatar
VpnS, наверняка кодировка UTF-8 и надо просто сохранить в Ansi.
avatar
Самый простой способ:
система\соединение\ 
поставить галочку восстанавливать связь автоматически.
avatar
Lone Wolf, не, это работает только когда соединение рвётся и потом само восстанавливается. Ну или если у вас квик запущен всегда, такой сценарий тоже возможен. А я когда не нужен сразу закрываю. 
avatar
А какой автологин надо запускать чтобы квик сам логинился и автоматом сам по себе начинал деньги на счёт зарабатывать?
avatar
Technotrade, это вам нужно робота в Сочах прикупить )))
avatar
Людям приходится выдумывать костыли, в то время как в любых нормальных терминалах запоминание логина пароля есть уже как само собой разумеющееся
avatar
Это нарушение правил информационной безопасности!!! Точно такое же как и запоминание пароля терминалом! И еще если пользуетесь пунто свитчером, то ваши пароли также могут утечь в неизвестном направлении.
avatar
Тоже делал подобное на C#, логин и пароль хранятся в Environment Variables, код тут — github.com/dmitryy/QuikLauncher
avatar

теги блога СергейК

....все тэги



UPDONW
Новый дизайн