Skype API. Библиотека Skype4COM. Работа с контактами

8 минут на чтение

Ну что, теперь в Skype API немного поговорим о контактах, как их вообще можно получить в свой интерфейс и как им отправлять сообщения. Именно в данной статье я хотел бы рассказать:

  • получение списка контактов
  • поиск контактов
  • отправка сообщения определенному пользователю

Вообще, если честно, то можно получить список контактов и отправить им сообщения на основе разных классов, но мы воспользуемся одним. Я вот, только пока не решил: мне делать на каждую статью про Skype API отдельный исходник или все в одном, как, например в VK API. Ну что, также мы в этой статье рассмотрим, как можно правильно получить статус подключения нашего приложения к самому Skype API.

Все таки, я решил использовать для всех статей один и тот же проект. В нашем проекте я создал новую форму и на ней разместил следующие компоненты (все видно на приложенном скриншоте):


По нажатию на кнопку «Получить список контактов» мы будем в компонент TListBox получать список ников, которые присутствует у Вас. По нажатию на кнопку «Посмотреть информацию» мы будем выводить более подробную информацию по каждому нику: имя, сайт, местоположение, телефон и так далее. По нажатию на кнопку «Отправить» мы будем отправлять сообщение (текст сообщения находится в Memo2), выделенному нику в TListBox. По нажатию на кнопку «Начать» мы будем производить поиск пользователей, которые Вы ввели в TEdit.

Для начала мы приступим к тому, что подключимся к нашему API и будем определять статус подключения. Для этого на событие OnCreate нашей новой формы мы напишем следующий код:

procedure TForm2.FormCreate(Sender: TObject);
begin
  ActiveX.CoInitialize(nil);
  Skype := SKYPE4COMLib_TLB.TSkype.Create(self);
  Skype.OnAttachmentStatus := SkypeAttachmentStatus;
  Skype.OnAsyncSearchUsersFinished := MyAsyncSearchUsersFinished;
  Position := poScreenCenter;
  Memo1.ScrollBars := ssVertical;
  Edit1.Text := '';
  Skype.Attach(8, False);
end;

Вначале мы, на всякий случай, инициализируем библиотеку COM, после чего задаем Skype-объекту, наши методы, про которые мы поговорим немного позже, ну и дальше подключаемся к Skype API и делаем небольшие настройки. Если запустить наше приложение и вызвать данную форму, и разрешить доступ к нашему приложение в Skype, то в Memo1 начнет отображаться статус нашего подключения к Skype API.

Теперь, давайте опишем следующие процедуры, которые нам понадобятся для работы:

Procedure MyAsyncSearchUsersFinished(Sender: TObject;
    Cookie: Integer; Const pUsers: IUserCollection);
    Procedure StartAsyncSearch;
    Procedure SkypeAttachmentStatus(Sender: TObject; Status: TOleEnum);

Теперь немного о процедуре SkypeAttachmentStatus, которые определяет статус подключения к API Skype. Все очень просто, она имеет следующий вид:

procedure TForm2.SkypeAttachmentStatus(Sender: TObject; Status: TOleEnum);
begin
 Memo1.Lines.Add('Статус подключения: ' + Skype.Convert.AttachmentStatusToText(Status));
 if Status = apiAttachAvailable Then Skype.Attach(8, false);
end;

Эти все процедуры по поиску контактов, я взял с официальной документации. Остальное мы сделаем сами, а именно из Skype получим список ников в свой интерфейс, а также попробуем отправить сообщения. Теперь идем дальше, процедура MyAsyncSearchUsersFinished вызывается тогда, когда Skype завершает поиск контактов, то есть будет выдан результат найден тот или иной пользователь. Она выглядит следующим образом:

procedure TForm2.MyAsyncSearchUsersFinished(Sender: TObject;
  Cookie: Integer; const pUsers: IUserCollection);
Var I : Integer;
Begin
  if pUsers.Count > 0 Then
  Begin
    Memo1.Lines.Add('Search no. ' + IntToStr(Cookie) + ' found ' + IntToStr(pUsers.Count) + ' users');
    For I := 1 to pUSers.Count do
     Memo1.Lines.Add(pUSers[I].Handle);
  End
   Else Begin
     Memo1.Lines.Add('Search no. ' + IntToStr(Cookie) + ' found  no matching users');
   End;
