PDA

Просмотр полной версии : [Статья] Смена пользователя Skype


Tem1q
06.12.2010, 00:01
Выкладываю из своих сорцов способ смены пользователя Skype:


1. Пролог
Решил написать небольшую статью опять про тот-же Skype.
На этот раз я автоматизирую смену аккаунтов Skype с помощью WinAPI, т.к. с помощью обертки от девелоперов Skype ничего сделать не получится (Будем идти через зад).

2. Действия
Я не буду заострять внимание на создании проекта, расстановки баттонов, мемо и т.д., а сразу начну по-делу. Для того, чтобы завершить процесс (в нашем случае Skype) я использую следущую функцию, найденную на просторах инета:

function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE = $0001;
var
Co: BOOL;
FS: THandle;
FP: TProcessEntry32;
begin
result := 0;
FS := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FP.dwSize := Sizeof(FP);
Co := Process32First(FS, FP);
while integer(Co) <> 0 do
begin
if ((UpperCase(ExtractFileName(FP.szExeFile)) = UpperCase(ExeFileName)) or
(UpperCase(FP.szExeFile) = UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMI NATE, BOOL(0),
FP.th32ProcessID), 0));
Co := Process32Next(FS, FP);
end;
CloseHandle(FS);
end;

Далее интересснее. Функция запуска Skype:

function runSkype(sLogin: string; sPass: string): Boolean;
var
// Переменные для хранения дескрипторов окон
hParent, hChild: HWND;
// Переменная счетчика цикла
i: integer;
begin
// Запускаем Skype. Не забываем указать путь к Skype на машине...
// Можно считывать его автоматически по ключу реестра, который находится по адресу:
// HKEY_LOCAL_MACHINE\SOFTWARE\Skype\Phone\SkypePath
WinExec(PChar('C:\Program Files\Skype\Phone\Skype.exe' + ' /secondary'),
SW_NORMAL);
hParent := 0;
i := 0;
// Пока нет окна для входа в учетку
while hParent = 0 do
begin
inc(i);
hParent := FindWindow(PChar('TLoginForm.UnicodeClass'), PChar('Skype'));
Sleep(1000);
// Если его нет более ~20 секунд, выходим из функции
if i = 20 then
begin
result := false;
Exit;
end;
end;

//Добираемся до наших полей Логин и Пароль
hChild := FindWindowEx(hParent, 0, PChar('TLoginControl'), nil);
hParent := hChild;
hChild := FindWindowEx(hParent, 0,
PChar('TNavigableTntComboBox.UnicodeClass'), nil);
// Вводим логин
SendMessage(hChild, WM_SETTEXT, 0, lparam(PChar(sLogin)));
hChild := FindWindowEx(hParent, 0, PChar('TNavigableTntEdit.UnicodeClass'),
nil);
// Вводим пароль
SendMessage(hChild, WM_SETTEXT, 0, lparam(PChar(sPass)));
// И, вуаля, посылаем Return(Enter) в само окно чтобы подтвердить логин!
PostMessage(FindWindow(PChar('TLoginForm.UnicodeCl ass'), PChar('Skype')),
WM_KEYDOWN, VK_RETURN, 0);
end;

Далее самый сок, функция смены пользователя:

procedure changeAcc;
var
login, pass, currHandle: string;
// Дескриптор хранения подтверждения авторизации
hAccept: HWND;
i: Integer;
begin
{ По желанию можно удалить историю аккаунта Skype полностью
С которого он был авторизирован до закрытия
currHandle := getAppDataPath + 'Skype\' + skype.CurrentUser.Handle +
'\main.db'; }
// Убиваем процессы
KillTask('skype.exe');
KillTask('skypePM.exe');
{ Как раз таки само удаление этого файла main.db
if FileExists(currHandle) then
DeleteFile(currHandle); }

login := 'Ваш логин';
pass := 'Ваш пароль';

// Если логин не удался, выходим из функции
if not runSkype(login, pass) then
Exit;

// Пока не можем приаттачиться, ждем
while not skype.AttachmentStatus = SKYPE4COMLib_TLB.apiAttachAvailable do
begin
Sleep(100);
end;

// Далее обходим авторизацию Skype. Как, что и зачем
// Описано в статье: [Ссылки могут видеть только зарегистрированные и активированные пользователи]
skype.Attach(8, false);
hAccept := 0;
i := 0;
while hAccept = 0 do
begin
Inc(i);
hAccept := FindWindowEx(FindWindow(PChar('tSkMainForm.Unicode Class'), nil),
0, PChar('TZapCommunicator'), nil);
sleep(1000);
if i = 40 then
Break;
end;

PostMessage(hAccept, WM_KEYDOWN, VK_TAB, 0);
PostMessage(hAccept, WM_KEYDOWN, VK_RETURN, 0);

// Ждем удачного аттача
while not skype.AttachmentStatus = SKYPE4COMLib_TLB.apiAttachSuccess do
begin
Sleep(100);
end;
// ВСЕЕЕ!!!!
end;

3. Заключение
Ну вот и все… Я научил кого-либо автоматизировать авторизацию в Skype!
В заключении скажу, что любое использование материалов с данного сайта, без моего соглашения и с отсутствием с ссылкой на данный веб-сайт, будет караться!

Удачи в кодинге!

(c) Zemus (aka AlexTheC0d3r)