Ну что, теперь в 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;
Ну вот немного мы и рассмотрели, как работать с контактами, отправлять сообщения, исходник статьи качаем тут