携帯電話向けサイトの構築に便利な諸機能を追加するための、Rackミドルウェア
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib/rack
spec
test
tools
vendor/datum_conv
.gitignore
Gemfile
Gemfile.lock
MIT-LICENSE
README.rdoc
Rakefile
VERSION
rack-ketai.gemspec

README.rdoc

rack-ketai: A Rack Middleware for Japanese mobile-phones

rack-ketaiとは

携帯電話向けサイトを構築する際に役立ちそうな機能を提供する(ことが目標の)Rackミドルウェアです。が、jpmobileがRails以外でも使えるようになったので、そっちを使った方がきっとよいです。

  • 携帯電話キャリア判別

  • 端末名の取得

  • ユーザID、端末IDの取得

  • GPSによる位置情報の取得

  • ディスプレイ情報(サイズ、色数)の取得

  • Cookie使用の可否

  • キャッシュサイズの取得

  • IPアドレス帯域の正当性チェック

  • 入出力文字コード変換(DoCoMo、auのみ)

  • 絵文字キャリア間変換

  • PCでの絵文字表示(TypePadの絵文字使用)

テスト環境もまともにないので、万年αテスト中です。自己責任で、よくテストを行ってご利用下さい。

使えそうなRubyのバージョン

適当テストを通ったバージョンです。

CRuby 1.8.5, 1.8.6, 1.8.7, 1.9.1, 1.9.2, 1.9.3

JRuby 1.4.0

使用例

Rails 3.0

config/application.rb

module Example
  class Application < Rails::Application

    # 省略

    config.middleware.use "::Rack::Ketai"
  end
end

app/controllers/example_controller.rb

class ExampleController < ApplicationController
  def index
    render :text => (request.env['rack.ketai'].mobile? ? "mobile" : "PC")
  end
end

Sinatra

require 'rubygems'
require 'sinatra'

require 'rack/ketai'
use Rack::Ketai

get '/' do
  case request.env['rack.ketai']
  when Rack::Ketai::Carrier::Docomo
    "こんにちは、DoCoMo世界!"
  when Rack::Ketai::Carrier::Au
    "こんにちは、Au世界!"
  when Rack::Ketai::Carrier::Softbank
    "こんにちは、Softbank世界!"
  else
    "こんにちは、その他の世界!"
  end
end

単に携帯電話でのアクセスか識別するのであれば、#mobile?を使います。

env['rack.ketai'].mobile?

互換性のため、携帯電話からのアクセスでないときには、特異メソッド#mobile? => falseを定義したnilが設定されます。

端末名の取得

env['rack.ketai'].name # => "SO903i"

ユーザID、端末IDの取得

各キャリアの利用者の識別に関する情報の扱いを一元化します。 これにより、携帯サイトでのユーザ認証等が容易になります。(後述のIPアドレス帯域チェックと併用すること)

ketai = env['rack.ketai']
ketai.subscriberid  # ユーザID:iモードID or FOMAカード製造番号/EZ番号/x-jphone-uid
ketai.deviceid      # 端末ID:端末製造番号(DoCoMo)/端末シリアル(SoftbankMobile)
ketai.ident         # ユーザか端末を識別する情報(ユーザID or 端末製造番号)

GPSによる位置情報の取得

位置情報取得の為のリクエストは各自で行って下さい。

# 位置情報が送られていない
env['rack.ketai'].position # => nil

# 位置情報を取得
position = env['rack.ketai'].position # => #<Rack::Ketai::Position:0xb76bf6a4 @lng=135.693222222222, @lat=35.0098888888889>
position.lat # => 35.0098888888889
position.lng # => 135.693222222222
# 測地系を指定(世界測地系から日本測地系に変換した値を返します)
position.lat(:wgs84)   # => 35.0098888888889
position.lng(:wgs84)   # => 135.693222222222
position.lat(:tokyo97) # => 35.0066762382277
position.lng(:tokyo97) # => 135.696079543154
# おまけ 度分秒単位で取得
Rack::Ketai::Position.d2dms(position.lat) # => [35, 0, 35.35]

測地系の変換には、Yoji Shidara氏が公開しているjpmobileい含まれるdatum_conv.rbを、MIT Licenseに従って利用しています。

ディスプレイ情報の取得

環境変数もしくは ke-tai.org/ で公開されている携帯端末スペック一覧のデータから縦横ピクセル数及び色数を取得できます。

ketai = env['rack.ketai']
display = ketai.display
display.colors # 色数 取得できなければ nil
display.width  # 横サイズ 取得できなければ nil
display.height # 縦サイズ 取得できなければ nil

Cookie使用の可否

DoCoMoの場合はiモードブラウザ2.0、SoftBankは現行の全機種、auも全機種(WAP1.0端末はSSL通信時利用不可)っぽいのでそれを判別してくれます。(できるだけ…)

if env['rack.ketai'].supports_cookie?
  # Cookie 使用可能
else
  # Cookie 使用不可
end

キャッシュサイズの取得

環境変数や端末名からブラウザのキャッシュサイズ(Bytes)を取得します。取得できない場合は、それっぽい最小の値を返します。

env['rack.ketai'].cache_size # => 100000 (100KB)

IPアドレス帯域の正当性チェック

ユーザのアクセス元のIPアドレスがキャリアが公開するアドレス帯に含まれているか確認できます。 ユーザID等の偽装防止等に役立ちます。

ketai = env['rack.ketai']
unless ketai.mobile? && ketai.valid_addr?
  # 携帯からのアクセスでない
end

入出力文字コード変換

DoCoMoまたはauの携帯電話との通信でShift_JISを使うようになります。 Content-typeも便宜書き換えます。

絵文字キャリア間変換

入力された絵文字を、emoji4unicodeによる変換テーブルを元に [e:XXX] という文字列に置き換えます。 (XXX はemoji4unicodeによる絵文字のID) 文字列に置き換えるようにしたのは、PCからの絵文字の入力・表示への対応を容易にするためです。 出力時にキャリアに応じた絵文字コードに変換します。

なお、文字コード変換及び絵文字変換を行いたくない場合は、:disable_filterオプションを設定します。

use Rack::Ketai, :disable_filter => true

PCでの絵文字表示

SixApartが公開している絵文字アイコン画像を別途ダウンロード・配置し、簡単なコードを追加することで携帯キャリア以外でのアクセスの際に絵文字画像を表示できます。

TypePadの絵文字アイコン画像と、携帯コンテンツ表示モジュールをフリー(自由)ライセンスで公開 start.typepad.jp/typecast/

絵文字アイコンをダウンロードし、public/images/emoticons/*.gif に配置した場合の例

use Rack::Static, :urls => ['/images'], :root => 'public'
use Rack::Ketai, :emoticons_path => '/images/emoticons'
run MyApp.new

UA判定

if env['rack.ketai'].smartphone?
  # スマートフォン
elsif env['rack.ketai'].featurephone?
  # フィーチャーフォン
elsif env['rack.ketai'].tablet?
  # タブレット(Android or iPad)
else
  # その他PCなど
end

または

case env['rack.ketai']
when Rack::Ketai::Carrier::IPhone
  # iPhone
when Rack::Ketai::Carrier::Android
  # Android
end

mobile?は携帯端末かどうかの判定になりました。(タブレットも一応携帯端末扱いとしてます)

端末名の取得などは未実装です。また、#valid_addr?は常に偽です。

作者

Copyright 2009-2010 © Yuichi Takeuchi, under MIT License

Yuichi Takeuchi <mizincogrammer@gmail.com>

d.hatena.ne.jp/mizincogrammer