Авторские статьи Смена пользователя Skype

Discussion in 'Статьи' started by AlexTheC0d3r, 12 May 2010.

  1. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Выкладываю из своих сорцов способ смены пользователя Skype:


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

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

    PHP:
    function KillTask(ExeFileNamestring): integer;
    const
      
    PROCESS_TERMINATE = $0001;
    var
      
    CoBOOL;
      
    FSTHandle;
      
    FPTProcessEntry32;
    begin
      result 
    := 0;
      
    FS := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS0);
      
    FP.dwSize := Sizeof(FP);
      
    Co := Process32First(FSFP);
      while 
    integer(Co) <> do
      
    begin
        
    if ((UpperCase(ExtractFileName(FP.szExeFile)) = UpperCase(ExeFileName)) or
          (
    UpperCase(FP.szExeFile) = UpperCase(ExeFileName))) then
          Result 
    := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATEBOOL(0),
            
    FP.th32ProcessID), 0));
        
    Co := Process32Next(FSFP);
      
    end;
      
    CloseHandle(FS);
    end;
    Далее интересснее. Функция запуска Skype:

    PHP:
    function runSkype(sLoginstringsPassstring): Boolean;
    var
      
    // Переменные для хранения дескрипторов окон
      
    hParenthChildHWND;
      
    // Переменная счетчика цикла
      
    iinteger;
    begin
      
    // Запускаем Skype. Не забываем указать путь к Skype на машине...
      // Можно считывать его автоматически по ключу реестра, который находится по адресу:
      // HKEY_LOCAL_MACHINE\SOFTWARE\Skype\Phone\SkypePath
      
    WinExec(PChar('C:\Program Files\Skype\Phone\Skype.exe' ' /secondary'),
        
    SW_NORMAL);
      
    hParent := 0;
      
    := 0;
      
    // Пока нет окна для входа в учетку
      
    while hParent do
      
    begin
        inc
    (i);
        
    hParent := FindWindow(PChar('TLoginForm.UnicodeClass'), PChar('Skype'));
        
    Sleep(1000);
        
    // Если его нет более ~20 секунд, выходим из функции
        
    if 20 then
        begin
          result 
    := false;
          Exit;
        
    end;
      
    end;
     
      
    //Добираемся до наших полей Логин и Пароль
      
    hChild := FindWindowEx(hParent0PChar('TLoginControl'), nil);
      
    hParent := hChild;
      
    hChild := FindWindowEx(hParent0,
        
    PChar('TNavigableTntComboBox.UnicodeClass'), nil);
      
    // Вводим логин
      
    SendMessage(hChildWM_SETTEXT0lparam(PChar(sLogin)));
      
    hChild := FindWindowEx(hParent0PChar('TNavigableTntEdit.UnicodeClass'),
        
    nil);
      
    // Вводим пароль
      
    SendMessage(hChildWM_SETTEXT0lparam(PChar(sPass)));
      
    // И, вуаля, посылаем Return(Enter) в само окно чтобы подтвердить логин!
      
    PostMessage(FindWindow(PChar('TLoginForm.UnicodeClass'), PChar('Skype')),
        
    WM_KEYDOWNVK_RETURN0);
    end;
    Далее самый сок, функция смены пользователя:

    PHP:
    procedure changeAcc;
    var
      
    loginpasscurrHandlestring;
      
    // Дескриптор хранения подтверждения авторизации
      
    hAcceptHWND;
      
    iInteger;
    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. Как, что и зачем
      // Описано в статье: http://zemus.us/05/obxod-avtorizacii-skypeapi.html
      skype.Attach(8, false);
      hAccept := 0;
      i := 0;
      while hAccept = 0 do
      begin
        Inc(i);
        hAccept := FindWindowEx(FindWindow(PChar('
    tSkMainForm.UnicodeClass'), 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;
     
      // Ждем пока пользователь не будет онлайн
      while not skype.CurrentUser.OnlineStatus = SKYPE4COMLib_TLB.olsOnline do
      begin
        Sleep(100);
      end;
      // ВСЕЕЕ!!!!
    end;
    3:Заключение
    Ну вот и все… Я научил кого-либо автоматизировать авторизацию в Skype!
    В заключении скажу, что любое использование материалов с данного сайта, без моего соглашения и с отсутствием с ссылкой на данный веб-сайт, будет караться!

    Удачи в кодинге!)
    (c) Zemus (aka AlexTheC0d3r) http://zemus.us/
    http://zemus.us/05/smena-polzovatelya-skype.html
     
    3 people like this.
  2. Sin3v

    Sin3v Banned

    Joined:
    16 Jul 2008
    Messages:
    11
    Likes Received:
    95
    Reputations:
    9
    Вообще зачет, большое спасибо алексу)
    Щас начну SinMobile обновлять)