にっぽんの携帯電話

インターネット上で携帯電話用のホームページをたくさん作りたかったのですが
機種ごとでずいぶんやりかたが違って、ホームページごとに作るのがたいへんだったので
よく使いそうなところをどこからでも見られるようにしてみました。

注意


つかいかた

パラメーター"UA"に携帯電話のUser-Agent文字列を指定したHTTPリクエストを出すと、JSON形式のデータを含んだレスポンスを返します。
http://scissorhands.jpn.org/DIY/pidb/get/ [ モード名 ] ?UA= [ User-Agent文字列 ]
パラメーター"callback"を指定すると、JSONP形式のデータを含んだレスポンスを返します。
http://scissorhands.jpn.org/DIY/pidb/get/ [ モード名 ] ?callback=[ コールバック関数名 ]&UA= [ User-Agent文字列 ]
モード名は5、6個あるので、好きなときに好きなのを使いましょう。
>>モード別レスポンスデータ詳細

たとえば、自分のサイトに携帯電話がアクセスしてるけど機種は何なのか知りたいな、というときは
自分のCGIプログラムなどでUser-Agent文字列を取得して、ここのURLに送りつけてみましょう。
User-Agent文字列はそのまま送りつけてもなんとかなることが多いですが、
アレな会社のアレな機種名とかがアレなので、URLエンコードした方がしあわせになれるかもしれません。
(例) http://scissorhands.jpn.org/DIY/pidb/get/basic?UA=KDDI-ST31 UP.Browser/6.2.0.11.1.2 (GUI) MMP/2.0
体調が良ければ、MIMEタイプがapplication/jsonのデータが返ってきます。
(例) {"unique_id_availability":"1","packet_fee":"0.21","flat_fee_availability":"1","carrier_name":"au","result":"1","model_name":"W42SA"}
たとえばこんな感じのデータをうまいこと出力すれば、なんかうれしいことになるかも。
もちろん自前でDBを持つよりレスポンスは悪いよ!
まっとうな仕事で使おうなんて考えるのは無謀だよ!

サンプルコード

アクセスした携帯電話の機種名がわかるページ。
http://scissorhands.jpn.org/DIY/pidb/sample
#!/usr/bin/perl

use strict;
use warnings;

use utf8;
# 日本の携帯電話の基本はShift-JISらしいよ。
use encoding 'utf8', STDOUT=>'shift_jis';

use LWP::UserAgent;
use JSON;

# 細かいエラー処理がめんどくさいので
# ざっくりevalで囲ってしまいました。
eval {

my $lwp = LWP::UserAgent->new(
  agent => 'ScissorHands::DIY::PIDB::TestAgent::Basic',
  timeout => 5
);

my $base_url = 'http://scissorhands.jpn.org/DIY/pidb/get/basic';
my $user_agent = $ENV{'HTTP_USER_AGENT'} || '';
# User-Agent文字列のURLエンコード
$user_agent =~ s/([^¥w ])/'%'.unpack('H2', $1)/eg;
$user_agent =~ tr/ /+/;
my $url = $base_url . '?UA=' . $user_agent;

my $http_response = $lwp->get($url);

if (! $http_response->is_success) {
  die('サーバーが落ちてるかも?');
}


my $basic_hashref = JSON->new->utf8->decode($http_response->content) || undef;
if (! $basic_hashref->{'result'}) {
  die('情報が取れなかったよ・・・出直してきます・・・');
}
my $carrier_name = $basic_hashref->{'carrier_name'} || '取得失敗';
my $model_name = $basic_hashref->{'model_name'} || '取得失敗';
# 機種名文字列のURLデコード
$model_name =~ tr/+/ /;
$model_name =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;

print << "__EOF__";
Content-Type: text/html

<html>
<head>
<title>
サンプル
</title>
</head>
<body>
あなたの携帯電話は
$carrier_name の
$model_name かな?
</body>
</html>
__EOF__


};
if ($@) {
	&error($@);
}

exit(0);


# エラー処理。
sub error {

my $messages = shift;

print << "__EOF__";
Content-Type: text/html

<html>
<head>
<title>
サンプル
</title>
</head>
<body>
$messages
</body>
</html>
__EOF__

}


Q: なんでJSONなの?
A: かんたんそうだったから。

Q: 最初の頃はX-JSONに返してたよね?
A: ごめんなさい調子に乗ってました。jqueryで遊べないのでやめました。

Q: 項目名がださい。
A: ごめんなさい。

Q: もっとこまかくなきゃ役に立たないよ。
A: 僕はこのぐらいが好きです。