end;

Ну и теперь самая главная процедура, которая осуществляет непосредственно поиск контактов StartAsyncSearch

procedure TForm2.StartAsyncSearch;
Var SID      : Integer;
    UserName : String;
begin
  UserName := Edit1.Text;
  if Length(UserName) < 4 Then
  Begin
    Memo1.Lines.Add('Search pattern too short');
    Exit;
  End;
  SID := Skype.AsyncSearchUsers(UserName);
  Memo1.Lines.Add('Initiating async search for "' + UserName + '" (search ID=' + IntToStr(SID) + ')');
end;

Как видите, в Edit1 - находится ник, который мы будем искать. Данную функцию необходимо вызывать по нажатию на кнопку, в нашем случае — кнопка «Начать».

Теперь приступим к тому, как можно получить список контактов, а точнее список контактов Ваших друзей. Здесь все просто, можно все получить это используя объект класса TSkype, а можно, используя IUserCollection, мы воспользуемся первым случаем. Для этого, на событие кнопки OnClick, напишем следующий код:

procedure TForm2.Button1Click(Sender: TObject);
var
 i:integer;
begin
    for i:=1 to Skype.Friends.Count do
     begin
      if Skype.Friends.Item[i].Handle<>'' then
       ListBox1.Items.Add(Skype.Friends.Item[i].Handle);
     end;
end;

Как Вы догадались в Count находится количество ников в Вашем аккаунте Skype. Мы циклом проходим и добавляем каждый из них. После этого в TListBox у нас должны появиться все ники из Вашего аккаунта Skype. Для, получение более подробной информации о ники, используйте следующие свойства:

  • Handle — ник в Skype
  • FullName — имя в Skype
  • Country — страна
  • City — город пользователя
  • PhoneHome — домашний телефон
  • PhoneOffice — телефон работы
  • PhoneMobile — мобильный телефон
  • HomePage - домашняя страница
  • и др.

Получение значений этих свойств, Вы сможете написать на событие OnClick кнопки «Посмотреть информацию».

Ну и теперь, наконец-то приступаем к отправке сообщения пользователю, только что проверил на конкретном примере, сообщения отправляются почти мгновенно.

На событие OnClick кнопки «Отправить» я написал следующий код:

procedure TForm2.Button4Click(Sender: TObject);
var
 msg:IChatMessage;
begin
   msg:=CoChatMessage.Create;
   msg:=Skype.SendMessage(ListBox1.Items[ListBox1.ItemIndex],Memo2.Text);
end;

Как видите, здесь мы отправляем сообщение через интерфейс IChatMessage, но не будет ошибкой, а также правильно будет отправить сообщение просто так:

procedure TForm2.Button4Click(Sender: TObject);
begin
 Skype.SendMessage(ListBox1.Items[ListBox1.ItemIndex],Memo2.Text);
end;

Отправка сообщений в русской раскладке работает без проблем, а именно преобразования в различные кодировки не требуется

Ну вот немного мы и рассмотрели, как работать с контактами, отправлять сообщения, исходник статьи качаем тут

Facebook Vk Ok Twitter LinkedIn Telegram

Похожие записи:

Здравствуйте, давайте вернемся к Skype API. А рассмотрим мы в этой статье то, как можно из стороннего приложения управлять приложением Skype и производить какие-то настройки. Мы уже рассмотрели как можно получать список ников, отправлять им сообщения, смотреть...
Всем здравствуйте. Данная статья, будет рассказывать о том, как можно в Skype разрешить доступ программам к Skype и постоянно не отвечать на всплывающие окна Skype. Скажу сразу, что вся ответственность за добавления в список безопасных программ лежит на Вас, п...
Всем здравствуйте, не так давно, мне на email поступил вопрос о том: как работать со Skype4COM в новых версиях Skype (при запуске приложения, которое обращается к Skype API , появляется ошибка — Класс не зарегистрирован). До этого я проблем не замечал, так как...