Linux のコマンドラインから Twitter と FriendFeed の更新を行う

GNU Wget と cURL という魔法を使って友達の情報を最新状態に保つ

GNU Wget と cURL を使ってステータスの更新情報を Twitter と FriendFeed に送信する方法を学びましょう。ここでは Twitter のデスクトップ・アプリケーションを使わずに Linux® のコマンドラインから直接 Twitter と FriendFeed の両方のフィードを追跡する方法を学びます。この記事は「GNU Wget と cURL を使って tweet を追加する」セクションの wget コマンドにコーディングの誤りがあったものを修正して 2008年10月31日に更新されました (編集者より)。

Marco Kotrotsos, Founder and developer, Incredicorp

author photoMarco Kotrotsos はソフトウェア・システムの構築に 10 年の経験を持つ開発者で、これまでに携わったシステムは、超一流の保険会社用のエンタープライズ・クラスのアプリケーションから、中規模から小規模のビジネス用の管理ツールや新興企業用の Web アプリケーションに至るまで、広範囲にわたります。彼は新興企業や小規模ビジネスが製品を市場導入する際の支援に焦点を当てる Incredicorp の設立者です。彼は最先端の話題 (セマンティック Web や AI、CSS3、セマンティック検索など) に関して技術エキスパートと協力し合いながら業務を行っています。



2008年 10月 31日 (初版 2008年 10月 28日)

人々が Linux のようなオペレーティング・システムを選択する理由は、さまざまな要素を勘案した際の総合的な使いやすさからです。Linux は安定していて、安価に入手でき、高速な動作が可能で、あらゆる種類のハードウェアで実行することができます。また Linux は非常に柔軟性がありますが、その大きな理由は Linux の CLI (command-line interface)、つまりシェルが強力なためです。

この記事は、そうしたシェル・ツールのうちの 2 つである GNU Wget と cURL を紹介します。この 2 つのツールの使い方の例として、ソーシャル・ネットワーキング・サイト Twitter に Twitter のデスクトップ・アプリケーションを使わずにステータスの更新情報を送信する方法と、Twitter と FriendFeed の両方のフィードをコマンドラインから追跡する方法について学びます。

API の詳細が必要な方がいるかもしれませんが、この記事では API の使い方の詳細には触れません。Twitter にも FriendFeed にも、REST (Representational State Transfer) ful なインターフェースを使って容易に利用できる API があります。

GNU Wget の歴史

GNU Wget はサーバーからデータ (ファイルや mp3、画像など) を取得するための柔軟なソフトウェアです。GNU Wget は対話型ではありませんが、堅牢で再帰型の性質を持っているため非常に用途が広く、ほとんどの場合は Web サイトをクロールしてのコンテンツ検索や、オフラインでの HTML ファイルの読み取りに使われます。(HTML ページ内のリンクは自動的に調整され、この機能が実現されます。)

例えば、ある特定の URL にあるページを取得するためには次のコマンドを使います。

wget http://wikipedia.org/

このコマンドによって、この URL にあるウィキペディアのホーム・ページが index.html というファイル名で皆さんのコンピューターにダウンロードされます。これは GNU Wget が index.html というページを見つけたからです。GNU Wget はページ上にあるリンクを追跡しませんが、次のようなコマンドを使うと簡単にリンクを追跡させることができます。

wget –r http://wikipedia.org/

ツールの名前

GNU Wget は Hrvoje Nikšić が Geturl というプログラムから開発したものです (Geturl もHrvoje Nikšić が開発したものです)。彼は GetURL という名前の Amiga ツールと区別するために、彼のツールの名前を Wget に変更しました。GetURL も同じことをするツールであり、Amiga REXX で作成されたものです。

このコマンドで、-r スイッチはページ上にあるすべてのリンクを再帰的に追跡するように GNU Wget に命令しています。つまりこのスイッチによって GNU Wget はサイト全体をクロールします。ただし、このスイッチをウィキペディアのようなサイトに使ってはいけません。そんなことをするとウィキペディアのデータベース全体をダウンロードする羽目になり、手軽にそのデータベースをローカルでアクセスできるようになりますが、利用できる帯域幅によってはダウンロードに非常に長い時間がかかってしまいます。


cURL の歴史

