目次


洗練された Perl

Perl を使用して Twitter を実務に利用する

CPAN の Net::Twitter モジュールを使用して Perl から Twitter API にアクセスする方法を学ぶ

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: 洗練された Perl

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:洗練された Perl

このシリーズの続きに乞うご期待。

皆さんはおそらく Twitter に関して、非常に「イケてる」メッセージング・サービスであるがどのようにして利益を生み出しているのかが明らかではないことや、メッセージを 140 文字に制限していること、そして Twitter と技術との関係はダイヤモンドと石炭との関係のようなものであることを知っていると思います。Twitter の魅力は、メッセージが短く、人々が実際にメッセージに注目する可能性があることです。そこで、最初に以下の 2 つの一般的な助言をしておきましょう。

  • 毎回 139 文字にもなるメッセージを投稿してはなりません。
  • 毎日 20 通ものメッセージを送信してはなりません。

こうしたことをすると迷惑であり、迷惑はフォロワーを失う元となります。

Twitter はビジネスにも有用です。他のどのようなメッセージング・サービス (誰かに E メールを送信するなど) とも同じように、さまざまな用途に Twitter を使うことができます。しかしビジネスで Twitter を使おうとすると、「有用な情報」のメッセージではなく、「こんにちは。私です。」といったようなメッセージを送信することになりがちです。ビジネスで Twitter を使用する例としては、例えば Chris Brogan による 50 のアイデア・リストを参照してください (「参考文献」を参照)。他にも、Jet Blue と Dell によるサンプル・セットについて聞いたことがある方もいるかもしれません。

この記事では、実際の人間がビジネス用に投稿する方法について取り上げるのではなく、ビジネスに適した Twitter の投稿と検索を自動で行う方法について詳しく説明します。人間が実際に投稿する方法は、あまり技術的には面白くありません (ただし、人間のように振る舞い、Twitter の投稿に返信する人工知能を使うとしたらとても興味深いかもしれません)。

皆さんはおそらく CPAN モジュール (具体的には Net::Twitter) のインストール方法を既にご存知かと思いますが、この記事は初心者の Perl プログラマーを対象にしているので、「参考文献」セクションに CPAN のインストールに関して助けが必要な場合のリンクを記載してあります。

最後に、ここではTwitter API の言語によってそうせざるを得ない場合を除き、Twitter 投稿を指す「つぶやき」という言葉は使いません。「つぶやき」という言葉が好きな人には気の毒ですが、「つぶやき」という言葉を使わない方が記事の内容が明確になると思います。

前置きはこれくらいにして、アプリケーションの作成を始めましょう。

何を目指すのか

どのような情報を発信すればよいのでしょう。ここでは、ある会社について考えることにします。この会社では Perl を使用しており、ニュースで Twitter のことを聞いているため、とにかく Twitter を使いたくないと思っています。しかし他の選択肢と比較検討した結果、Twitter を真剣に考えるようになり、Twitter を使って何を投稿するのかを注意深く検討しました。

この会社の名前は The Cultured Perl, Ltd. であり、彼らは新しい Twitter アカウント、http://twitter.com/cultured_perl を作成しました。

この Twitter のアカウントを作成した興奮を想像してみてください。法務部門がこのアカウントを承認し、マーケティング部門は大喜びです。皆さんは開発者のリーダーとして、成果を得たいと思っています。そこで皆さんは、Twitter で 2 つのことを行い、それがどの程度成功するものかを見極め、予想される無数の質問についてはまだ気にしないことにします。

第 1 に、皆さんは「perl」を話題にしている投稿を Twitter で検索し、人々が Perl に関して何か興味深い話をしていないかを調べることにします。それを調べることで、この会社は製品に関するヒントを得られるかもしれません。

第 2 に、皆さんは求人募集のための自動投稿をセットアップします (皆さんは一瞬、解雇通知を投稿することも考えますが、それは悪趣味なのでやめました)。

キーワードで Twitter を検索する

サービスとしての Twitter の使い方は簡単です。Twitter サービスを実行する会社が、あらゆる詳細事項 (サーバー利用率、ネットワーク料金、ハードディスクの故障等々) を考慮する必要があります。皆さんは単純に TCP/IP 接続を開いて質問をすると、答えが返ってきます。これは Web ベースのサービスの特質であり、ユーザーにとっては素晴らしいことですが、キーワード検索を繰り返し行うと (キーワードが変化する場合は特に) サーバー・サイドの負荷が重くなる可能性があることを頭に入れておいた方が賢明です。絶対に必要な場合以外、自動クエリーによって Twitter のサーバーに負担をかけないようにする必要があります。

