かえラボBlog

かえラボBlogはラナデザインアソシエイツのテクニカルチームが運営する技術系ラボプロジェクトです

RaNa design associates, inc.

PHP :: Recent Entries

February 25, 2011

Instagram APIとGoogle Maps APIのマッシュアップ 「Gramap」

Category :

昨年後半くらいから人気がじわじわと出てきた「Instagram」という名のiPhone用カメラアプリ。
その公式APIが出るという噂を聞いたのが先月くらい。

そして、今月中旬にデベロッパー登録の受付が始まりいつになったら使えるのかと待ちわびていたのですが、先日たまたまデベロッパー用ページにアクセスしたら既にアプリ登録が出来るようになっていたので早速試しに作ってみました。
※注意 2011/2/26現在まだプライベートベータ版です。


この地図のマーカーをクリックするとその場所で投稿された写真をスライドショーで眺めることができます。
地図を移動させれば世界中の写真を観ることも可能です。
(写真をクリックするとInstagramの個別ページに飛びます。)

このウェブアプリを作るためにどのようなことをやったかというと

1.Instagram APIのデベロッパー管理画面でアプリを登録しクライアントキー等を取得
2.サーバサイドのスクリプトでOAuth認証をクリアしてアクセストークンを取得
3.LOCATIONS APIを使って、経度緯度から半径1000m以内で登録された位置情報IDを取得。
4.位置情報から地図のマーカーをセット。
5.マーカーがクリックされた時、位置情報IDからその場所から投稿された写真データを取得。
6.写真データをスライド表示。

みたいな感じです。

OAuthに関してはcurl使ってごにょごにょやったら突破出来ました。
Twitterで使っているOAuth1.0と比べるとInstagram APIのOAuth2.0はシンプルで使いやすい感じがします。

Instagramみたいに写真ありきでここまで流行ったアプリのAPIってあまりまだ無い気もするのでこれから色々出来そうですね。
まだサーバもちょっと重い気がするので、今後の機能拡張も含め期待してます。
(APIの制限は勘弁ですが。。)
※API制限ありました。1アクセストークンまたは1クライアントIDにつき、1時間5000アクセスまでとのこと。ただしメールでの申請により許可されれば制限をゆるくできるらしい。(2011/2/25現在)

ちなみにこの素敵なスライドショーは弊社フロントエンドエンジニアの@keiskey氏によるものです。

また何か良いアイデアを思いついたら紹介したいと思います。

July 28, 2010

顔認識APIを利用した心霊写真判定機

Category :

「detectFace();」という顔認識APIを使ってみました。

HTML5 + CSS3 + JS(jQuery) + PHP なので、IE以外でご覧ください。

デモ

【 使い方 】
画像のURLを貼って「判定」ボタンを押すと、イメージを読み込み、顔認識の結果を表示します。

画像の読み込みのタイミングとAPIからのレスポンスのタイミングの調整ができてないので、
「判定」ボタンを押しても無反応のときは、もう一度押してみてください。

  • canvas要素内に画像を読み込み、その上に顔認識APIから帰ってきたXML情報を元に円を描きます。
  • 同一生成元ポリシー上、JSのみで他ドメインのXMLデータを扱えないので、間にPHPをかましてます。
  • PHPでcURLを使ってAPIから返ってきたXMLをそのままJS側に渡し、jQueryでXMLをDOM操作してます。
  • あと、背景部分にCSS3のbox-shadowをinset指定で使い、内側にドロップシャドウをかけてます。

<?php
	/* API設定 */
	define("API", "http://detectface.com/api/detect");
	
	$url = urlencode($_GET["url"]);

	/* cURL */
	$curl = curl_init(API . "?url=" . $url);
	curl_exec($curl);
	curl_close($curl);

July 8, 2010

画像の種別をバイナリで判別する

Category :

画像を拡張子によらずバイナリの先頭8バイトで判別する方法。

PHPだと以下のような感じ。

$img = './sample.jpg';

if ($fp=fopen($img, "rb")){
	$head= fread($fp, 8);
	fclose($fp);

	if (strncmp("\x89PNG\x0d\x0a\x1a\x0a", $head, 8) == 0) {
		echo 'PNGだよ';
	} else if (strncmp('BM', $head, 2) == 0) {
		echo 'BMPだよ';
	} else if (strncmp('GIF87a', $head, 6) == 0 || strncmp('GIF89a', $head, 6) == 0) {
		echo 'GIFだよ';
	} else if (strncmp("\xff\xd8", $head, 2) == 0) {
		echo 'JPEGだよ';
	} else {
		echo 'どれにも当てはまらないよ';
	}
}

出力結果:JPEGだよ

アップロードする際に拡張子やMIMEタイプは偽装できるのでここまでやる必要がありそうですね。
たすけあいジャパン
ラナデザインアソシエイツは、「助けあいジャパン」に協力しています。