Q: まちがってるよ、ここ。
A: ありがとう。


【basicモード】

http://scissorhands.jpn.org/DIY/pidb/get/basic?UA=[ User-Agent文字列 ]
基本的っぽいけどあまり使わない情報。
項目名 項目の意味 備考
result 検索結果 1:成功 0:失敗
model_name 機種名 URLエンコードしたUTF-8文字列
carrier_name どこかで見たような会社名
flat_fee_availability パケット定額にできるかどうか 1:できる 0:できない
packet_fee パケット料金 単位は「日本円」
unique_id_availability 端末識別IDを取得できるかどうか 1:できる 0:できない

【webモード】

http://scissorhands.jpn.org/DIY/pidb/get/web?UA=[ User-Agent文字列 ]
たぶんいちばんよく使う情報。
項目名 項目の意味 備考
result 検索結果 1:成功 0:失敗
display_color_depth 画面の色深度 単位は「ビット」
max_pagesize 最大ページサイズ 単位は「キロバイト」
xhtml_availability XHTMLを使えるかどうか 1:できる 0:できない
ssl_availability SSLを使えるかどうか 1:できる 0:できない
gif_availability GIF画像を使えるかどうか 1:できる 0:できない
gif_movie_availability GIFアニメを使えるかどうか 1:できる 0:できない
jpeg_availability JPEG画像を使えるかどうか 1:できる 0:できない
png_availability PNG画像を使えるかどうか 1:できる 0:できない
wallpaper_width 壁紙画像の最大幅 単位は「ドット」
wallpaper_height 壁紙画像の最大高さ 単位は「ドット」
browser_width ブラウザ画像の最大幅 単位は「ドット」
browser_height ブラウザ画像の最大高さ 単位は「ドット」

【movieモード】

http://scissorhands.jpn.org/DIY/pidb/get/movie?UA=[ User-Agent文字列 ]
ムービーに関する情報。
項目名 項目の意味 備考
result 検索結果 1:成功 0:失敗
movie_format ムービー形式 3gpp、3gpp2、amc、asf
max_filesize 最大ファイルサイズ 単位は「バイト」
video_codec 映像コーデック mpeg4、h264
video_max_framerate 映像の最大フレームレート 単位は「fps」
video_max_bitrate 映像の最大ビットレート 単位は「kbps」
qvga_availability QVGAムービー(320x240)を再生できるかどうか 1:できる 0:できない
qcif_availability QCIFムービー(176x144)を再生できるかどうか 1:できる 0:できない
sqcif_availability Sub-QCIFムービー(128x96)を再生できるかどうか 1:できる 0:できない
light_availability Lightムービー(96x80)を再生できるかどうか 1:できる 0:できない
audio_max_bitrate 音声の最大ビットレート 単位は「kbps」
amr_availability AMR-NB音声を再生できるかどうか 1:できる 0:できない
aac_availability AAC音声を再生できるかかどうか 1:できる 0:できない
mp3_availability MP3音声を再生できるかかどうか 1:できる 0:できない

【applicationモード】

http://scissorhands.jpn.org/DIY/pidb/get/application?UA=[ User-Agent文字列 ]
めくるめく便利機能の使用可否。
話せりゃいいんですよ。
項目名 項目の意味 備考
result 検索結果 1:成功 0:失敗
qrcode_availability 二次元バーコードを読めるかどうか 1:できる 0:できない
gps_availability GPS情報を使えるかどうか 1:できる 0:できない
baseinfo_availability 基地局情報を使えるかどうか 1:できる 0:できない
areainfo_availability 独自の位置情報を使えるかどうか 1:できる 0:できない
pdf_availability PDFファイルを読めるかどうか 1:できる 0:できない

【flashモード】

http://scissorhands.jpn.org/DIY/pidb/get/flash?UA=[ User-Agent文字列 ]
Flash Liteの対応状況。
項目名 項目の意味 備考
result 検索結果 1:成功 0:失敗
flash_lite_version Flash Liteの対応バージョン
max_filesize Flashの最大ファイルサイズ 単位は「キロバイト」
browser_width ブラウザでのFlashの最大幅 単位は「ドット」
browser_height ブラウザでのFlashの最大高さ 単位は「ドット」

【ip_addressモード】

http://scissorhands.jpn.org/DIY/pidb/get/ip_address
携帯電話っぽいIPアドレス帯の情報。
項目名 項目の意味 備考
result 検索結果 1:成功 0:失敗
ip_address IPアドレス帯の配列 ["IPアドレス帯1","IPアドレス帯2",......]