Ну что, теперь в 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;

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

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


Уже давно на смену деревянным пришли металлические двери, которые во много раз прочнее и красивее. Они будут служить долгое время и радовать своих хозяев надежностью.


Метки: , , , ,




К записи “Skype API. Библиотека Skype4COM. Работа с контактами” оставлено комментариев: 17.

  1. Vasilij:

    Расскажите пожалуйста а как добавить новый контакт в свой Skype? Допустим: vasilij83

  2. Vasilij:

    Для меня этот вопрос все еще актуален.

  3. юрий:

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

  4. юрий:

    ааа все понял сори чет я ваще жестоко затупил))))

  5. юрий:

    теперь появился такой вопрос как организовать поиск по определенным критериям, пол, фамилия, страна, язык и прочему
    Заранее спасибо.

  6. Виктор:

    Вот у меня тоже возник вопрос, пишу автоответчик на скайп

    procedure TForm1.Skype1MessageStatus(ASender: TObject;
    const pMessage: IChatMessage; Status: TOleEnum);
    var
    msg:IChatMessage;
    Begin
    if Status in [cmsReceived, cmsSent] Then
    begin
    msg:=CoChatMessage.Create;
    msg:=Skype1.SendMessage(pMessage.Chat.DialogPartner,Memo1.Text);

    Вот как придёт сообщение от кого то, то он начинает беспрерывно засылать его сообщениями, пока я так понимю не прочту его, так как же его прочитать программно, я не представляю

    • Andrey:

      так ты на событие пишешь, на какое ты пишешь событие? надо же написать, только один раз, а оно видно у тебя на событииЮ, когда не прочтешь сообщение, вот оно и шлет его

  7. Виктор:

    И как программно произвести отправку файла?

  8. Сергей:

    Исходники совсем не в тему статьи.

  9. neoa2:

    Как мне найти пользователя и добавить ево в список контактов. Что за команда нужна если ктото знает то помогите.

  10. dimjkepro:

    Меня так же интересует данный вопрос.

    Как добавить нового пользователя к себе в контакты с изменением стандартного текста при отправке запроса?

  11. Аноним:

    Помогите сделать автоответчик для Skype

Оставить комментарий на dimjkepro

Вы можете использовать следующие теги:

*