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

Прежде, чем начать этот пост я ещё раз взглянул на уже существующий проект Delphi, реализующий возможности Twitter API в Delphi — RADTweet. В проекте используются для работы с API ряд компонентов, в том числе и компоненты Indy для отпрвки и получения данных от сервера. В целом, можно отметить, что проект довольно интересный, есть на что посмотреть и чему поучиться, но мне более по душе использование библиотеки Synapse для работы в Web, чем компонентов Indy. Как говориться — каждому свое. Поэтому сегодня рассмотрим, что представляет из себя API Твиттера и реализуем небольшой пример работы с Twittr’ом, используя возможности библиотеки Synapse.

В начале, немного сведений об APIб которые пригодятся нам для работы, а также позволят избежать возможных неприятных ситуаций.

Во-первых, следует отметить, что ряд методом имеют свой лимит использования. По умолчанию установлено ограничение 150 запросов в час. Если какой-либо запрос не имеет ограничений на использование, то эта информация обязательно будет указана в описании метода. Например, метод statuses/update, используемый для обновления статуса пользователя (отправки сообщения в Твиттер) не имеет каких-либо ограничений, а метод users/show для получения информации о пользователе имеет ограничение 1 вызов за 1 запрос к серверу и т.д.

Во-вторых, все методы API Twitter’а можно условно разделить на два вида:

  1. Методы, требующие аутентификации
  2. Методы, не требующие аутентификации

Эта информация также обязательо указывается в описании метода.

Для работы с API используются, как обычн, GET и POST-запросы. Ответ сервера можно получать либо в формате XML, либо в JSON. Мне более удобно работать с XML.

Теперь рассмотрим пример работы с API. В начале воспользуемся методом, который не требует аутентификации пользователя — получим информацию о пользователе, используя метод users/show.

URL для получения сведений о пользователе имеет следующий формат:

http://api.twitter.com/1/show.format

где format может принимать одно из значений: xml или json.
В качестве параметров URL можно указать логин пользователя (Screen Name) или его идентификатор (представляет собой челое число).
Для работы используется GET-метод. Для получения сведений о пользователе можно использовать следующую функцию:

function GetUserInfo(const ScreenName: string):IXMLDocument;
var URL: string;
begin
try
  Result:=NewXMLDocument();
  URL:=EncodeURL('http://api.twitter.com/1/users/show.xml?screen_name='+ScreenName);
  HttpGetText(URL,Result.XML)
except
  ShowMessage('Ошибка получения данных от сервера');
end;
end;

Результат, возвращаемый функцией — XML-документ в котором содержится вся доступна информация по пользователю, в том числе: идентификатор пользователя, имя пользователя, ссылки на аватар, задний фон Твиттера, текст последнего сообщения и т.д.
Например, если сделать такой вызов:

GetUserInfo('WebDelphi')

То Вы получите информацию по моему аккаунту в Твиттере.
Теперь расмотрим пример работы с методами, которые требуют аутентификации пользователя. Отправим новое сообщение в Твиттер, используя метод statuses/update.
Как и в предыдущем примере, результат будем получать в виде XML-документа, но использовать будем метод POST. Так как для отправки сообщения (обновления своего статуса в Твиттере) необходимо проводить свою аутентификацию, то URL на который отправляется сообщение должен иметь следующий формат:

http://login:password@api.twitter.com/1/statuses/update.format?params

Для примера воспользуемся двумя параметрами — status, размер которго не должен превышать 140 символов и sourse — идентификатор нашей программы:

function SendToTwitter(const Login, Password, aMsg, Source: string): boolean;
var
  url: string;
  aDoc: IXMLDocument;
begin
  with THTTPSend.Create do
  begin
    url := EncodeURL(AnsiToUtf8('http://' + Login + ':' + Password +
          '@api.twitter.com/1/statuses/update.xml?source=' + Source +
          '&status=' + aMsg));
    HTTPMethod('POST', url);
    aDoc := NewXMLDocument();
    aDoc.LoadFromStream(Document);
    Result := aDoc.DocumentElement.ChildNodes.FindNode('error') = nil;
  end;
end;