cURL (Client URL) は GNU Wget とは別のニッチな用途を埋めるものです。cURL はそもそも、IRC (Internet Relay Chat) 環境に通貨の為替レートをフィードするために設計されました。cURL は URL 操作や URL 構文を使ったファイル転送を行うための強力なツールです。つまり cURL を使うことで、ほとんどの種類のファイルを HTTP、HTTPS、FTP、FTPS、その他大部分のプロトコル上で転送できるということです。

cURL アプリケーションは、(GET コマンドまたは POST コマンドを使っての) Web スクレーピングや Web サイトとの対話動作 (フォームの送信など) の自動化などに最もよく使われます。例えば次のコマンドはリクエストの結果をターミナル・ウィンドウに出力します。

curl http://wikipedia.org

要するに、cURL はこの場合、ブラウザーと同じことをします。ただしブラウザーは結果を描画しますが、cURL は検出したどんなものでもそのまま出力します (cURL が出力するものは多くの場合は HTML ですが、他の任意のものを出力することができます)。

注意: cURL が発行するリクエストを見るためには (詳細を出力するための) -v スイッチを追加します。ただし、このスイッチを追加すると、cURL は単にリクエストを発行するだけではなく、結果を取得するために cURL が発行する HTTP リクエストも返されます。

こうした背景を理解した上で、もっと意欲的な課題に移ることにしましょう。


GNU Wget と cURL を使って tweet を追加する

Twitter はソーシャル・ネットワーキング・サービスであり、マイクロ・ブログ・サービスでもあります。このサービスでは、「What are you doing? (あなたは今何をしていますか)」という質問に答えるために、tweet と呼ばれる短いテキスト・メッセージ (長さは 140 文字) を友達 (follower と呼ばれます) に送信することができます。GNU Wget と cURL の強力さをよく理解するために、まずこの 2 つのツールを使って Twitter のタイムラインに tweet を追加してみましょう。tweet を追加するための方法はいくつかあり、Web サイトを使用するか、または GtkTwitter、Spaz、twhirl などのクライアント・アプリケーションを使用します (これらのアプリケーションは実際には Adobe® Air アプリケーションです)。

スクリプトを作成することで独自の本格的な Twitter クライアントを作成することができますが、このクライアントを使って、現在のシステムの使用状況や可用性を 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 はセッション・クッキーをメモリーに保持するのではなく、保存します。これは他のページへのアクセスが必要なサイトで便利です。
  • --http-user はユーザー名を表します。
  • --http-password はパスワードです。
  • --post-data は Twitter に送信するデータであり、このデータに対してアクションを実行します。
  • status= は、これがステータスの更新情報であることを表します。

同じことを cURL を使って行うこともできます。そのためには次のように入力します。

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

このコマンドは基本的に先ほどの wget コマンドと同じことをしますが、構文は少し異なり、またわかりやすくなっています。この場合の 2 つのアプリケーションの違いは両者のデフォルト動作の違いです。

ここで説明する方法で GNU Wget を使って作業を行うと、update.xml というファイルが強制的にローカル・マシンにダウンロードされます。このダウンロードは便利ですが、決してこのダウンロードが必要なわけではありません。対照的に、cURL は結果を標準出力 (stdout) に出力します。

Twitter の公開タイムラインを見つける

