  | 
	
	
		
	
	
    
        
            
             
            06.12.2010, 01:01
            
            
         | 
        
             
            #1
            
         | 
    
 
    
    
  
    | 
    
     | 
     
  
    | 
    
     | 
    
    
     | 
   
  
    
        Разведчик  
     | 
     
 
    
      
  
            
    
      
    
            
                 Регистрация: 24.08.2010  
                
                
                
                 Сообщений: 12
                   
 Популярность: 26  
                  
	 Сказал(а) спасибо: 5  
	
		
			
				Поблагодарили 8 раз(а) в 5 сообщениях
			
		
	 
     
 
             
                
               
                
       
                  
     | 
    
    
    
        
        
            
            
                 
                Смена пользователя Skype
             
             
            
        
        
        
            
               
    Выкладываю из своих сорцов способ смены пользователя Skype: 
1. Пролог
Решил написать небольшую статью опять про тот-же Skype.  
На этот раз я автоматизирую смену аккаунтов Skype с помощью WinAPI, т.к. с помощью обертки от девелоперов Skype ничего сделать не получится (Будем идти через зад).
 2. Действия
Я не буду заострять внимание на создании проекта, расстановки баттонов, мемо и т.д., а сразу начну по-делу. Для того, чтобы завершить процесс (в нашем случае Skype) я использую следущую функцию, найденную на просторах инета:
 
	PHP код: 
	
		
			
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_TERMINATE, BOOL(0),
         FP.th32ProcessID), 0));
     Co := Process32Next(FS, FP);
   end;
   CloseHandle(FS);
 end; 
 
		
	 
 Далее интересснее. Функция запуска Skype:
	PHP код: 
	
		
			
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.UnicodeClass'), PChar('Skype')),
     WM_KEYDOWN, VK_RETURN, 0);
 end; 
 
		
	 
 Далее самый сок, функция смены пользователя:
 
	PHP код: 
	
		
			
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. Как, что и зачем
   // Описано в статье: 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;
   // ВСЕЕЕ!!!!
 end; 
 
		
	 
 3. Заключение
Ну вот и все… Я научил кого-либо автоматизировать авторизацию в Skype! 
В заключении скажу, что любое использование материалов с данного сайта, без моего соглашения и с отсутствием с ссылкой на данный веб-сайт, будет караться!
 
Удачи в кодинге!
 
(c) Zemus (aka AlexTheC0d3r)
     
          
        
        
        
        
        
        
        
     | 
 
    | 
        
        
        
        
         
     | 
    
    
    
        
        
        
        
             
        
        
        
        
        
        
        
            
        
        
        
     | 
 
 
 
	
		
			| 
				
					Пользователь сказал cпасибо:
				
				
				
			 | 
			 | 
		 
	 
  
  
	 
	
		 
	 
 
 
	
		
	
	
	
	
	
		
	
		 
		Ваши права в разделе
	 | 
 
	
		
		Вы не можете создавать новые темы 
		Вы не можете отвечать в темах 
		Вы не можете прикреплять вложения 
		Вы не можете редактировать свои сообщения 
		 
		
		
		
		
		HTML код Выкл. 
		 
		
	  | 
 
 
	 | 
	
		
	 | 
 
 
 
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 10:34. 
		 
	 
 
 | 
  |