Обновляйте Twitter и FriendFeed из командной строки Linux

Держите ваших друзей в курсе новостей с помощью волшебных средств GNU Wget и cURL

Узнайте, как использовать GNU Wget и cURL, чтобы отправлять обновления в Twitter и FriendFeed без использования настольного приложения Twitter, и следите за сообщениями Twitter и FriendFeed прямо из командной строки Linux®. Эта статья была обновлена 31 октября 2008, чтобы исправить ошибку кода в командеwgetв разделе "Добавляем твиты, используя GNU Wget и cURL." - редактор.

Марко Котротсос, основатель и разработчик, Incredicorp

author photoМарко Котротсос (Marco Kotrotsos) — разработчик с 10-летним опытом создания систем программного обеспечения в диапазоне от корпоративных приложений для ведущих страховых компаний до административных инструментов для малого и среднего бизнеса и Web-приложений для начинающих фирм. Марко — основатель компании Incredicorp, цель которой — помощь начинающим компаниям и малому бизнесу в продвижении их продуктов на рынок. Он сотрудничает с техническими экспертами в таких революционных темах, как семантическая паутина (semantic Web), искусственный интеллект, CSS 3 и семантический поиск.



29.09.2009

Причина того, что пользователи обращаются к такой операционной системе, как Linux, лежит в сочетании всех её качеств — то есть в её общей полноценности. Она устойчива, доступна, быстра и работает на всевозможных платформах. Она также чрезвычайно гибкая, в значительной степени благодаря мощному интерфейсу командной строки (CLI), или оболочке shell.

Эта статья посвящена двум инструментам — GNU Wget и cURL. Вы узнаете, как использовать эти два инструмента, чтобы отправлять обновления на сайт социальной сети Twitter, не прибегая к помощи настольного приложения Twitter, и как следить за новостями в Twitter и FriendFeed прямо из командной строки.

Вам нужна информация об API? Эта статья не углубляется в подробности использования API. И у Twitter, и у FriendFeed есть подобный программный интерфейс, легко доступный через интерфейс Representational State Transfer (REST).

История GNU Wget

GNU Wget — гибкая программа, извлекающая с серверов данные (такие, как файлы, музыку mp3 и изображения). Его неинтерактивная, надежная и рекурсивная природа делает его чрезвычайно универсальным, что главным образом используется при обходе сайтов в поисках контента или для автономного чтения файлов HTML. (Ссылки на странице настраиваются автоматически, чтобы поддержать эти функциональные возможности).

Например, чтобы извлечь страницу, найденную по конкретному адресу URL, используйте эту команду:

wget http://wikipedia.org/

Эта команда загружает домашнюю страницу Wikipedia, обнаруженную по этому URL, на ваш компьютер и называет её index.html, поскольку именно эта страница найдена GNU Wget. Ссылки, найденные на странице, не отслеживаются, но и это сделать довольно просто:

wget –r http://wikipedia.org/

Дайте имя программеl

Wget GNU был создан разработчиком Хрвоже Никшичем (Hrvoje Nikšić) на основе его собственной программы Geturl. Никшич изменил название программы на Wget, чтобы отличать ее от программы Amiga с названием GetURL, которая выполняла те же самые функции и была написана в Amiga REXX.

В этой команде параметр -r заставляет GNU Wget рекурсивно отслеживать все ссылки, найденные на странице; таким образом, программа обработает полностью весь сайт. Однако не стоит использовать этот параметр для сайта, подобного Wikipedia, поскольку в итоге для простого локального доступа будет скачана вся база данных целиком, а это может занять очень много времени в зависимости от пропускной способности сетевого соединения. Но смысл параметра понятен.


История cURL

Client URL (cURL) заполняет нишу, отличную от GNU Wget: он был изначально разработан для оперативного предоставления курсов обмена валют в средах Internet Relay Chat (IRC). cURL — мощное средство для обработки URL и для передачи файлов с синтаксисом URL, что означает возможность передавать основные типы файлов по HTTP, HTTPS, FTP, FTPS и большинству других протоколов.

Приложение cURL в основном используется для web-обработки (web scraping) и автоматизации взаимодействия с Web-сайтами, например, для заполнения форм (с использованием команд GET или POST). Например, команда:

curl http://wikipedia.org

выводит результат запроса в окно терминала. В сущности, в этом случае cURL делает то же самое что и браузер, только браузер визуализирует результат, а cURL просто выдаёт всё, что нашел. Часто это HTML, но может быть что угодно.

Замечание: чтобы увидеть запрос, который осуществляет cURL, добавьте параметр -v (для подробного вывода на экран). С этим параметром cURL выполняет запрос, а также возвращает запрос HTTP, который сделал cURL для получения результата.

