はてなフォトライフに写真を投稿するAndroidアプリ - FotoHook

FotoHookという名前のAndroidアプリを作りました.FotoHookを使うとAndroidで撮った写真をはてなフォトライフに簡単にアップロードできます.

特徴として,FotoHookは写真のアップロード完了時に,自動的にWebHookを起動することができます.WebHookにはアップロードされた写真のURLなどもろもろが渡されるので,その情報を使って写真に対していろいろな処理をすることができます.例えば,アップロードした写真のURLをtwitterに投稿したり,小さく圧縮した写真をメールでだれかに送ったりすることができます.

まとめると,以下の図のようになります.

このFotoHookをAndroid Marketに登録して公開しています.FotoHookで検索すると見つかると思います.また,ソースコードをgithubで公開しています.

使い方

基本的な使い方は,demuyanさんのSendFoto(はてなフォトライフのAndroidアプリを公開してみた)と同じです.どうみても二番煎じです.本当にありがとうございました.demuyanさんの解説がとてもわかりやすかったので,同様のフォーマットで説明します.

まず,HomeからFotoHookを起動して,はてなidとパスワード,そして,hook URL(後述)を設定しておきます.

次にAndroidで写真を撮影します.写真を撮影したら,撮った写真を表示して共有を選択します.

その後,FotoHookを選んでタイトルを指定すると…

バックグラウンドでアップロードされます.

これで撮影した写真がフォトライフのトップにアップロードされているはずです.少ない操作で簡単に写真をアップロードできるので,なかなか便利です.

見た目としてはこれだけなのですが,実はこのとき,裏ではWebHookが起動されています.

WebHookの仕様

FotoHookの特徴はこのWebHook機能です.FotoHookでは写真のアップロードが完了したときにWebHookを起動することができます.厳密にいうとWebHookではない*1と思いますが,HookしたアクションでWebアプリケーションを起動するのは一緒なのでそう呼んでいます.

FotoHookは写真のアップロードが完了すると上記の"hook URL"に対してGETリクエストを行います.リクエストのパラメータには以下が設定されます.

name value
imageurl アップロードされた写真のURL
title 写真のタイトル
hatenasyntax アップロードされた写真を表示するためのはてな記法

例えば,以下のようなCGIを自分のサーバに設置しておき,CGIのURLを"hook URL"に設定しておけば,写真のURLをtwitterで発言することができます.

#!/usr/local/bin/perl
use strict;
use warnings;

use CGI;
use LWP::UserAgent;
use HTTP::Request::Common;

my $q = CGI->new;

my $imageurl     = $q->param('imageurl')     || "";
my $title        = $q->param('title')        || "";
my $hatenasyntax = $q->param('hatenasyntax') || "";

my $message = sprintf("%s %s", $title, $imageurl);

my $ua = LWP::UserAgent->new;

my $req =
    POST( "http://twitter.com/statuses/update.json", [
        status => $message,
    ]);
$req->authorization_basic("twitter_id", "twitter_pass");
                                        
my $res = $ua->request($req);           
if ($res->is_success) { print $q->header,                 "\nok"   ;}
else                  { print $q->header(-status => 500), "\nerror";}

このようなWebHookを自分のサーバなどに設置しておけば,画像をアップロードしたタイミングでさまざまな処理を行うことができます.例えば,アップロードされた画像のExifから位置情報を取得して,地図にマッピングするという処理なども行えます.Androidアプリを直接変更せずに,利用者が自分の必要な機能を用意できる柔軟な仕組みになっています.

こういったWebHookを設置するには,HookHubを使うと自分のサーバなどが不要で便利です.上記のCGIと同じことを実現するWebHookを書いたので利用してみてください.(今ちょっとちょうしが悪いみたい?)

まとめ

Androidで撮った写真をはてなフォトライフに簡単にアップロードでき,WebHookも起動できるFotoHookを紹介しました.

FotoHookのように,WebHookに処理を丸投げする仕組みにしておくと,利用者が自分で機能を用意でき,非常に柔軟です.WebHookを切り変えるだけで良いので,処理の切り替えも容易です.また,WebHookの処理はサーバが行うので,Androidにやらせるのには重すぎる処理も可能になります.バッテリも節約できますね.あと,個人的にはJavaはあまり得意ではないのですが,WebHookだとPerlでもRubyでも好きな言語で書けるのがうれしいです.

今のところ,WebHookとして指定できるURLは一つのみで,ON/OFFの切り替えもできないので,用途にあわせてWebHookを使いわけるということができません.これは不便なので,近いうちに実装したいと考えています.

あと,FotoHookのアイコンを募集しています.現在のアイコンはライセンスフリーの画像を適当にあてがっているだけだったりします…

*1:WebサービスのアクションにHookしてるわけではない