Здесь стоит обратить Ваше внимание на то, что перед тем как воспользоваться методом Synapse EncodeURL необходимо обязательно перевести строку сообщения в формат UTF-8, иначе Twitter вернет нам сообщение об ошибке о том, что один или несколько символов в сообщении не соответствуют UTF-8.
Если отправка сообщения пройдет удачно,то переменная aDoc будет содержать текст ответного XML-документа, а функция вернет результат True.
Вот пожалуй и все, что можно сказать по API Twitter’а не ударяясь лишний раз в повторения. Работа с API достаточно проста — отправляем запрос, получаем ответ в формате XML или JSON и анализируем полученый ответ. Единственное, что мне пока непонятно — это причина по которой в практически каждом ответе сервера содержится информация по пользователю? Т.е. отправляем, например, новое сообщение в Твиттер и помимо того, что сервер возвращает дату публикации и прочую информацию по сообщению, до кучи опять присылается вся информация об аккаунте. Хотя, разрабам виднее, раз шлют — значит так надо. Будем использовать то, что есть ;).

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
25 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Алексей
Алексей
18/03/2010 16:11

По поводу, GetUserInfo
Не проще ли один раз при конектиться и получить всю XML а заетм парсить???
Зачем каждый раз лезть в инет???

Avgustin
Avgustin
24/05/2010 16:28

хороший пример.
но возник следующий вопрос.
[code]url := EncodeURL(AnsiToUtf8('http://' + Login + ':' + Password +
'@api.twitter.com/1/statuses/update.xml?source=' + Source +
'&status=' + aMsg));[/code]
что именно надо передовать под параметром Source?
aMsg- как я понимаю и есть само сообщение.

Avgustin
Avgustin
24/05/2010 16:41

просто под Source можно передавать все что угодно?

Avgustin
Avgustin
24/05/2010 17:40

есть еще такой вопрос. использую следующий код. [code] function SendToTwitter(const Login, Password, aMsg, Source: string): boolean; var url: string; aDoc: IXMLDocument; begin with THTTPSend.Create do begin url := TIDUri.UrlEncode(AnsiToUtf8('http://' + Login + ':' + Password + '@api.twitter.com/1/statuses/update.xml?source=' + Source + '&status=' + aMsg)); HTTPMethod('POST', url); aDoc := NewXMLDocument(); aDoc.LoadFromStream(Document); showmessage(aDoc.XML.Text); Result := aDoc.DocumentElement.ChildNodes.FindNode('error') = nil; end; end; [/code] я просто взял скопировал из библиотеке Synapse файл httpsend.pas, кинул его в папку с своим проектом и подключил его к своему проекту в uses httpsend вместо EncodeURL, использую как видно TIDUri.UrlEncode из библиотеки IDUri. суть трабла заключается в том, что отправка твита… Подробнее »

Avgustin
Avgustin
24/05/2010 17:44

если вот полный код showmessage
You are being redirected.
возле тегов поставил .что бы они не исчезали.

Avgustin
Avgustin
24/05/2010 18:36

Попробывал EncodeURL теперь все окей)
правда забанили на час, что пароль вводил неверно в запросе)

mis
mis
13/07/2010 21:47

hi … i am persian programmer … when tweet utf-8 — > apear ???? in my twitter account .
how can i solve it ?
thanks.

Roman
02/06/2011 20:50

Что такое Document почему он нигде неописан???

Roman
02/06/2011 21:55

спасибо, скомпилил. я так понимаю сообщение должно на стене появится там где твити? его нету и функция возвращает false!

Roman
02/06/2011 22:05

что такое: sourse — идентификатор нашей программы. Может я неправильно пишу?

Roman
02/06/2011 22:33

ок гляну. а если нет то что делать?

Roman
02/06/2011 22:43

что такое base-авторизация?

Roman
02/06/2011 22:55

When are you going to turn off Basic Auth?
We announced in December of 2009 the deprecation of Basic Auth. Its removal date from the platform is set for June 2010. We announced towards the end of June 2010 that we have postponed this until August 16th 2010. — Ето то о чем ти говорил

Roman
02/06/2011 22:57

http://dev.twitter.com/pages/oauth_faq — вот прочитал. Как думаеш твой код ище можно оживить. очень би хотелося.. В нете больше ничего нету рабочего. Спасибо.

Roman
03/06/2011 13:53

Ок спасибо буду учить.

Roman
03/06/2011 14:03

Ище один вопрос! В oAuth изспользуется кругом ключ и сикрет. я зарегал свою програму и получил его. а где будет привяска к юзеру, смотрел модули oAuth ненашол где передается логин и пароль.Спасибо

Roman
03/06/2011 14:53

ок спасибо.