にっぽんの携帯電話
インターネット上で携帯電話用のホームページをたくさん作りたかったのですが
機種ごとでずいぶんやりかたが違って、ホームページごとに作るのがたいへんだったので
よく使いそうなところをどこからでも見られるようにしてみました。
注意
- データは手作業で入れてるので、新機種の情報がかならず入ってるとはかぎりません。
- 個人的に調べた以外はいいかげんなデータなので、正しい情報はべつのところで調べてください。
- ある日突然アクセスできなくなっていたら、遠くの空に思いを馳せてください。
つかいかた
パラメーター"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"}
たとえばこんな感じのデータをうまいこと出力すれば、なんかうれしいことになるかも。
- ダウンロードするデータのパケット料金を計算するよ!
- 1枚の画像データを、みんなの携帯電話の画面サイズにあわせて変換するよ!
- 動画データを、みんなの携帯電話にあわせて変換するよ!
- 携帯電話のみアクセス可能な.htaccessをcronジョブで作るよ!
もちろん自前で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",......] |