Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

Автоматический логин

SARCAZM

Это что за покемон?
Команда форума
Рег
5 Июн 2015
Сообщения
1,446
Реакции
1
Trovo
SARCAZM
uses SysUtils;

function ShellExecuteW(hwnd: integer; lpOperation, lpFile, lpParameters, lpDirectory: PChar; nShowCmd: integer): integer; stdcall;
external 'Shell32.dll';

function keybd_event(bVk, bScan: byte; dwFlags, dwExtraInfo: integer): integer; stdcall;
external 'user32.dll';

procedure disconnectMonitor;
const
login = 'lgn';
password = 'pwd';
gamePath = 'F:\l2gf\system\l2.exe';
begin
while Delay(3000) do begin
if Engine.Status = lsOffline then begin
print('dc');
Engine.FaceControl(0, false);
Delay(1000);
Engine.GameClose;
Delay(1000);
ShellExecuteW(0, 'open', PChar(gamePath), nil, nil, 0);
Delay(10000);
enterText(login);
Engine.UseKey('Tab');
Delay(300);
enterText(password);
Delay(300);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(10000);
Engine.FaceControl(0, true);
end;
end;
end;

procedure enterText(const text: string);
var
i: cardinal;
upperCase: boolean;
begin
for i:= 1 to length(text) do begin
if isDigit(text) then
Engine.UseKey(text)
else begin
upperCase:= text = UpCase(text);
if upperCase then begin
keybd_event(20, 0, 1, 0);
keybd_event(20, 0, 2, 0);
Engine.UseKey(text);
delay(10);
keybd_event(20, 0, 1, 0);
keybd_event(20, 0, 2, 0);
end else
Engine.UseKey(text);
end;
Delay(50);
end;
end;

function isDigit(ch: char): boolean;
const
digits = '013456789';
var
i: cardinal;
begin
result:= false;
for i:= 0 to length(digits) do
if digits = ch then begin
result:= true;
exit;
end;
end;

begin
Script.NewThread(@disconnectMonitor);
end.
Скрипт использует WinAPI-шные функции.
Имитирует нажатие клавиш на клавиатуре, по буквам вводя логин, потом нажимает tab (переводит на 2 строку логина, туда где пароль) и так же по 1 букве вводит пароль.
Само собой, в коде нужно заменить hex-коды нажимаемых клавиш на свои.

function keybd_event(bVk,bScan:byte;dwFlags,dwExtraInfo: integer): integer; stdcall; external 'user32.dll';
function SetCursorPos(x, y : integer): boolean; stdcall; external 'user32.dll';
function mouse_event(dwFlags, dx, dy, dwData: byte; dwExtraInfo: integer): void; stdcall; external 'user32.dll';

procedure pressKey(hexCode: BYTE);
begin
keybd_event(hexCode, 45, 1, 0 );
delay(200);
end;

procedure mouseClick(x, y, _delay : integer);
begin
SetCursorPos(x, y);
mouse_event($2, 0, 0, 0, 0);
delay(_delay);
mouse_event($4, 0, 0, 0, 0);
end;

begin
//login
pressKey($4C);
pressKey($4F);
pressKey($47);
pressKey($49);
pressKey($4E);
//press tab
pressKey($09);
//pwd
pressKey($50);
pressKey($57);
pressKey($44);
//enter
pressKey($0D);
delay(1000);
mouseClick(920, 740, 3000); //клик на соглашение
delay(1000);
mouseClick(960, 550, 1000); // клик на "принять сервер"
delay(1000);
mouseClick(960, 951, 1000); // кнопка старта на выборе чара. Хотя с этого момента можно уже использовать стандартные функции адреналина.
end.
Список KeyCode: http://excelvba.ru/articles/KeyCode
Взято с TopHope
 
Кто подскажет как вводить заглавные и прописные символы ?

