Hatena::ブログ(Diary)

xmallocのプログラミングノート

2010年08月01日

Twitter APIから取得したテキストをHTMLに変換するための公式ライブラリ

Twitter statuses/public_timeline APIとか、ツイートを取得する系のAPIのデータから@とか#とかhttp://をURLに変換する公式ライブラリがあるようなので簡単にレポ。

まずライブラリ自体は以下のURLからダウンロードできる。

mzsanford's twitter-text-rb at master - GitHub

mzsanford's twitter-text-java at master - GitHub

mzsanford's twitter-text-php at master - GitHub

Python Package Index : twitter-text-py 1.0.3

Tweet Entities | dev.twitter.comにツイートからエンティティ抜き出すにはtwitter-text使えって書いてるからこれらが公式ってことでほぼ問題無いと思う。mzsanford氏はツイッターの国際化チームの一員。ただしPythonは作者違うようなので公式扱いでは無いかもしれない。Perlは無いっぽい。



使い方

Ruby版が大元っぽかったのでそっちの使い方説明しようと思ったんだけど、rakeの動かし方がいまいちよく分からんかった(何かファイルが無いと怒られた)ので、PHP版で説明。(個人的にはPython版が一番要るんだけど作者違うのでアレ。)

  1. mzsanford's twitter-text-php at master - GitHubからリポジトリをcloneしてダウンロード
    $ git clone http://github.com/mzsanford/twitter-text-php.git
    
  2. リポジトリ中のsrc/Twitterをinclude_pathの通ったディレクトリにコピー。
    $ cd twitter-text-php/src
    $ cp -r Twitter WHERE
    
  3. Twitter_Autolinkクラスのautolinkメソッドで、APIから取得したテキストをHTMLに変換できる。
    <?php
    require_once "Twitter/Autolink.php";
    $a = new Twitter_Autolink();
    echo $a->autolink('RT @mashable @LinkedIn Beefs Up Its Twitter Integration [PICS] http://bit.ly/bkB7cA #linkedin #tweets #twitter'), "\n";
    ?>
    
    出力はこんな感じ。スクリーンネームハッシュタグURLが<a>タグでリンクになってる。
    RT @<a class="tweet-url username" href="http://twitter.com/mashable">mashable</a> @<a class="tweet-url username" href="http://twitter.com/LinkedIn">LinkedIn</a> Beefs Up Its Twitter Integration [PICS] <a href="http://bit.ly/bkB7cA">http://bit.ly/bkB7cA</a> <a href="http://twitter.com/search?q=%23linkedin" title="#linkedin" class="tweet-url hashtag">#linkedin</a> <a href="http://twitter.com/search?q=%23tweets" title="#tweets" class="tweet-url hashtag">#tweets</a> <a href="http://twitter.com/search?q=%23twitter" title="#twitter" class="tweet-url hashtag">#twitter</a>
    
    ちなみに$Twitter_Autolink->noFollowで<a>タグにnofollow属性付けれるってソースに書いてあるんだけどPHP版は実装されてないっぽい。有効にしたかったら要改造。

Githubにも使い方が書いてあるのでそっちも見てくれ・・・まあそれ紹介すれば済む話なんだけど。

他の言語のは誰か親切な人が説明してくれるはず。



後書き

不勉強ながらこのライブラリの存在自体知らなかったりしました。Tweet Entities | dev.twitter.comを読んでたらたまたま見つけた感じです。twitter-text-rbとかでググるとそれなりに使ってる人いるみたいですが、普及してるとは言い難い感じ。

とりあえず、一時期あった日本語ハッシュタグとかの公式変換ルールがいまいちよく分からん問題とかはこれ一発で解決ですよ、ということで。

2010年05月13日

Chroma-Hashを試してみる

入力したパスワードのカラーパターンを横に表示しておけばミスがなくなるんじゃね?『Chroma-Hash』が面白そうだったので試してみました。リンク先辿っていけば行き着きますが、githubJavaScriptのChroma-Hash jQuery extensionがありますので、これを使えば既存のHTMLフォームも簡単にChroma-Hashizeできそうです。

以下、とりあえず動かしてみたい俺向きの簡単な例です。githubからchroma-hash.jsダウンロードして、ファイルをダウンロードしたディレクトリと同じディレクトリに以下のhtmlを置きます。

<html>
  <head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
    <script type="text/javascript" src="chroma-hash.js"></script>
    <script type="text/javascript">
      $(document).ready(function() {
        $("input:password").chromaHash({bars: 3});
      });
    </script>
  </head>
  <body>
    <input type="password">
  </body>
</html>

