Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 8 марта 2010 в 17:19.
Категории: Delphi в Web.


Прежде, чем начать этот пост я ещё раз взглянул на уже существующий проект 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 и анализируем полученый ответ. Единственное, что мне пока непонятно - это причина по которой в практически каждом ответе сервера содержится информация по пользователю? Т.е. отправляем, например, новое сообщение в Твиттер и помимо того, что сервер возвращает дату публикации и прочую информацию по сообщению, до кучи опять присылается вся информация об аккаунте. Хотя, разрабам виднее, раз шлют - значит так надо. Будем использовать то, что есть ;).

---------------------------
Интернет продолжает развиваться и набирать обороты. Сегодня в Сети можно найти практически любой заменитель реальной жизни. Давно ли мы с упоением играли в игровый автоматы в клубах и казино? А теперь вот - игровые автоматы online. Играйте в свое удовольствие, сидя за своим компьютером.
---------------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (25)

WP_Cloudy
  • Алексей пишет:

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

  • Vlad пишет:

    В целом так и должно быть. 1 коннект — получили XML, распарсили, сохранили и работаем дальше. Если надо обновить сведения (мож пользователь решит сменить ник, адрес сайта и т.д.), то по запросу пользователя получаем обновленную инфу.
    users/show — это пример работы с запросами без аутентификации.

  • Avgustin пишет:

    хороший пример.
    но возник следующий вопрос.

    url := EncodeURL(AnsiToUtf8('http://' + Login + ':' + Password +
    '@api.twitter.com/1/statuses/update.xml?source=' + Source +
    '&status=' + aMsg));

    что именно надо передовать под параметром Source?
    aMsg- как я понимаю и есть само сообщение.

  • Avgustin пишет:

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

  • Vlad пишет:

    В данном случае под Source можно передавать что угодно — любую строку. Т.к. используется Base-авторизация, то всё равно эту строку никто не увидит кроме вас :)

  • Avgustin пишет:

    есть еще такой вопрос.
    использую следующий код.


    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;

    я просто взял скопировал из библиотеке Synapse файл httpsend.pas, кинул его в папку с своим проектом и подключил его к своему проекту в uses httpsend
    вместо EncodeURL, использую как видно TIDUri.UrlEncode из библиотеки IDUri.
    суть трабла заключается в том, что
    отправка твита не происходит. а вместо этого showmessage(aDoc.XML.Text);
    возвращает:
    You are being redirected.
    ???

  • Avgustin пишет:

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

  • Vlad пишет:

    Только сегодня избавлялся от idURI :) Видимо при отправке сообщения в этом случае пароль или логин кодируются неверно и из-за этого вас редиректят на страницу с логином. Других вариантов я не вижу.

  • Avgustin пишет:

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

  • mis пишет:

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

  • Vlad пишет:

    mis, use to access the API Twitter OAuth library or properly convert text to UTF-8

  • Roman пишет:

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

  • Vlad пишет:

    Roman, читайте код сверху вниз каждую строку. Document — свойство THTTPSend

  • Roman пишет:

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

  • Roman пишет:

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

  • Vlad пишет:

    Roman, этот код написан более года (!) назад и на тот момент он был на 100% рабочий. Посмотрите API Twitter’а — осталась там base-авторизация или нет? Если полностью отключена, то код этот работать не будет как ни старайтесь

  • Roman пишет:

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

  • Roman пишет:

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

  • Roman пишет:

    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 пишет:

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

  • Vlad пишет:

    Roman, мой тебе добрый совет — поучи мат.часть по разделу «HTTP протокол», прежде, чем разрабатывать клиент под Twitter. Если не знаешь, что такое base-авторизация, то OAuth точно не поймешь. А код этот уже можно считать историей, т.к. твиттер полностью перешел под OAuth

  • Roman пишет:

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

  • Roman пишет:

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

  • Vlad пишет:

    Смысл OAuth в том, чтобы твоя программа ВООБЩЕ ничего не знала про логин и пароль пользователя. Идентивикация и доступ приложения к аккаунту пользователя осуществляется через секретный ключик и токен, который в свою очередь шифруется в зависимости от логина и пароля пользователя. Юзер открывает программу, жмет кнопку — его бросает на офф.страничку твиттера в инете — юзер заносит в форму логин и пароль, жмет «Дать доступ приложению Х» — Твиттер генерирует токен и отдает приложению — приложение получает доступ к аккаунту. Вот краткий смысл OAuth-авторизации. Когда будешь работать с API разберешся в тонкостях реализации

  • Roman пишет:

    ок спасибо.

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник