Что-то я в плане работы с различными API всё про Twitter до про Twitter, а между тем в Сети уже достаточно долгое время успешно функционирует такой сервис как FriendFeed. В отличие от Twitter FriendFeed имеет ряд таких преимуществ как публикация в записях картинок, mp3 и других файлов и, честно говоря, Google Buzz мне очень сильно напоминает по своим возможностям FF.
Введение
В плане работы с API FriendFeed также имеет одно очень существенное отличие и заключается оно в следующем: если разработчики Twitter всячески старается избавиться от использования Base-авторизации, то разработчики FriendFeed этого таких действий не предпринимают, НО предлагают использование этого способа авторизации более безопасно. Не скажу, что способ base-авторизации в FF также надежен, как и OAuth в Twitter, но тем не менее также исключает передачу логина и пароля пользователя в явном виде в http-запросе.
Итак, чем смотреть сериалы и придаваться всякого рода разложению, лучше запустим Delphi и реализуем небольшой модуль для работы с API FriendFeed, используя Base-авторизацию.
Для работы нам понадобится библиотека Synapse и документация по API.
Наш модуль будет реализовывать всего два метода API:
- Отправку сообщения в различные ленты
- Подписку на каналы FF
Подготовка к работе
Прежде всего нам необходимо зарегистрировать наше будущее приложение в FriendFeed. Сделать это можно, перейдя по этой ссылке. Обратите внимание, что для успешной регистрации Вам необходимо указать помимо прочих сведений о приложении Группу FF для публикации пользователями отзывов о Вашем приложении.
После того, как приложение будет зарегистрировано Вам выдадут два ключа для приложения ConumerKey и ConsumerSecret, которые Вы можете использовать при OAuth-авторизации, а также в некоторых запросах при base-авторизации.
Теперь, когда приложение зарегистрировано, можно приступать к реализации модуля.
Разрабатываем модуль для FriendFeed API
Создадим класс TFriendFeed со следующими полями и свойствами:
type TFriendFeed = class private FRemoteKey: string;//ключ доступа к API FLogin: string; //логин доступа к API FAppID: string; //ID приложения (ConsumerKey) FAPIVersion: integer; //версия API procedure SetAuthorized(const Value: boolean); procedure SetLogin(const Value: string); procedure SetRemoteKey(const Value: string); procedure SetAppID(const Value: string); procedure SetAPIVersion(const Value: integer); published public constructor Create(); property APIVersion:integer read FAPIVersion write SetAPIVersion; property AppID: string read FAppID write SetAppID; property Authorized: boolean read FAuthorized write SetAuthorized; property Login: string read FLogin write SetLogin; property RemoteKey : string read FRemoteKey write SetRemoteKey; end;
Теперь разберемся как будем получать доступ к API.
Base-авторизации у FriendFeed организована следующим образом:
1. Пользователь переходит по URL http://friendfeed.com/remotekey и вводит на странице свой логин и пароль к аккаунту
2. FF генерирует два параметра: логин и ключ удаленного доступа к API
Полученные значения логина и ключа не имеют срока давности и могут использоваться сколь угодно долго при доступе к API, но могут быть изменены по желанию пользователя в любой момент.
Что касается получения ключей, думаю, все понятно — достаточно создать форму, содержащую компонент WebBrowser, загрузить страницу и получить от пользователя логин и ключ.
Перейдем к реализации методов API. Общий для всех методов API шаблон URL можно представить следующим образом:
http://логин:ключ@friendfeed-api.com/vверсия/метод
Поэтому задаем в модуле следующую константу:
FFURL = 'http://%s:%s@friendfeed-api.com/v%d/%s';
Методы API могут использовать GET-, POST- и PUT-запросы. Конкретно в нашем случае мы будем использовать только POST-запросы. И, чтобы избежать излишекго дублирования кода в модуле (копипаст — зло) создадим простенький метод класса TFriendFeed, который будет отправлять POST-запрос к API FF и возвращать результат ответа в виде строки.
function TFriendFeed.POSTCommand(const Operation:TffOperations; Params: TStrings): string; var URL: string; Oper: string; i:integer; begin Result:=''; if Params<>nil then if Params.Count>0 then begin Oper:=GetEnumName(TypeInfo(TffOperations),ord(Operation)); Delete(Oper,1,3); URL:=Format(FFURL,[FLogin,FRemoteKey,FAPIVersion,Oper])+'?'; for I := 0 to Params.Count-1 do URL:=URL+Params[i]+'&'; Delete(URL,length(URL),1); url := EncodeURL(AnsiToUtf8(URL)); with THTTPSend.Create do begin Params.SaveToStream(Document); HTTPMethod('POST', url); Params.LoadFromStream(Document); Result:=Params.Text; end; end; end;
Здесь TffOperations — это следующий тип данных:
type TffOperations = (ff_subscribe {метод подписки на канал}, ff_entry {метод отправки сообщения});
Теперь остается только набросать методы класса для реалицации API.
Отправка сообщения — метод entry
Для отправки сообщения в ленту необходимо всего один обязательный параметр body — текст сообщения. Все остальные параметра необязательные и могут отсутствовать в запросе. Так как мы будем постить сообщения как в одну так и несколько различных лент, то для нас также будет иметь значение параметр to в котором через запятую будем указывать каналы для постинга сообщений.
Метод Entry в классе TFriendFeed реализован следующим образом:
function TFriendFeed.Entry(const aMsg: string; aTo: string): boolean; var Params: TStringList; Res:string; begin Params:=TStringList.Create; Params.Add('body='+aMsg+'&to='+aTo); //формируем параметры запроса Res:=POSTCommand(ff_entry,Params);//отправляем запрос Result:=(pos('errorCode',Res)<=0)and(Length(Res)>0);//проверяем ответ end;
Так как сегодня мы только знакомимся с API FriendFeed, то следует сразу сказать следующее — в приведенной выше функции мы практически не проводим никакого анализа ответа сервера, а лишь констатируем факт — отправлено или нет (причем в весьма упрощенной форме). Сам ответ приходит в JSON-формате. Если же, нам необходим ответ в виде XML, то в запрос следует добавлять параметр:
format=xml
тогда можно будет обойтись без использования сторонних библиотек для работы с JSON в Delphi и пропарсить ответ стандартными средствами Delphi для работы с XML.
Приведенную Выше функцию можно использовать, например, так:
FriendFeed.Entry('Hello World','me')
Сообщение будет отправлено в вашу ленту FF. А так:
FriendFeed.Entry('Hello World','webdelphi')
сообщение будет отправлено в канал webdelphi (при этом канал должен быть общедоступным для публикации и Вы должны быть на него подписаны).
Подписка на канал — метод subscribe
Этот метод не на много сложнее предыдущего. «Сложность» заключается в том, что подписка на каналы с помощью api возможна только из зарегистрированных приложений, в связи с чем, в запросе на подписку помимо основного параметра — имени канала, должен присутствовать параметр appid, содержащий ConsumerKey приложения. На этом «сложности» заканчиваются. Реализация в Delphi может выглядеть следующим образом:
function TFriendFeed.Subscribe(const ListID: string): boolean; var Params: TStringList; begin Params:=TStringList.Create; Params.Add('feed='+ListID+'&appid='+AppID); Result:=pos('subscribed',POSTCommand(ff_subscribe,Params))>0 end;
При успешном выполнении запроса (успешной подписке) в ответ вернется строка «subscribed» — именно по ней мы и определяем успешность выполнения операции.
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Большое спасибо за модуль!
Да без проблем — юзайте на здоровье
О!
давно хотел попробовать и это Api…щас с другим микроблогом вожусь.
Спасибо автору, за работу.