ブラウザから直接立ち上げて、パスワードフィールドに適当に入力するとChrome-Hashが表示されます。

f:id:xmalloc:20100513180158p:image

続けて入力していくとChrome-Hashが変わっていきます。

f:id:xmalloc:20100513180159p:image

これはなかなか面白いですねw

2010年05月04日

そろそろOAuth対応しないとヤベーんじゃねーのと思ってるPHPerに贈るコピペ用コード

ツイッターAPIですが6月30日からBASIC認証がNGになるということで、なんか適当にbotとか作ったんだけどそろそろ対応しないといけないんじゃねーの?と思ってる方もいらっしゃるのではないかと思います。そんなお困りのあなたに今日はコピペ用コードをご用意しました。

以下、BASIC認証をOAuth認証に変更するための大まかな順序です。

  1. OAuthライブラリダウンロードする
  2. OAuthアプリケーション登録する
  3. コードを直す

では具体的な方法について説明しますが、今回説明するのはbot等のユーザー固定のツイッターアプリの認証方法をOAuthに変える方法です。OAuth認証を使って不特定多数のユーザーからウェブサービスを利用できるようにする方法ではありませんのでご注意ください。


OAuthライブラリダウンロードする

一からコーディングしてもいいのですが全部説明するのも面倒なので、その辺に転がってるライブラリを利用させて頂くことにします。探せばPHPのOAuthライブラリも色々あると思いますが、今回はツイッター本家のページからリンクされているTwitterOAuthを利用することにします。(以下の例ではこのライブラリを使用しjsonでツイッターAPIを呼び出していますが、PHP-5.2.10未満のjsonモジュールにはバグがあるため、PHP-5.2.10以降が必要です。この辺については後述します。)

http://github.com/abraham/twitteroauthにアクセスしてアーカイブをダウンロードしてもいいのですが(そうしたい人はどうぞ)、必要なのはOAuth.phpとtwitteroauth.phpの二つだけですので、http://github.com/abraham/twitteroauth/tree/master/twitteroauth/から個別にファイルをダウンロードした方が早いと思います。

とりあえずダウンロードしたら適当なフォルダに保存しておいてください。使い方は後で説明します。


OAuthアプリケーション登録する

ライブラリダウンロードしたらOAuthアプリケーション登録をします。順番的にはこちらを先にしても構いません。

アプリケーション登録はhttp://dev.twitter.com/apps/newから行います。ページにアクセスすると以下の登録フォームが表示されます。

f:id:xmalloc:20100504014631p:image

各項目には以下の内容を入力してください。

  • アプリケーション名: OAuthアプリケーションの名称。OAuth経由でつぶやいたとき、ツイッターのタイムラインにこのアプリ名が表示されます。
  • アプリケーションの説明: とりあえず適当に。
  • アプリケーションのウェブサイトURL: ウェブサイトを持ってる人は自分のサイトのURLをセットしとけば良いです。ツイッターのタイムラインのアプリ名をクリックするとこのURLが開きます。ウェブサイト持ってない人は、自分のtwitterアカウントページとか、上の例みたいにexample.comとかをセットしとけば良いと思います。
  • お知らせ機能: とりあえず空でいいです。
  • あなたの招待状: 今回はBASIC認証からOAuthへの移行のみを例にしていますので、送信にします。不特定多数から使用可能なウェブアプリを作成する場合はブラウザアプリケーションにする必要があります。
  • Default Access type: アプリからツイッターに投稿する場合はRead & Write、しない場合はRead-onlyを指定します。

各項目を入力したら「アプリケーションを登録する」ボタンを押してください。エラーが無ければアプリケーションのページに遷移します。


アプリケーションのページに遷移したら後で必要になる項目を控えておいてください。まずアプリケーションのページのOAuth 1.0a Settingsから、Consumer keyとConsumer secret(以下のモザイクをかけた部分)をメモっておきます。

f:id:xmalloc:20100504014632p:image

次に、アプリケーションのページのサイドバーのMy Access Tokenをクリックし、oauth_tokenとoauth_token_secret(以下のモザイクをかけた部分)をメモっておきます。

f:id:xmalloc:20100504014633p:image

oauth_token_secretとかは人が読める形で保存するなと書いてますが、(繰り返し言いますが非公開前提ですので)華麗にスルーします。


コードを直す

準備が終わりましたので、プログラムの方をいじくります。

例として、home_timelineを読み込む処理を想定します。PHPのcURLモジュールを使用してAPIを呼び出し、jsonモジュールでPHPのオブジェクトに変換しています。