Twitter に対する検索と投稿を twitter_do.pl スクリプトが行います (twitter_do.pl については次のセクションで説明します。また twitter_do.pl は下記の「ダウンロード」セクションに含まれています)。パスワードは検索には必要ありませんが、投稿には必要であることに注意してください。

twitter_do.pl スクリプトは Getopt::Long を使用してコマンドライン引数を取得します (このことは usage() 関数に要約されています)。このスクリプトには、ユーザーがオプションの使い方がわからなくなった場合のためのヘルプ画面が含まれています。

また、このスクリプトでは --verbose オプションを使用していること、すべてのオプションにはショートカットがあること、そして検索結果の詳細を出力すると、定義されていないストリングは省略されずに (UNDEFINED) と表示されることにも注意してください。こうしたことは些細なことですが、長い目で見るとユーザーの役に立つことです。

リスト 1. twitter_do.pl: 使い方を説明する便利なヘルプ
sub usage
{
 return <<EOHIPPUS

 $0 [OPTIONS] SEARCH1 [SEARCH2 ...]

Note that you can search without a valid login.

Options:
 --help or -h                    : this help
 --verbose or -v                 : print more verbose output
 --rpp=100 or -r 100             : 100 results per page
 --maxresults=100 or -n 100      : return at most 100 search matches
 --popularity or -y              : analyze user popularity for search results
 --post=NEWS or -o NEWS          : post on Twitter
 --username=NAME or -u NAME      : specify the Twitter username
 --passwordfile=FILE or -pf FILE : specify a file that contains
                                   the Twitter password
 --password=PASS or -p PASS      : specify the Twitter password
EOHIPPUS
}

Twitter の検索結果はハッシュ参照として返され、検索結果以外にもページ・カウントや他のさまざまなフィールドが付随しています。ここでは単純に検索結果を取得し、すべての結果を集めたリストに新たな検索結果を追加してから、さらに検索を行います (検索結果の次のページを表示します)。これを (--maxresults オプションに従って) 十分な結果が得られるまで、あるいは何も結果が得られなくなるまで行います。結果は既に日付順にソートされているので、そのままにしておきます。

残念ながら単純に結果の数を数えることはできず、各ページを順次調べる必要があるため、Twitter では不本意ながらも同じ検索用語で何度も検索を行うことになります。これは --rpp オプションを使うことで調整することができます。同様に、--maxresults よりも検索結果が多い場合には以下のようにします。

リスト 2. キーワードで Twitter を検索する
sub do_search
{
 my $term = shift @_;

 my $page = 1;
 my @results;

 while (scalar @results < $opts{maxresults})
 {
  my $rset = $handle->search({query=>$term, page => $page, rpp => $opts{rpp} });
  print "Searching for $term (page $page)\n" if $opts{verbose};
  if (ref $rset eq 'HASH' && exists $rset->{results})
  {
   # break out if no results came back
   last unless @{$rset->{results}};
   push @results, @{$rset->{results}};
   printf "Now we have %d entries\n", scalar @results if $opts{verbose};
  }

  # go to the next page
  $page++;
 }

 print_post($_) foreach @results;
}
リスト 3. 検索で一致したものを出力する
sub print_post
{
 my $t = shift @_;
 
 printf("%s (on %s)\n\t%s\n", $t->{from_user}, $t->{created_at}, $t->{text});

 if ($opts{verbose})
 {
  foreach my $key (sort keys %$t)
  {
   my $v = $t->{$key};
   $v = '(UNDEFINED)' unless defined $v;
   print "...$key=$v\n";
  }
 }
}

print_post 関数は特別興味深いものではありません。そこで、少し休憩し、深呼吸してリラックスしてください。宇宙と一体になるのです。今度は何か強い飲み物を飲んでください。次は投稿について説明します。

Twitter に投稿する

ここではスクリプトの中でパスワード・ファイルのコマンドライン・オプションを使います。パスワードをファイルに入れ、そのファイルを -pf オプションで指定することも、-p オプションを使って直接パスワードを指定することもできます。セキュリティー上はファイルに入れた方が安全ですが、直接指定する方が手軽です。

リスト 4. Twitter に投稿する: パスワードのオプション
if (exists $opts{passwordfile} && !exists $opts{password} )
{
 open PF, "<", $opts{passwordfile} 
  or die "Couldn't open $opts{passwordfile}: $!";
 $opts{password} = <PF>;
 close PF;
 chomp $opts{password};
}

# require the password AND at least one search term OR a post
die usage() 
 unless (defined $opts{password} && exists $opts{post}) || scalar @ARGV;

残念ながら、空白を含むパスワードは使えません。あくまでも URL に安全に使える文字 (アルファベット文字、数字、ダッシュ、アンダーバー: [A-Za-z0-9_-]) のみを使用します。

投稿したら、投稿しようとしたテキストと最新の投稿が同じかどうかをチェックする必要があります。これは簡単です。

