В Сети можно встретить уйму постов на тему "Зачем нужен 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.
Надоели мелькающие на страницах баннеры, флэш-ролики и прочая информация абсолютно для вас бесполезная? Воспользуйтесь отличным плагином для FireFox - adblock plus. Сам пользуюсь этим дополнением очень долгое время, практически с первого дня использования FF и полностью им доволен. Прост в настройке, эффективен в работе.
У Вас Mac, а вы не в курсе как производится замена замена hdd на mac? Обратитесь к специалистам в центр MacPlus - и аботайте спокойно с жестким диском до 500 Gb.
--------------------------
| Делись! | Загружай! | Плюсуй! |
| | |









18 Мар 2010 в 10:36 дп
А почему имеено тввитер??? А как же его конкурент живая лента???
18 Мар 2010 в 1:01 пп
По-моему живая лента Твиттеру пока не конкурент :) Да и пока не смотрел в принципе, что за API у ленты и есть ли он вообще
18 Мар 2010 в 4:02 пп
Ну почему же так, интересно Ваше мнение, в конкуренции. пока не считаем кол-во юзеров, период работы пока еще не тот :)))
18 Мар 2010 в 4:54 пп
:) Чисто с технической стороны я не работаю с живой лентой по причине того, что ещё не знаком с её API — не смотрел пока. Думаю, что с API Google мне будет работать проще, т.к. навыки пусть и не большие, но есть.
А конкуренция…тут по-моему дело даже не столько в количестве юзеров (хотя тоже немаловажный параметр), сколько в самой организации работы сервисов. Может только мне так кажется, но с Твиттером работать пользователю проще — накатал 140 символов и отправил. А лента она, как и полагается, в духе Гугла — имеет больше возможностей (фотки прилепить, записи ограничить на доступ и т.д.), но вместе с тем и лишние заморочки пользователю — не каждый любит разбираться.
18 Мар 2010 в 6:22 пп
Ну в принципе я думаю тот же алгоритм будет и для живой ленты получаешь XML и парсишь
Надо будет полазить поискать на досуге
18 Мар 2010 в 6:58 пп
Я поискал, ничего похожего на API ленты не нашел. Если надете — киньте ссылочку :)
19 Мар 2010 в 10:53 дп
Спасибо. Очень интерестный материал по Twitter и хорошо изложен. Я тоже начал писать клиент (ради интереса), но Вы меня опережаете — я застрял был на загрузке картинок-аватаров, потому, что начал немножко с другой стороны :-)
19 Мар 2010 в 12:32 пп
Ну я не совсем клиент пишу под Твиттер, скорее маленькую, но полезуную систему управления аккаунтом. Если учесть, что помимо этого есть ещё ряд работ, то Вы сделаете клиент намного быстрее :) Надеюсь мои статьи Вам помогут. А какая проблема с картинкой аватара? Есть же в инфе ссылка — скачиваете на диск и показываете. Или проблема в другом?
19 Мар 2010 в 7:37 пп
Ну первой проблемой было то, что я никогда не писал для Wed, и XML в частности :-). Но это оказалось, так себе. При загрузке аватаров оказалось что: -картинка может быть, например PNG, а расширение стоять GIF, браузер отображает ее нормально, но в случае с Делфи (6 версия) это уже проблема — пришлось писать проверку файла изнутри и походу переименовывать; — и вторая проблема, это возможность в имени файла кириличных букв, декодировка вызвала проблемы при скачке некоторых файлов (например, EncodeURL которую Вы описывали, нормально работала с кириличными символами, а на некоторых английских почемуто давала сбой). Перепробывал штук 6-8 разных функций, сработала только из Indy. Вот такие пироги.
19 Мар 2010 в 7:49 пп
хм…а пример можно посмотреть на котором EncodeURL спотыкалась? Вроде бы сколько работаю с Synapse таких подстав не было :)
19 Мар 2010 в 8:12 пп
ближе к ночи (21:00-23:00) скину ссылку, а то сейчас на работе, а код дома.:-)
20 Мар 2010 в 10:52 дп
К ночи не получилось (пятница-развратница:-).
— вот тут Synapse почему-то не хотел работать (может это только у меня?),
а вот тут — обявлен Gif, а на самом деле Png.
21 Мар 2010 в 12:09 пп
NativeXML поставь для работы с XML? там всего один юнит подключить надо
И делфу подними повыше, если есть возможность :)))
21 Мар 2010 в 6:58 пп
Та не люблю я NativeXML. Привык к интерфейсам, да и если сподоблюсь компонент написать опятьже придётся либо переписывать, либо лишний модуль возить за собой.
30 Мар 2010 в 12:03 пп
Здравствуйте, а можете выложить EncodeURL, как понимаю она самописная? Делфя при компиляции на нее ругается. Нашел в инете альтернативу, но работать все равно не хочет, выдает «DTD Запрещен» и начало загружаемой странички.
А можете выложить пример «Метод statuses/friends» полностью?
а то так приходится вбивать var и uses методом тыка -(
30 Мар 2010 в 12:07 пп
EncodeURL не сапописная — это функция из библиотеки Synapse модуль synacode.
30 Мар 2010 в 4:44 пп
Спасибо, заработало.
Багрепорт -)
Если в нике есть нижнее подчеркивание, оно тут «EncodeURL(AnsiToUtf8(‘http://'+Login» заменяется на «%5F», и авторизация уже не идет, Если логин просто прицепить, то норма.
30 Мар 2010 в 5:41 пп
О! REM, мега-респект за баг-репорт. Видимо с этой инфой я смогу кое-что исправить…
29 мая 2010 в 8:35 пп
Метод friendships/create отправляется методом POST а не GET
http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-friendships%C2%A0create
15 Дек 2010 в 5:09 дп
автор молоток интересно