В Сети можно встретить уйму постов на тему «Зачем нужен Twitter?» в которых приводится масса советов по применению это сервиса для самых разнообразных целей. Вообще, по-момему, понять суть твиттера можно только после того, как начать его использовать. Для себя я выделил три простых причины по которым я активно стараюсь «наростить пузо» своему аккаунт:
- Если хорошо поработать со списками (Lists) и правильно раскидать по ним всех на кого я подписан (following’и), то можно получать массу информации по самым разнообразным темам практически без лишнего «шума».
- Несмотря на то, что Delphi-сообщество переживает не самые счастливые времена, в Твиттере достаточно много людей, интересующихся программированием. Больше людей подпишутся на мою ленту в Твиттере — больше увидят сообщение о новом посте — больше людей перейдет в блог и т.д. со всеми вытекающими.
- И, наконец, самая тривальная причина — заманить ПСа в блог. Дело в том, что поисковики практически живут в Twitter и, публикация микросообщений в Твиттере со ссылкой на блог очень положительно влияет на основной блог в целом.
Видимо поэтому я решил немного поразбираться со всеми механизмами Твиттера, так сказать, изнутри. Лишней информация не будет, по крайней мере для меня. И сегодня я рассмотрю методы, касающиеся работы со списками following и followers.
Для демонстрации работы метода, я решил весь программный код подкреплять небольшими скриншотами своего аккаунта в twitter’е.
И первое, что мы сделаем — это получим список following.
Метод statuses/friends
Метод возвращает список твиттерян, чьи сообщения публикуются в Вашей ленте. Формат возвращаемых данных: xml или json.
При работе с этим методом следует учитывать одно обстоятельство — за 1 запрос Вы можете получить только 100 пользователей из списка. Чтобы продвигаться по списку вперед и назад необходимо использовать параметр cursor в запросе. Значения этого параметра приходят также в ответе сервера.
Попробуем запросить список моих друзей:
cursor=-1;//начальное значение параметра with THTTPSend.Create do begin URL := EncodeURL(AnsiToUtf8('http://'+Login+':'+Password+'@api.twitter.com/1/statuses/friends/WebDelphi.xml?cursor='+Cursor)); if HTTPMethod('GET',URL)then begin aDoc:=NewXMLDocument(); aDoc.LoadFromStream(Document); for I := 0 to aDoc.DocumentElement.ChildNodes.Count - 1 do begin if aDoc.DocumentElement.ChildNodes[i].NodeName='users' then begin Node:=aDoc.DocumentElement.ChildNodes[i]; end else if aDoc.DocumentElement.ChildNodes[i].NodeName='next_cursor' then Cursor:=aDoc.DocumentElement.ChildNodes[i].Text; end; for i:=0 to Node.ChildNodes.Count-1 do begin Memo1.Lines.Add(Node.ChildNodes[i].ChildNodes[2].NodeValue); Application.ProcessMessages; label4.Caption:=IntToStr(Memo1.Lines.Count); end; end; end;
Здесь я вначале запрашиваю документ, содержащий первую 100 моих друзей из списка following, затем, если запрос прошел успешно, ищу кореневой узел users дочерие узлы которорого содержат информацию о моих друзьях и вывожу псевдонимы (screen_name) этих пользователей в Memo. Дополнительно я сохраняю также значение узла next_cursor, чтобы продолжить движение вперед по списку. Т.к. у меня на момент написания поста в списке following содержалось 118 записей, то, следовательно для получения полного списка, мне необходимо сделать ещё один шаг вперед — повторить запрос, включив в него значение параметра cursor. Соответственно для более обширных списков на 1000, 2000 пользователей необходимо составить просто цикл с предусловием:
while Cursor<>'0' do begin //здесь запрашиваем очередной список end;
То есть, когда в очередном списке значение узла next_cursor будет равно 0 — прерываем цикл, т.к. весь список в этом случае получен.
Вот результат выполнения цикла для моего аккаунта Twitter:
Список составлен с самого последнего добавленного друга до первого, соответсвенно, если вы хотите получить список наоборот — от первого до последнего, то вам необходимо в цикле использовать значения курсора, полученное из узла previous_cursor.
Метод statuses/followers
Метод возвращает список моих подписчиков (following) — тех, кто читает мои сообщения в своей ленте. Т.к. этот метод работает точно также как и предыдущий, то я не буду повторяться и писать один и тот же листинг, а перейду сразу к следующему моменту работы со списками друзей и подписчиков, а именно — получение информации об отношении пользователей.
Метод friendships/exists
В методе используются два параметра: user_a и user_b. Возвращает true, если пользователь user_a следует за пользователем user_b, т.е. пользователь A добавил пользователя B в свой список following.
Метод имеет стандартное ограничение 150 запросов в час и т.к. не требует аутентификации пользователя (в случае, если аккаунты пользователей не защищены), то количество запросов отслеживается по IP-адресу.
Попробуем использовать этот метод на практике. Для этого я выбрал пользователя из своего списка followers за которым я не следую:
Вот листинг в случае, если я проверю свой аккаунт на предмет наличия пользователя в моем списке following:
with THTTPSend.Create do begin URL := EncodeURL(AnsiToUtf8('http://api.twitter.com/1/friendships/exists.xml?user_a='+Edit3.Text+'&user_b='+Edit4.Text)); if HTTPMethod('GET',URL)then begin aDoc:=NewXMLDocument(); aDoc.LoadFromStream(Document); label9.Caption:=aDoc.DocumentElement.Text; end; end;
Результат выполнения:
Если поменять наши ники местами, то результат выполнения метода будет true, т.к. я нахожусь в списке following этого пользователя.
Метод friendships/show
Метод аналогичен методу friendships/exists, но предоставляет в наше распоряжение более детальную информацию о пользователях и позволяет за 1 запрос получить отношение пользователя A к В и В к А, т.е. сокращает количество запросов в 2 раза по сравнению с предыдущим методом.
Теперь, после того как мы получили списки foolowing и followers, а также проверили отношения пользователей мы можем либо добавить нового пользователя в свой список following, либо, напротив — удальть его.
Метод friendships/create
Позволяет пользователю (мне) добавить в свой список following нового пользователя. Метод требут аутентификации ине имеет ограничений на использование. Рассмотрим работу метода на примере того же пользователя, что и в предыдущем листинге. Добавим его в мой аккаунт:
with THTTPSend.Create do begin URL:=EncodeURL(AnsiToUtf8('http://'+Login+':'+Pass+'@api.twitter.com/1/friendships/create.xml?screen_name='+Edit5.Text)); if HTTPMethod('GET',URL)then begin aDoc:=NewXMLDocument(); aDoc.LoadFromStream(Document); Memo1.Lines.Add(aDoc.XML.Text); end; end;
Здесь я добавил пользователя в свой список following и вывел ответ сервера в Memo1.
Соответственно для того, чтобы удалить пользователя из списка, необходимо воспользоваться методом friendships/destroy с теми же параметрами, что и у предыдущего метода.
Вот и все, что нам требуется знать по поводу работы со списками в Twitter API.
А почему имеено тввитер??? А как же его конкурент живая лента???
По-моему живая лента Твиттеру пока не конкурент :) Да и пока не смотрел в принципе, что за API у ленты и есть ли он вообще
Ну почему же так, интересно Ваше мнение, в конкуренции. пока не считаем кол-во юзеров, период работы пока еще не тот :)))
:) Чисто с технической стороны я не работаю с живой лентой по причине того, что ещё не знаком с её API — не смотрел пока. Думаю, что с API Google мне будет работать проще, т.к. навыки пусть и не большие, но есть. А конкуренция…тут по-моему дело даже не столько в количестве юзеров (хотя тоже немаловажный параметр), сколько в самой организации работы сервисов. Может только мне так кажется, но с Твиттером работать пользователю проще — накатал 140 символов и отправил. А лента она, как и полагается, в духе Гугла — имеет больше возможностей (фотки прилепить, записи ограничить на доступ и т.д.),… Подробнее »
Ну в принципе я думаю тот же алгоритм будет и для живой ленты получаешь XML и парсишь
Надо будет полазить поискать на досуге
Я поискал, ничего похожего на API ленты не нашел. Если надете — киньте ссылочку :)
Спасибо. Очень интерестный материал по Twitter и хорошо изложен. Я тоже начал писать клиент (ради интереса), но Вы меня опережаете — я застрял был на загрузке картинок-аватаров, потому, что начал немножко с другой стороны :-)
Ну я не совсем клиент пишу под Твиттер, скорее маленькую, но полезуную систему управления аккаунтом. Если учесть, что помимо этого есть ещё ряд работ, то Вы сделаете клиент намного быстрее :) Надеюсь мои статьи Вам помогут. А какая проблема с картинкой аватара? Есть же в инфе ссылка — скачиваете на диск и показываете. Или проблема в другом?
Ну первой проблемой было то, что я никогда не писал для Wed, и XML в частности :-). Но это оказалось, так себе. При загрузке аватаров оказалось что: -картинка может быть, например PNG, а расширение стоять GIF, браузер отображает ее нормально, но в случае с Делфи (6 версия) это уже проблема — пришлось писать проверку файла изнутри и походу переименовывать; — и вторая проблема, это возможность в имени файла кириличных букв, декодировка вызвала проблемы при скачке некоторых файлов (например, EncodeURL которую Вы описывали, нормально работала с кириличными символами, а на некоторых английских почемуто давала сбой). Перепробывал штук 6-8 разных функций, сработала… Подробнее »
хм…а пример можно посмотреть на котором EncodeURL спотыкалась? Вроде бы сколько работаю с Synapse таких подстав не было :)
ближе к ночи (21:00-23:00) скину ссылку, а то сейчас на работе, а код дома.:-)
К ночи не получилось (пятница-развратница:-).
— вот тут Synapse почему-то не хотел работать (может это только у меня?), — обявлен Gif, а на самом деле Png.
а вот тут
NativeXML поставь для работы с XML? там всего один юнит подключить надо
И делфу подними повыше, если есть возможность :)))
Та не люблю я NativeXML. Привык к интерфейсам, да и если сподоблюсь компонент написать опятьже придётся либо переписывать, либо лишний модуль возить за собой.
Здравствуйте, а можете выложить EncodeURL, как понимаю она самописная? Делфя при компиляции на нее ругается. Нашел в инете альтернативу, но работать все равно не хочет, выдает «DTD Запрещен» и начало загружаемой странички.
А можете выложить пример «Метод statuses/friends» полностью?
а то так приходится вбивать var и uses методом тыка -(
EncodeURL не сапописная — это функция из библиотеки Synapse модуль synacode.
Спасибо, заработало.
Багрепорт -)
Если в нике есть нижнее подчеркивание, оно тут «EncodeURL(AnsiToUtf8(‘http://’+Login» заменяется на «%5F», и авторизация уже не идет, Если логин просто прицепить, то норма.
О! REM, мега-респект за баг-репорт. Видимо с этой инфой я смогу кое-что исправить…
Метод friendships/create отправляется методом POST а не GET
http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-friendships%C2%A0create
автор молоток интересно