リスト 5. Twitter に投稿する: テキストをチェックする
sub do_post
{
 my $post = shift @_;

 $post = '(UNDEFINED)' unless defined $post;
 my $ret = $handle->update({status => $post});
 warn "Could not post the update" unless defined $ret;
 if ($ret->{text} eq $post)
 {
  print "Successfully posted [$post].\n";
 }
 else
 {
  warn "Posted string [$ret->{text}] is different from given [$post]";
 }
}

投稿コマンドを会社の求人データベースにリンクさせるのは簡単です。簡単な SQL クエリー、例えば SELECT desc,salary FROM jobs WHERE created > yesterday AND salary NOT NULL AND desc LIKE '%perl%' など (擬似的な SQL であることをお許しください) を実行すると、その結果が twitter_do.pl に渡されます。

Twitter の検索結果を分析する

The Cultured Perl, Ltd. は、この新しい Twitter 中心の戦略で大成功を収めました。彼らは 3 人を雇用し、数日の間に 1,800 人のフォロワーが得られました。素晴らしい成果です。

しかし皆さんはどうしても、もう少し Twitter を使って何かをしたいと感じています。そこで皆さんは、Perl がどのくらい話題になっているかを調べるために、検索結果を分析することにします。判断のための基準としては、検索に一致する最初の1,000 件を見つけ、それらを投稿したユーザーを見つけ、それらのユーザーがどのくらい人気のある人かを測定します。人気の度合いは、友達の数を半分にした値に、フォロワーの数を 2 倍にした値を加えた合計です (もちろん、この式は目的に応じて調整することができます)。このように重みを不釣り合いにしている理由は、Twitter ではフォローされるよりも他の人をフォローする方がはるかに容易なためです。

この測定を行うためには、Net::Twitter::friends_ids()Net::Twitter::followers_ids() を使います。人気の度合いを測定するためのフックは、やや退屈な関数 print_post() の中に入れ、少しばかり面白いものにしています。この新しいバージョンではスコープ付きのハッシュを使っています。つまり関数のみがハッシュに直接アクセスすることができ、このハッシュはすべての呼び出しで一貫しているため、キャッシュとして適切です。このキャッシュを利用すると人気の度合いを保存することができるため、負荷の重いメソッドを繰り返し呼び出す必要がありません。

リスト 6 は新しいバージョンの print_post() を示しています。このコードでは、グローバル・オプションを調整して、--popularity スイッチを使えるようにする必要がありました。また、使用方法を示すテキストも調整しました (リスト 1 には、その更新されたテキストを示してあります)。

リスト 6. Twitter の人気を検索用語によって容易に分析する
{
 # this hash is scoped to the print_post function only
 my %popularity;			

 sub print_post
 {
  my $t = shift @_;
  
  printf("%s (on %s)\n\t%s\n", $t->{from_user}, $t->{created_at}, $t->{text});
  
  if ($opts{verbose})
  {
   foreach my $key (sort keys %$t)
   {
    my $v = $t->{$key};
    $v = '(UNDEFINED)' unless defined $v;
    print "...$key=$v\n";
   }
  }

  if (exists $opts{popularity})
  {
   my $user = $t->{from_user};
   unless (exists $popularity{$user})
   {
    $popularity{$user} = scalar @{$handle->friends_ids($user)}/2 + 
    		         2* scalar @{$handle->followers_ids($user)};
   }

   print "\n\tPOPULARITY for $user = $popularity{$user}\n";

   my $sum = 0;
   $sum += $_ foreach values %popularity;
   
   printf "\tAVERAGE POPULARITY = %.2f\n", $sum / scalar keys %popularity;
  }
 }
}

簡単にするために平均の計算と出力は毎回行われますが、それをループ外に移動することはそれほど難しくありません。このコードを ./twitter_do.pl -n 10 -y perl を使って実行し、必要であると確信したら検索件数を 1,000 にします。

まとめ

この記事では Twitter での投稿と検索について説明しました。各関数の完全な動作サンプルを示し、オプションや他のラッパーの処理を単純化するために、それらの関数を 1 つのスクリプトの中に集約しました。

最後に、1 人のユーザーが Twitter によってどの程度結びつけられているかを、ユーザーの友達とフォロワーの数を使って定量化しました。

Twitter にはさまざまな使い方が考えられます。この記事では、実際の Perl コードを使って説明することで皆さんに実用的なアイデアや助言を与えられたようであれば幸いです。Net::Twitter のドキュメントと Twitter API のウィキを調べ、このサービスを使って他にどんなことができるかを調べてみてください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source, Web development
ArticleID=461825
ArticleTitle=洗練された Perl: Perl を使用して Twitter を実務に利用する
publish-date=12082009