<?php
function home_timeline($username, $password) {
    $ch = curl_init('http://api.twitter.com/1/statuses/home_timeline.json');
    curl_setopt($ch, CURLOPT_USERPWD, "{$username}:{$password}");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $ctx = curl_exec($ch);
    if ($ctx === false) {
        curl_close($ch);
        return false;
    }
    $info = curl_getinfo($ch);
    curl_close($ch);
    if ($info['http_code'] != 200) {
        return false;
    }
    return json_decode($ctx);
}

これをBASIC認証をOAuth認証に変えます。ダウンロードしたtwitteroauth.phpとOAuth.phpを同じディレクトリ(もしくは適当なPATH)に配置し、以下のようにコードを書き換え認証をOAuthに変更します。

<?php
require_once 'twitteroauth.php';
$CONSUMER_KEY = 'CONSUMER_KEY';
$CONSUMER_SECRET = 'CONSUMER_SECRET';
function oauth_home_timeline($oauth_token, $oauth_token_secret) {
    global $CONSUMER_KEY, $CONSUMER_SECRET;
    $t = new TwitterOAuth($CONSUMER_KEY, $CONSUMER_SECRET, $oauth_token, $oauth_token_secret);
    $result = $t->get('statuses/home_timeline');
    if ($t->http_code != 200) {
        return false;
    }
    if (isset($result->error)) {
        return false;
    }
    return $result;
}

$CONSUMER_KEYと$CONSUMER_SECRETにはアプリケーション登録時にメモったConsumer keyとConsumer secretをセットしてください。関数引数の$oauth_tokenと$oauth_token_secretにはMy Access Tokenのoauth_tokenとoauth_token_secretをセットします。この辺の作りについてはあくまでも例ですのでお好きなように。require_onceと、new TwitterOAuthからreturn $resultあたりをコピペして、元のコードに合わせて適当に改造してください。

TwitterOAuthを使用する場合、API呼び出し時のエントリポイントとなるURLhttp://api.twitter.com/1/statuses/home_timeline.json)は、TwitterOAuthが適当に変換してくれます。上の例ではその挙動を利用してTwitterOAuth::getの引数に'statuses/home_timeline'を渡していますが、完全なURLを指定してもちゃんと動きます。


次はpostする例です。呼び出すAPIがupdate.jsonになり、POSTメソッドでHTTPリクエストを発行していること以外は上の例と同じです。

<?php
function post($username, $password, $status) {
    $ch = curl_init('http://api.twitter.com/1/statuses/update.json');
    curl_setopt($ch, CURLOPT_USERPWD, "{$username}:{$password}");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'status=' . rawurlencode($status));
    $ctx = curl_exec($ch);
    if ($ctx === false) {
        curl_close($ch);
        return false;
    }
    $info = curl_getinfo($ch);
    curl_close($ch);
    if ($info['http_code'] != 200) {
        return false;
    }
    return json_decode($ctx);
}

これも認証をOAuthに変更します。API呼び出しに使用するメソッドがTwitterOAuth::getでは無くTwitterOAuth::postとなっている点以外については、基本的に上のhome_timelineの例と同じです。

<?php
require_once 'twitteroauth.php';
$CONSUMER_KEY = 'CONSUMER_KEY';
$CONSUMER_SECRET = 'CONSUMER_SECRET';
function oauth_post($oauth_token, $oauth_token_secret, $status) {
    global $CONSUMER_KEY, $CONSUMER_SECRET;
    $t = new TwitterOAuth($CONSUMER_KEY, $CONSUMER_SECRET, $oauth_token, $oauth_token_secret);
    $result = $t->post('statuses/update', array('status' => $status));
    if ($t->http_code != 200) {
        return false;
    }
    if (isset($result->error)) {
        return false;
    }
    return $result;
}

$status引数が投稿するツイートです。($statusにはUTF-8文字列を渡してください。)

実際に投稿するとhttp://twitter.com/xmalloc1/status/13345684719のようになります。通常「webから」等になっている使用クライアント名がアプリケーション登録した際のアプリケーション名となっており、リンク先も登録時のアプリケーションのウェブサイトURLとなっているのが分かります。


補遺 PHP-5.2.10未満の場合

上述した通りPHP-5.2.10未満のjsonモジュールにはバグがあり、PHPのint(マシン依存、通常32bit)を越える数値を扱うことができません。

PHP-5.2.10未満を使用しており、PHPのアップグレードも難しい場合は、XMLでのAPI呼び出しを検討してください。以下はhome_timelineの例をXMLでのAPI呼び出しに変更したものです。TwitterOAuth::formatプロパティを'xml'に変更し、simplexml_load_stringによりPHPオブジェクトに変換します。