Теперь, отложив в сторонку эту вводную информацию, давайте займемся более интересными задачами.


Добавляем твиты, используя GNU Wget и cURL

Twitter — это сервис микроблогов и социальная сеть, позволяющая вам отвечать на вопросы вроде "что поделываешь?", отправляя вашим друзьям или наблюдателям (followers) короткие текстовые сообщения (длиной до 140 символов), называемые твитами. Чтобы лучше понять возможности GNU Wget и cURL, давайте попробуем с их помощью добавить твиты в ленту новостей Twitter. Есть несколько способов добавить твит: через Web-сайт или с помощью приложения-клиента, например, GtkTwitter, Spaz или же twhirl, являющегося приложением Adobe® Air.

Можно написать собственный полнофункциональный скрипт для клиента Twitter, который позволил бы автоматизировать такие задачи как, например, отправка твитов со статусом текущего использования системных ресурсов или их доступности (например, с сообщениями типа "server@servername в настоящее время сильно загружен"). Также можно написать скрипт для системы автоматического уведомления. Возможности бесконечны.

Чтобы увидеть, как это работает, введите в командной строке:

wget --keep-session-cookies --http-user=youremail --http-password=yourpassw \
    --post-data="status=hello from the linux commandline" \
    http://twitter.com:80/statuses/update.xml

Если вы не часто пользуетесь интерфейсом командной строки, этот код может вас несколько напугать. Но не волнуйтесь: тут всё логично. Давайте разберём составные элементы команды:

  • wget запускает приложение GNU Wget.
  • --keep-session-cookies сохраняет cookies этой сессии вместо того, чтобы держать их в памяти, что необходимо для сайтов, которым требуется доступ к другим страницам.
  • --http-user— имя пользователя.
  • --http-password— пароль.
  • --post-data— данные, отправляемые на Twitter, с которым вы работаете.
  • status= говорит, что это обновление статуса.

Ту же самую задачу можно выполнить и с помощью cURL. Для этого напечатайте:

curl -u youremail:yourpassw -d status=”text” http://twitter.com/statuses/update.xml

Эта команда выполняет в основном то же самое, что и предыдущая команда с wget , но с несколько другим и более дружественным синтаксисом. В данном случае различие между двумя приложениями — их поведение по умолчанию.

При выполнении всего этого описанным способом при помощи GNU Wget на локальную машину загружается файл update.xml. Эта загрузка может оказаться полезной, но вряд ли она необходима. Напротив, cURL отправляет полученные результаты на стандартный вывод (stdout).

Находим публичные новости Twitter

Перед тем, как получить доступ к публичным новостям Twitter, их необходимо найти. Другими словами, нужно найти конечную точку, которая будет использоваться для получения доступа к публичным новостям в Twitter. (См. ниже в Ресурсах ссылки на информацию о Twitter API). Самая простая и самая легкая в использовании конечная точка — это публичные новости, к которым можно получить доступ по адресу http://twitter.com/statuses/public_timeline.rss. Конечная точка публичных новостей для FriendFeed находится в кодовом репозитории Google (опять же см. ссылку в Ресурсах ниже).

Программный интерфейс FriendFeed принимает простые запросы GET и POST Для облегчения задачи мы также будем работать с публичной конечной точкой, доступной по адресу http://friendfeed.com/api/feed/public?format=xml. С XML мы поработаем позже.

Подключаемся к публичным новостям Twitter

Итак, теперь, когда у нас имеется конечная точка публичных новостей Twitter, как нам получить к ним доступ?

Введите следующий адрес в адресной строке браузера, или лучше используйте curl из командной строки:

curl http://twitter.com/statuses/public_timeline.rss

Теперь, из полученного результата и из того, как построена конечная точка, можно заметить, что наши выходные данные имеют формат RSS. Заглянув в документацию API, можно увидеть, что доступны и другие форматы. Изменив расширение файла на .xml или .json, можно изменить формат выходных данных.

С помощью команды grep возможно отфильтровывать результат и получать только нужные нам параметры:

curl http://twitter.com/statuses/public_timeline.xml | grep 'text'

Просмотрите выход: нам нужно всё, что находится в тегах <text>. Однако, если вы хотите избавиться от тегов, окружающих твиты, можно использовать команду sed. (Подробности использования команды sed лежат за рамками этой статьи, но за дополнительной информацией об этом удивительном инструменте обратитесь к Ресурсам.)

curl http://twitter.com/statuses/public_timeline.xml | sed -ne '/<text/s<\/*text>//gp'

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

curl -s http://twitter.com/statuses/public_timeline.xml | sed -ne '/<text/s<\/*text>//gp'

Находим публичные новости FriendFeed

