уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Что-то я в плане работы с различными API всё про Twitter до про Twitter, а между тем в Сети уже достаточно долгое время успешно функционирует такой сервис как FriendFeed. В отличие от Twitter FriendFeed имеет ряд таких преимуществ как публикация в записях картинок, mp3 и других файлов и, честно говоря, Google Buzz мне очень сильно напоминает по своим возможностям FF.

Статья не актуальна. 9 апреля 2015 года сервис был закрыт

Введение

В плане работы с API FriendFeed также имеет одно очень существенное отличие и заключается оно в следующем: если разработчики Twitter всячески старается избавиться от использования Base-авторизации, то разработчики FriendFeed этого таких действий не предпринимают, НО предлагают использование этого способа авторизации более безопасно. Не скажу, что способ base-авторизации в FF также надежен, как и OAuth в Twitter, но тем не менее также исключает передачу логина и пароля пользователя в явном виде в http-запросе.

Итак, чем смотреть сериалы и придаваться всякого рода разложению, лучше запустим Delphi и реализуем небольшой модуль для работы с API FriendFeed, используя Base-авторизацию.
Для работы нам понадобится библиотека Synapse и документация по API.
Наш модуль будет реализовывать всего два метода API:

  1. Отправку сообщения в различные ленты
  2. Подписку на каналы 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 и др.
купить книгу delphi на ЛитРес
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
3 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Matt
Matt
25/06/2010 12:10

Большое спасибо за модуль!

Avgustin
Avgustin
28/06/2010 00:41

О!
давно хотел попробовать и это Api…щас с другим микроблогом вожусь.
Спасибо автору, за работу.