<?php
require_once 'twitteroauth.php';
$CONSUMER_KEY = 'CONSUMER_KEY';
$CONSUMER_SECRET = 'CONSUMER_SECRET';
function home_timeline($oauth_token, $oauth_token_secret) {
    global $CONSUMER_KEY, $CONSUMER_SECRET;
    $t = new TwitterOAuth($CONSUMER_KEY, $CONSUMER_SECRET, $oauth_token, $oauth_token_secret);
    $t->format = 'xml';
    $xml = $t->get('statuses/home_timeline');
    if ($t->http_code != 200) {
        return false;
    }
    $result = simplexml_load_string($xml);
    if (isset($result->error)) {
        return false;
    }
    return $result;
}

PHP-5.2.10未満を使用しており、どうしてもjsonでAPIを呼び出したい場合はService_JSON PEARパッケージが使用できます。Service_JSONを使用する場合は、TwitterOAuth::decode_jsonプロパティにfalseをセットしてからAPIコールを行います。TwitterOAuth::get/postが文字列でレスポンスを返しますので、Service_JSONで変換してください。例は省略します。

2010年03月06日

ツイッタークライアントのシェア調査(2010/3/4版)の補足

酔っ払って帰ってきたら前のエントリホッテントリ入りしてた。なんでかなーと思ったら、Twilogで有名なロプロスさんにブックマークしてもらったのがきっかけらしい。ついでにツイッターでリクエスト頂いてたようなので、前のエントリの表とリンクで添付したCSVに利用率を足しました。

モバツイよりKeitai Webのほうが上なのは意外。あと、パーセンテージも付記して欲しいなー 「ツイッタークライアントのシェア調査(2010/3/4版) - xmallocのプログラミングノート」 http://bit.ly/bJa7Ze

http://twitter.com/ropross/status/9998347741

それと前のエントリにツイート数ごとの集計も欲しいとコメント頂いてたので載せときます。

NekojarashiNekojarashi 2010/03/05 14:54

ユーザー数ではなくツイット数でのシェアも知りたいところ。

Webメインのユーザーと、なにかしらのクライアントを使用しているユーザーでは、使い方が違っているように感じています。

まず日本のツイート数ごとのクライアントシェアトップ30。

 クライアントツイート数%
1web78,61030.59683484
2Keitai Web23,2519.04982835
3movatwitter23,0838.98443886
4API20,6378.03239894
5Tween18,7517.29832400
6Echofon12,8545.00307486
7TwitBird iPhone10,5644.11175376
8TweetDeck9,1873.57579343
9Twit6,1202.38204591
10HootSuite4,6301.80210336
11P3:PeraPeraPrv4,4881.74683367
12YoruFukurou2,9891.16338811
13Twittelator2,7101.05479484
14twitterfeed2,5590.99602214
15Tweetie2,3780.92557274
16yubitter2,2470.87458450
17Seesmic1,3870.53985256
18ツイっぷる1,3530.52661897
19NatsuLiphone1,1140.43359463
20TwitPic1,0670.41530114
21Keitai Mail1,0090.39272620
22mobile web9630.37482193
23TweetMe for iPhone9240.35964223
24Movatter8280.32227680
25緊急災害支援ツイッター募金7850.30554020
26Perl Net::Twitter7820.30437253
27Saezuri7600.29580962
28pochitter7360.28646827
29Easybotter6650.25883342
30Twitterrific6560.25533041

次に世界のツイート数ごとのクライアントシェアトップ30。

 クライアントツイート数%
1web731,98940.71828807
2UberTwitter150,4988.37173908
3TweetDeck121,5546.76167372
4API94,3675.24934485
5Echofon70,0393.89605333
6twitterfeed65,5543.64656662
7mobile web48,8832.71921036
8txt43,5762.42399834
9Tweetie27,0031.50209352
10Twitterrific24,3101.35229024
11Keitai Web23,6961.31813532
12movatwitter23,5101.30778871
13HootSuite20,1721.12210608
14TwitBird iPhone19,4071.07955149
15Tween19,2361.07003929
16twidroid18,1701.01074100
17Seesmic15,4930.86182776
18Snaptu14,5040.80681274
19Mobile Tweete12,9310.71931161
20MySpace12,0880.67241812
21formspring.me11,1100.61801500
22Facebook10,6010.58970090
23Google10,3420.57529353
24TwitPic8,7560.48706925
25Twittelator7,1930.40012438
26dabr6,6270.36863955
27Twit6,2880.34978203
28Tumblr5,7170.31801906
29Power Twitter5,7130.31779655
30Sidekick4,7240.26278153

