Прежде, чем начать этот пост я ещё раз взглянул на уже существующий проект Delphi, реализующий возможности Twitter API в Delphi — RADTweet. В проекте используются для работы с API ряд компонентов, в том числе и компоненты Indy для отпрвки и получения данных от сервера. В целом, можно отметить, что проект довольно интересный, есть на что посмотреть и чему поучиться, но мне более по душе использование библиотеки Synapse для работы в Web, чем компонентов Indy. Как говориться — каждому свое. Поэтому сегодня рассмотрим, что представляет из себя API Твиттера и реализуем небольшой пример работы с Twittr’ом, используя возможности библиотеки Synapse.
В начале, немного сведений об APIб которые пригодятся нам для работы, а также позволят избежать возможных неприятных ситуаций.
Во-первых, следует отметить, что ряд методом имеют свой лимит использования. По умолчанию установлено ограничение 150 запросов в час. Если какой-либо запрос не имеет ограничений на использование, то эта информация обязательно будет указана в описании метода. Например, метод statuses/update, используемый для обновления статуса пользователя (отправки сообщения в Твиттер) не имеет каких-либо ограничений, а метод users/show для получения информации о пользователе имеет ограничение 1 вызов за 1 запрос к серверу и т.д.
Во-вторых, все методы API Twitter’а можно условно разделить на два вида:
- Методы, требующие аутентификации
- Методы, не требующие аутентификации
Эта информация также обязательо указывается в описании метода.
Для работы с 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 и анализируем полученый ответ. Единственное, что мне пока непонятно — это причина по которой в практически каждом ответе сервера содержится информация по пользователю? Т.е. отправляем, например, новое сообщение в Твиттер и помимо того, что сервер возвращает дату публикации и прочую информацию по сообщению, до кучи опять присылается вся информация об аккаунте. Хотя, разрабам виднее, раз шлют — значит так надо. Будем использовать то, что есть ;).
По поводу, GetUserInfo
Не проще ли один раз при конектиться и получить всю XML а заетм парсить???
Зачем каждый раз лезть в инет???
В целом так и должно быть. 1 коннект — получили XML, распарсили, сохранили и работаем дальше. Если надо обновить сведения (мож пользователь решит сменить ник, адрес сайта и т.д.), то по запросу пользователя получаем обновленную инфу.
users/show — это пример работы с запросами без аутентификации.
хороший пример.
но возник следующий вопрос.
[code]url := EncodeURL(AnsiToUtf8('http://' + Login + ':' + Password +
'@api.twitter.com/1/statuses/update.xml?source=' + Source +
'&status=' + aMsg));[/code]
что именно надо передовать под параметром Source?
aMsg- как я понимаю и есть само сообщение.
В данном случае под Source можно передавать что угодно — любую строку. Т.к. используется Base-авторизация, то всё равно эту строку никто не увидит кроме вас :)
просто под Source можно передавать все что угодно?
есть еще такой вопрос. использую следующий код. [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. суть трабла заключается в том, что отправка твита… Подробнее »
если вот полный код showmessage
You are being redirected.
возле тегов поставил .что бы они не исчезали.
Только сегодня избавлялся от idURI :) Видимо при отправке сообщения в этом случае пароль или логин кодируются неверно и из-за этого вас редиректят на страницу с логином. Других вариантов я не вижу.
Попробывал EncodeURL теперь все окей)
правда забанили на час, что пароль вводил неверно в запросе)
hi … i am persian programmer … when tweet utf-8 — > apear ???? in my twitter account .
how can i solve it ?
thanks.
mis, use to access the API Twitter OAuth library or properly convert text to UTF-8
Что такое Document почему он нигде неописан???
Roman, читайте код сверху вниз каждую строку. Document — свойство THTTPSend
спасибо, скомпилил. я так понимаю сообщение должно на стене появится там где твити? его нету и функция возвращает false!
что такое: sourse — идентификатор нашей программы. Может я неправильно пишу?
Roman, этот код написан более года (!) назад и на тот момент он был на 100% рабочий. Посмотрите API Twitter’а — осталась там base-авторизация или нет? Если полностью отключена, то код этот работать не будет как ни старайтесь
ок гляну. а если нет то что делать?
что такое base-авторизация?
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. — Ето то о чем ти говорил
http://dev.twitter.com/pages/oauth_faq — вот прочитал. Как думаеш твой код ище можно оживить. очень би хотелося.. В нете больше ничего нету рабочего. Спасибо.
Roman, мой тебе добрый совет — поучи мат.часть по разделу «HTTP протокол», прежде, чем разрабатывать клиент под Twitter. Если не знаешь, что такое base-авторизация, то OAuth точно не поймешь. А код этот уже можно считать историей, т.к. твиттер полностью перешел под OAuth
Ок спасибо буду учить.
Ище один вопрос! В oAuth изспользуется кругом ключ и сикрет. я зарегал свою програму и получил его. а где будет привяска к юзеру, смотрел модули oAuth ненашол где передается логин и пароль.Спасибо
Смысл OAuth в том, чтобы твоя программа ВООБЩЕ ничего не знала про логин и пароль пользователя. Идентивикация и доступ приложения к аккаунту пользователя осуществляется через секретный ключик и токен, который в свою очередь шифруется в зависимости от логина и пароля пользователя. Юзер открывает программу, жмет кнопку — его бросает на офф.страничку твиттера в инете — юзер заносит в форму логин и пароль, жмет «Дать доступ приложению Х» — Твиттер генерирует токен и отдает приложению — приложение получает доступ к аккаунту. Вот краткий смысл OAuth-авторизации. Когда будешь работать с API разберешся в тонкостях реализации
ок спасибо.