Пытался сделать так
pressKey($14); // нажатие CapsLock
DELAY(1000);
pressKey($55); // буква
DELAY(1000);
pressKey($14); // еще раз CapsLock
DELAY(1000);

после первого нажатия на CapsLock он включается и буква вводится заглавная но при повторном нажатии он не выключается и продолжается ввод заглавных символов.
Или как нажать сочетание клавиш ? Например Shift+буква
 
http://excelvba.ru/articles/KeyCode
на всякий случай, 0x08 пишем как $08 ^_^

кстате, у меня сомнения закрались по поводу координат, не указанно для какого разрешения/где должно быть окно. Походу координаты кнопок под свое разрешение надо пилить, или вангую - будет мазать(не что-либо указывающее на привязку к окну л2)
Код:
mouseClick(920, 740, 3000); //клик на соглашение
delay(1000);
mouseClick(960, 550, 1000); // клик на "принять сервер"
delay(1000);
mouseClick(960, 951, 1000); // кнопка старта на выборе чара. Хотя с этого момента можно уже использовать стандартные функции адреналина.
 
@Krickt, Ну насчет универсальности я когда-то писал под себя похожий скрипт , он с костылем был.
Ввел процедуру, в которую передавал строкук для посыки окну, потом разбив их посимвольно через case разбирал и посылал уже каждую кнопку отдельно через PostMessage. Хотя то ли в шарпе, то ли в плюсах можно узнать код буквы просто обратившись к ней как к int типу. Хотя я сейчас наплету конечно :Kappa:
 
@SARCAZM, угу, направление PostMessage верное. Я хоть этим и интересовался, но не пробовал...

В Delphi так тоже можно, преобразовывать тип Char(букву) в Word(код символа).
Для этого есть функция ord(ch: char): word;, модуль System.
Можно из кода символа в символ, тогда chr(int: word): char;

Короче с case ты зря парился. :Kappa:
 
нашел очень старый скрипт на вставку LSов взятый из какого-то форума который еще и доводить до ума пришлось, очень похож
function keybd_event(bVk,bScan:byte;dwFlags,dwExtraInfo: integer): integer; stdcall; external 'user32.dll';
function SetCursorPos(x, y : integer): boolean; stdcall; external 'user32.dll';
function mouse_event(dwFlags, dx, dy, dwData: byte; dwExtraInfo: integer): void; stdcall; external 'user32.dll';

procedure pressKey(hexCode: BYTE);
begin
keybd_event(hexCode, 45, 1, 0 );
delay(200);
end;

procedure mouseClick(x, y, _delay : integer);
begin
SetCursorPos(x, y);
mouse_event($0002, 0, 0, 0, 0);
delay(_delay);
mouse_event($0004, 0, 0, 0, 0);
end;

procedure augments;
var obj: TL2Effect;
begin
while
(SkillList.ByID(3241, obj)) or
(SkillList.ByID(3133, obj)) do pause();
while user.Sitting do pause();

end;

begin
mouseClick(140,50,50);// click in window
delay(1000);
while Engine.Status = lsOnline do begin
delay(100);
// Augument // >
mouseClick(325,200,500); ///mouse click Weapon
SetCursorPos(101, 104); ///mouse move Weapon socet
delay(1000);
mouseClick(372,200,500); ///mouse click LS
SetCursorPos(185, 104); ///mouse move LS socet
delay(1000);
mouseClick(410,200,500); ///mouse click GEM
SetCursorPos(145, 146); ///mouse move GEM socet
delay(2000);
mouseClick(100,275,50); ///mouse click "Augument"
delay(4000);
mouseClick(100,275,50); ///mouse click "Continue"
delay(500);
// <

augments; ///and check procedure augments for skill detect

//Remove LS // >
mouseClick(325,200,300); ///mouse click Weapon
SetCursorPos(139, 411); ///mouse move Weapon socet
delay(1000);
mouseClick(92,540,5); ///mouse click "Remove"
delay(50);
SetCursorPos(148, 403); /// позырить че ткнул
delay(4000);
mouseClick(92,540,400); ///mouse click "Continue"
delay(500);
// <
end;
end.
 