31位以下も含めたすべてのデータはGoogleドキュメントからCSVでダウンロードできます。以下のリンクからどうぞ。

なお、リンク先のファイル名がユーザー数別/ツイート数別とも「日本のツイッタークライアントシェア.csv」みたいな感じになってますが別のファイルです。Googleドキュメントで公開ファイル名ってどうやって変えるんだろ・・・

2010年03月04日

ツイッタークライアントのシェア調査(2010/3/4版)

先日Twitter Streaming APIのエントリを書いたのですが、これ使って何かできんかなーと思って、とりあえず簡単そうなところでツイッタークライアントのシェアとか調べてみました。


調査方法

調査方法2010/3/3 0:06から2010/3/4 0:12まで一日中Sampling APIを呼び出し、ユーザーごとの使用クライアント数を集計
サンプルしたツイート数1,797,691(Sampling APIを使用してますので、上記時間帯に発生した全ツイート数ではありません)
サンプルしたユーザー数989,284(Sampling APIを使用してますので、上記時間帯にツイートした全ユーザー数ではありません)
備考同一ユーザーが複数クライアントを使用していた場合それぞれ1とカウントしてます
(あるユーザーがweb、web、モバツイッターと使用した場合、web:1、モバツイッター:1とカウントしてます)


調査結果概要

まずは日本ユーザーのみのクライアントシェアトップ30。サードパーティアプリだとmovatwitterが圧倒的な気もしますが、Keitai Webより少ないのはちと意外。

 クライアント使用ユーザー数%
1web50,67433.61058049
2Keitai Web17,96611.91632177
3movatwitter15,62410.36294174
4Echofon7,9975.30417595
5TwitBird iPhone7,5435.00305105
6API7,5395.00039796
7Tween7,2384.80075348
8TweetDeck4,6303.07094344
9Twit2,8391.88302558
10HootSuite2,6901.78419824
11P3:PeraPeraPrv1,6511.09505996
12Twittelator1,5291.01414093
13Tweetie1,4880.98694683
14YoruFukurou1,4050.93189536
15yubitter1,1650.77271039
16twitterfeed9850.65332166
17TwitPic9770.64801549
18Keitai Mail8870.58832113
19mobile web8300.55051470
20ツイっぷる7870.52199406
21緊急災害支援ツイッター募金7850.52066752
22Seesmic7540.50010612
23NatsuLiphone5670.37607450
24TweetMe for iPhone5600.37143160
25Twitterrific4530.30046164
26Movatter4290.28454314
27Chromed Bird3680.24408363
28pochitter3550.23546111
29Saezuri3510.23280802
30Ustream3370.22352223

次は世界のクライアントシェアトップ30。UberTwitterとか始めて聞きました。他も知らんのが多いです。

 クライアント使用ユーザー数%
1web457,02242.26124701
2UberTwitter77,1737.13625868
3TweetDeck67,9746.28561864
4Echofon44,5124.11606581
5API43,1523.99030535
6txt33,2763.07706249
7mobile web32,3452.99097206
8twitterfeed29,0192.68341377
9Tweetie18,9241.74991978
10Keitai Web18,2781.69018356
11Twitterrific17,3561.60492537
12movatwitter15,8581.46640393
13TwitBird iPhone13,2091.22144845
14HootSuite13,0141.20341662
15MySpace11,3001.04492145
16twidroid10,0850.93256928
17Facebook9,6450.89188207
18Seesmic9,5430.88245004
19Snaptu8,2870.76630655
20TwitPic7,8940.72996548
21formspring.me7,8300.72404734
22Tween7,3210.67697964
23Mobile Tweete5,8720.54298927
24Google5,7840.53485183
25Tumblr4,2980.39744003
26Twittelator3,9800.36803428
27dabr3,2060.29646178
28Power Twitter3,0030.27769019
29Twit2,8860.26687109
30Sidekick2,7830.25734658


調査結果詳細

全調査結果はcsvでGoogleドキュメントに置いています。ご自由にどうぞ。

ちなみに、概要に円グラフ貼りたくてGoogleドキュメント試してみたのですが、グラフの仕上がりがいまいちだったので表だけになりました。誰かグラフにしてくれねーかなw


Streaming APIに関するおまけ

集計し始めてから分かったのですが、Streaming APIからEOFが返ってくることがあるようです。ぶっ続けで動かす場合は、向こうから切断されたら再接続する必要があります。


追記

表にクライアント利用率を足しました。

Googleドキュメントにシート足したのでリンク変えてます。前のリンクでも表示される内容同じだと思うのですが・・・違うかもw

ツイート別のクライアントシェアを次のエントリにまとめてます。