Для получения публичных новостей Twitter мы использовали cURL. Теперь мы хотим проделать то же самое для FriendFeed. В этом случае конечной точкой FriendFeed API для публичного фида будет http://friendfeed.com/api/feed/public?format=xml. Однако, слежение за публичным фидом FriendFeed подобно слежению за каждой каплей воды в реке, поэтому немного сузим область обзора, оставив фиды только наших друзей.

Снова заглянем в документацию по API. Немного поиска и найдены домашние фиды на http://friendfeed.com/api/feed/home. Конечно, этот фид надо будет аутентифицировать, а также сначала необходимо авторизоваться, чтобы нас узнали. К счастью, cURL облегчает процесс благодаря использованию опции авторизации:

username:password

Но не используйте ваше имя пользователя и пароль на FriendFeed. Вместо них сайту необходимы ник и удаленный ключ авторизации. Поэтому надо будет зайти на http://friendfeed.com/account/api и получить их. После посещения этого URL войдите и получите ник и удаленный ключ.

Имея пару 'удалённый ключ-никнейм', выполните команду:

curl -u "nickname:key" http://friendfeed.com/api/feed/home

где nickname:key— это ваши ник и ключ.

Эта команда возвращает текущий FriendFeed в формате JavaScript Object Notation (JSON). Чтобы получить XML, необходимо добавить параметр format. Поскольку это запрос get, его можно просто добавить в конец URL:

curl -u "nickname:key" http://friendfeed.com/api/feed/home?format=xml

Неплохо, правда?


Синтаксический разбор выходных данных

Итак, из обработки фида Twitter, мы узнали, что для того, чтобы получить осмысленный результат, нам нужно сначала пропустить фид через sed. XML читается достаточно легко, но после просмотра результата мы видим, что нам надо интерпретировать содержимое тегов. Однако тут имеется затруднение. XML не содержит знаков новой строки или CR кодов, то есть у нас есть только одна большая длинная строка XML.

Тогда каким образом нам её обработать? Нужно выбрать другой формат выходных данных. Доступные форматы - JSON, XML, RSS или Atom. Для этого примера выберем RSS, потому что он является наиболее понятным и содержит нужные нам переводы строк.

Просмотрите то, что получилось в результате получения RSS-новостей. Нам нужно всё, что содержится между тегами, поэтому пропустите данные через измененную команду sed:

curl -s -u "nickname:key" http://friendfeed.com/api/feed/home?format=rss | 
    sed -ne '/<ff:body/s/<\/*ff:body>//gp'

Наконец-то у нас есть все записи из FriendFeed!


Компонуем всё воедино

Запуск команд вручную из командной строки — это на самом деле неправильный способ следить за фидами.

В конце концов, это можно делать, нажимая клавишу F5 непосредственно на сайтах. Однако, чтобы держаться как можно ближе к консоли, внесём это всё в shell-скрипт. Конечно, можно использовать Python, Perl или любой скриптовый язык, доступный для вашей платформы, но запуск из командной строки является самым логичным для завершения нашего примера.

Мы скриптуем поток Twitter, создав скрипт с удачным названием lintweet. Конечно, вы свободны в выборе любого названия. В листинге 1 показан этот скрипт.

Листинг 1. Lintweet.sh
!/bin/bash
while :
do
curl -s http://twitter.com/statuses/public_timeline.xml | sed -ne '/<text/s<\/*text>//gp'
sleep 10
done
exit
Делаем скрипт исполняемым и затем запускаем его, введя:
./lintweet

Каждые 10 секунд в окне появляются свежие твиты. Поскольку, в случае Твиттера, условия сервиса (TOS) не ограничивают частоту, с которой происходит обращение к публичным новостям (фидам), можно было бы обновлять эту настройку каждую секунду, установив параметр sleep на 1. Но нужно быть вежливыми с серверами, поэтому оставим значение 10. (На самом деле, даже если и установить значение 1 для sleep, много вы не прочитаете, поскольку в результате получился бы слишком быстрый поток обновлений.)


Чем заняться дальше

Теперь вы знаете, как использовать два инструмента, доступные в большинстве дистрибутивов Linux — cURL и GNU Wget — для получения твитов из командной строки Linux. Вы также можете следить за фидами с Twitter и FriendFeed вручную или с помощью простого скрипта оболочки.

Вы можете расширить скрипт, фильтруя фиды по определённым ключевым словам, так чтобы показывались только обновления, содержащие определённые фразы или слова. Или же можно сохранить скрипт в файл, для лёгкого доступа к заархивированным обновлениям Twitter и FriendFeed. Обновления Twitter можно даже автоматизировать, подключив ваш скрипт к системе уведомлений, напрмиер, Growl, если вы используете Mac OS X (см. Ресурсы). Возможности бесконечны.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=431804
ArticleTitle=Обновляйте Twitter и FriendFeed из командной строки Linux
publish-date=09292009