■Twitterをはじめたころはベーシック認証を使った簡易な投稿ページを作っていて、携帯から利用していた。GoogleMapと連携させたりしていて、ちょっと便利に使っていたのだけど、そうこうするうちにTwitterの認証がOAuthに一本化されて使えなくなり、そのままになっていた。ながいことほったらかしにしていたのだけど、時間ができたので今回OAuth認証で作り直した。そのあたりの技術的トピックをメモ的にまとめておこうと思う。
PHPでOAuth認証
今のバージョンでPHPはOAuth認証を持っているけどそれは使わず、abrahamのtwitteroauthライブラリを利用した。
事前準備として、Twitterにアプリケーションを登録して、コンシューマーキー(公開/秘密鍵)を取得しておく必要がある。また、同時に自分自身のアクセスキー(公開/秘密鍵)を'My Access Token'から取得しておく。
ライブラリとアクセスのための都合4つの鍵があれば、あとはTwitterのAPIを叩くだけになる。リードアウトの要領は次のようになる。
require_once("twitteroauth.php"); $consumer_key = "(コンシューマー公開鍵)"; $consumer_secret= "(コンシューマー秘密鍵)"; $access_token ="(アクセス公開鍵)"; $access_token_secret="(アクセス秘密鍵)"; $to = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret); $req = $to->OAuthRequest( "https://twitter.com/statuses/home_timeline.xml", "GET", array("count"=>"20"));
ポストの要領は次のようになる。
(認証過程は上掲と同じ) $req = $to->OAuthRequest( "https://twitter.com/statuses/update.xml", "POST", array("status"=>$text));
緯度・経度の情報を取得する
ターゲットにしたのはDocomoの携帯。この携帯は投稿時のフォームに特定のキーワードが埋め込まれていると、緯度・経度情報を取得し、送信してくれる。
緯度・経度でGoogleMapにリンクする
DoCoMo携帯が取得した緯度・経度は分と秒が60進数で、このままではGoogleMapで扱い難い。60進→10進変換をしてやらなければならない。携帯から送信されるフォーマットは±ddd.mm.ss.sssで、これを10進に変換するには、ddd+(mm/60)+(ss.sss/3600)と計算して処理する。
計算後の位置情報でGoogleMapにリンクするには、緯度をN/S,経度をE/Wで表して、
http://maps.google.co.jp/maps?q=N34.173639722222E131.47022222222
のように表記する。
bit.lyで短縮する
GoogleMapへのリンク表記はそのままでは長いので圧縮する。圧縮サイトは幾つかあるけれど、bit.lyを利用した。
bit.lyのAPIを利用するには、ユーザー名とAPIキーが必要。ユーザー名は利用時の登録名そのまま。APIキーはユーザー名を登録後に取得できる。
短縮URLの取得は次の要領で行える。
$bitlyuser = "(ユーザー名)"; $bitlyAPIk = "(bit.ly APIキー)"; $bitlyurl = "http://api.bitly.com/v3/shorten?login=". $bitlyuser. "&apiKey=".$bitlyAPIk. "&longUrl=".$url. "&format=xml"; $str = file_get_contents($bitlyurl); $xmlbitly = simplexml_load_string($str); $shortUrl = $xmlbitly->data->url;
緯度・経度から住所表示を逆引きする
いわゆる逆ジオコーディングの処理で、GoogleMapを利用した。このAPIは今はAPIキーを必要としないで利用できる様子。10進変換後の緯度、経度を(N,E,W,Sのような表記ではなく、±表記のままで)それぞれ$lat, $lonにセットした後、以下の要領で利用できる。
$query = "http://maps.google.com/maps/geo?ll=". $lat.",".$lon. "&output=xml&hl=ja&oe=UTF8"; $xmlGeo = simplexml_load_file($query); $status = $xmlGeo->Response->Status->code; $address = ""; if($status == "200"){ (住所表示の抽出処理) }
住所表示のデータは、おそらくGoogleMapでの表示レベルに合わせて、国レベルから詳細な住所表示レベルまで表現の粒度が異なる。また、敷地内と路上でもデータ内容が異なる。このあたりの調整は実際のxmlを表示させて、GoogleMap向きのデータコンテナから自分のアプリにあわせた抽出をしてやる必要がある。xml表示のサンプル(横浜美術館)(八王子街道)。