Twitter の公開タイムラインにアクセスする前に、そのタイムラインを見つける必要があります。言い換えると、Twitter の公開フィードにアクセスするために使用するエンドポイントを見つける必要があります。(この記事の後の方にある「参考文献」には Twitter API に関する情報へのリンクを挙げてあります。) 最も一般的で使いやすいエンドポイントは公開タイムラインです (公開タイムラインには http://twitter.com/statuses/public_timeline.rss からアクセスすることができます)。FriendFeed の公開タイムラインのエンドポイントは Google のコード・リポジトリーにあります (これについても下記の「参考文献」にあるリンクを参照してください)。

FriendFeed API では単純な 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> タグの間にあるすべてのものが必要です。ただし tweet の前後にあるタグを取り除きたい場合には、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 の公開タイムラインを見つける

上の例では cURL を使って Twitter 用の公開タイムラインを取得しました。今度は FriendFeed で同じことをしてみましょう。この場合、FriendFeed API の公開フィードのエンドポイントは http://friendfeed.com/api/feed/public?format=xml です。同じことをすると言っても FriendFeed の公開フィードを追跡するのは川の流れの中で水滴を追跡するようなものです。そこで対象を皆さんの友達のフィードのみに狭めましょう。

API のドキュメントを再度見てください。検索に少し時間がかかりますが、ホーム・フィード (http://friendfeed.com/api/feed/home) を探します。もちろん、このフィードを認証する必要があり、また誰が操作しているのか feed/home にわかるように、サイン・オンする必要があります。幸いなことに、cURL ではこのプロセスが次の認証オプションを使って簡単に行えるようになっています。

username:password

しかし FriendFeed ではユーザー名とパスワードを使いません。FriendFeed のサイトは代わりにニックネームと認証リモート・キーを使います。そのためには FriendFeed のサイト (http://friendfeed.com/account/api) にアクセスして、ニックネームと認証リモート・キーを取得する必要があります。この URL にアクセスしたら、ログインしてニックネームとリモート・キーを取得します。

ニックネームとリモート・キーのペアを取得したら、次のコマンドを発行します。

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

ここで、nickname:key は皆さんのニックネームとキーです。

このコマンドによって、皆さんの現在の FriendFeed が JSON (JavaScript Object Notation) で返されます。XML を取得するためには format パラメーターを追加する必要があります。これは get リクエストなので、URL の最後に format パラメーターを追加すればよいだけです。

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

素晴らしいと思いませんか。


出力を解析する

さて、Twitter フィードを解析した結果からわかることは、まず sed を使って結果をパイプし、実際に読みやすい結果を取得する必要があるということです。XML を読むのは簡単ですが、結果を検証してみると、タグの間にあるすべてのものを解析する必要があることがわかります。しかし、ここに思わぬ障害があります。XML には改行コードつまり CR コードが何も含まれないため、XML は非常に長い 1 つのストリングになってしまうのです。

では出力結果をどのように解析すればよいのでしょう。別の出力フォーマットを選択する必要があります。利用可能なフォーマットは、JSON、XML、RSS、または Atom です。この例では RSS を使用することにします。それは 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 キーを押せばできるのです。そこで、可能な限りコマンドラインに近い形にするためには、シェル・スクリプトを使ってそのコマンドラインをスクリプト化します。もちろん、Python や Perl、その他 Linux プラットフォームで使用できる任意のスクリプト言語を使用することもできますが、コマンドラインからさまざまな処理を実行した方が、このフィードを追跡する例に適した結果を得ることができます。

そこで、lintweet という名前のスクリプトを作成して、Twitter のストリームをスクリプト化します。もちろん、スクリプトにはどのような名前をつけてもかまいません。リスト 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
Next, make this script executable. Then, run it using the command:
./lintweet

10 秒ごとにウィンドウが更新され、最新の tweet が表示されます。Twitter の場合には TOS (サービス規約: Terms Of Service) で公開フィードを取りに行く頻度が制限されていないため、毎秒ウィンドウが更新されるように sleep を 1 に設定することもできます。しかし、常にサーバーには配慮した方がよいため、sleep の設定は 10 のままにしておきます。(sleep を 1 に設定すると、流れの速い川のように次々と更新されていくため、あまり多くの内容を実際に追跡することはできません。)


今後の可能性

これで、ほとんどの Linux ディストリビューションに含まれている 2 つのツール (cURL と GNU Wget) を使って Linux のコマンドラインから tweet を取得する方法がわかりました。また、Twitter と FriendFeed のフィードを手動で、または単純なシェル・スクリプトを使って追跡することもできるようになりました。

シェル・スクリプトの拡張方法として、あるキーワードをフィルタリングし、特定の単語または語句を含むステータスの更新のみを表示する方法が考えられます。あるいは、スクリプトをファイルに保存し、Twitter と FriendFeed の更新をアーカイブしたものを容易に取得できるようにする方法も考えられます。さらに、Mac OS X を実行している場合には、Growl のような通知システムにスクリプトをフックして Twitter の更新を自動化する方法も考えられます (「参考文献」を参照)。可能性は無限です。

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=354453
ArticleTitle=Linux のコマンドラインから Twitter と FriendFeed の更新を行う
publish-date=10312008