есть ли такое условие, которое будет обнаруживать дисконект от сервера?
 
@ane13, вроде так
Код:
if (Engine.Status != lsOnline) then
begin
   // Если мы дисконнектнуты, выполняем действия
   // в этом блоке
end;
 
еще вопрос) можно ли как-то прописать координаты курсора относительно самого окна л2 а не всего экрана компьютера?
 
зачем координаты курсора, если лицензионное соглашение можно убрать, а чтобы выбрать сервер достаточно ткнуть enter (да впринципе, eula так же скипается enter-ом)?
и зачем эти велосипеды с keybdevent, если есть более функциональная и юзабельная обертка над sendmessage в виде tl2control.usekey ?
 
Есть уже специально написанный софт для этого
При нажатии F1 - прописывает логин, F2 - пароль, F3 - следующий аккаунт
Если найду на компе, то позже залью в раздел софта
 
как сделать что бы после дисконекта заходило без вода логина и паса
 
Ещё бы в комплект запуск клиента добавить)
 
Ой вы чего был же нааамного лучше скрипт.
Не нужно активное окно клики мышкой и т.п.
Код:
uses SysUtils;

function ShellExecuteW(hwnd: integer; lpOperation, lpFile, lpParameters, lpDirectory: PChar;  nShowCmd: integer): integer; stdcall;
  external 'Shell32.dll';

function keybd_event(bVk, bScan: byte; dwFlags, dwExtraInfo: integer): integer; stdcall;
  external 'user32.dll';

procedure disconnectMonitor;
const
  login = 'lgn';
  password = 'pwd';
  gamePath = 'F:\l2gf\system\l2.exe';
begin
  while Delay(3000) do begin  
    if Engine.Status = lsOffline then begin
      print('dc');
      Engine.FaceControl(0, false);
      Delay(1000);
      Engine.GameClose;
      Delay(1000);
      ShellExecuteW(0, 'open', PChar(gamePath), nil, nil, 0);
      Delay(10000);
      enterText(login);
      Engine.UseKey('Tab');
      Delay(300);
      enterText(password);
      Delay(300);
      Engine.UseKey('Enter');
      Delay(2000);
      Engine.UseKey('Enter');
      Delay(2000);
      Engine.UseKey('Enter');
      Delay(2000);
      Engine.UseKey('Enter');
      Delay(10000);
      Engine.FaceControl(0, true);
    end;
  end;
end;

procedure enterText(const text: string);
var
  i: cardinal;
  upperCase: boolean;
begin
  for i:= 1 to length(text) do begin
    if isDigit(text[i]) then
      Engine.UseKey(text[i])
    else begin
      upperCase:= text[i] = UpCase(text[i]);
      if upperCase then begin
          keybd_event(20, 0, 1, 0);
          keybd_event(20, 0, 2, 0);
          Engine.UseKey(text[i]);
          delay(10);
          keybd_event(20, 0, 1, 0);
          keybd_event(20, 0, 2, 0);
      end else
        Engine.UseKey(text[i]);
    end;
    Delay(50);
  end;
end;

function isDigit(ch: char): boolean;
const
  digits = '013456789';
var
  i: cardinal;
begin
  result:= false;
  for i:= 0 to length(digits) do
    if digits[i] = ch then begin
      result:= true;
      exit;
    end;
end;
                        
begin
  Script.NewThread(@disconnectMonitor);
end.
 
while Delay(3000) do begin тут выдаёт ошибку :pandacry:
 
Ivanius написал(а):
Ой вы чего был же нааамного лучше скрипт. Не нужно активное окно клики мышкой и т.п.
Эт получается при вылитании дисконекта сам обратно заходит и дальше продолжает шпилить?
 
Назад
Сверху