PHPでスマホのUAからキャリア判別する唯一の方法


PHPを使ってスマートフォンのUserAgentからキャリアを判別するたった一つの方法メモです。
今まではキャリアごとの制約やサービスが多く存在しましたが、今後はキャリアの垣根を超えたサービス時代になりそうなので、スマホのキャリア振り分け自体の需要は減るとは思います。
ただ、PHP以外の何を使ったとしてもスマホのキャリア判別には限界がありそうです。
というか完全に絞るのはほぼ無理だと理解した上でその方法を見ていきましょう。

SPONSORED LINK

キャリア回線のIPアドレスから判別する

大手3キャリアが開示するスマホからのアクセス時のIPアドレスになります。
作ろうスマートフォンコンテンツ : その他の技術情報 | サービス・機能 | NTTドコモ
ネットワークの接続条件 | Android(TM) 技術情報 | au
Web技術情報 | SoftBank スマートフォン サービス開発支援サイト | ソフトバンク
これらを利用すれば正確な振り分けは可能になりますが、Wifiを利用するのが当たり前のこの時代にはこれだけで判別するのはナンセンスですね。
つまり、上記の情報はもしも当てはまるIPだったら絞れるという第一段階での判別だけに留まりそうです。

無線LAN(Wifi)のスマホをキャリア判別

もしもスマホでWifi経由でのアクセスだった場合を考えてみます。
こうなるとスマホだけでなくどの端末でもIPアドレスといった判別はできません。
なので、キャリアの判別は最終的にUAのみで行うことになります。

各キャリアのUAに含まれる型番からキャリア判別を行う

新機種発表毎に型番の追加を行う必要がある為、完全自動判別は現時点では不可能です。
しかもUAにキャリア差がない端末が登場してきたら、追従するのは無理になってしまいます。

諸刃の刃ですが今のところ各キャリアで型番の法則性が見えますので、スマホのキャリア判別できる唯一の方法と言えるかもしれません。
UAとキャリアの型番が一致しない機種もありますが、型番自体は含まれることが多いので、以下のようなコードでドコモを判別できます。

$ua = $_SERVER['HTTP_USER_AGENT'];
if(preg_match(/(HT-03A|SC-02B|SC-01C)/,$ua)){
$spc = "docomo";
}

この処理を端末が増えるごとに追加していくことになります。
あぁガラケー時代を思い出すこの感覚。メンドクサーイ。

キャリアごとの型番とUA文字列

現時点でのキャリアと型番とUA文字列の法則をリスト化してみました。こう見ると、判別ができなくもないと思えますが、大きな落とし穴が待っていました。
それは「もうSIMロック解除ができる時代ですよ」ってこと。
そのUAが含まれる端末が本当にそのキャリアのSIMを使っているのかはわかりません。

キャリア / 型番 / UA文字列
docomo / HT-03A / HT-03A
docomo / SC-02B / SC-02B
docomo / SC-01C / SC-01C
docomo / SH-03C / SH-03C
docomo / T-01C / T-01C
docomo / P-07C / P-07C
docomo / SO-03C / SO-03C
docomo / SO-01D / SO-01D
docomo / P-01D / P-01D
docomo / T-01D / T-01D
docomo / SC-03D / SC-03D
docomo / F-03D / F-03D
docomo / SC-04D / Galaxy Nexus
docomo / SH-01D / SH-01D
docomo / SH-02D / SH-02D
docomo / N-01D / N-01D
docomo / L-01D / L-01D
docomo / F-05D / F-05D
docomo / P-02D / P-02D
docomo / F-07D / F-07D
docomo / L-02D / L-02D
docomo / L-04C / L-04C
docomo / N-04C / N-04C
docomo / SO-01C / SO-01C
docomo / SH-12C / SH-12C
docomo / L-07C / L-07C
docomo / SC-02C / SC-02C
docomo / N-06C / N-06C
docomo / F-12C / F-12C
docomo / SH-13C / SH-13C
docomo / SC-02C / SC-02C
SoftBank / 005SH / SBM005SH
SoftBank / 006SH / SBM006SH
SoftBank / 007SH / SBM007SH
SoftBank / X06HT / X06HT
SoftBank / X06HTII / X06HT
SoftBank / 001HT / 001HT
SoftBank / 003SH / SBM003SH
SoftBank / 001DL / 001DL
SoftBank / 003Z / 003Z
SoftBank / 003P / 003P
SoftBank / 008Z / 008Z
SoftBank / 009SH / SBM009SH
SoftBank / 007HW / 007HW
SoftBank / 007SH J / SBM007SHJ
SoftBank / 007SH KT / SBM007SHK
SoftBank / 009SH Y / SBM009SHY
SoftBank / 101SH / SBM101SH
SoftBank / 102SH / SBM102SH
SoftBank / 009Z / 009Z
SoftBank / 101P / 101P
SoftBank / 101N / 101N
SoftBank / 103SH / SBM103SH
SoftBank / 101K / 101K
DisneyMobile / DM009SH / DM009SH
DisneyMobile / DM010SH / DM010SH
DisneyMobile / DM011SH / DM011SH
au / IS03 / IS03
au / IS04 / IS04
au / IS05 / IS05
au / IS06 / IS06
au / ISW11K / ISW11K
au / ISW11F / ISW11F
au / IS11N / IS11N
au / IS14SH / IS14SH
au / IS12F / IS12F
au / EIS01PT / EIS01PT
au / IS11LG / IS11LG
au / ISW11SC / ISW11SC
au / ISW11HT / ISW11HT
au / IS11SH / IS11SH
au / IS11S / SonyEricssonIS11S
au / IS12SH / IS12SH
au / INFOBAR A01 / INFOBAR A01
au / IS11CA / IS11CA
au / IS11T / IS11T
au / IS11PT / IS11PT
au / ISW12HT / ISW12HT
au / ISW11M / ISW11M
au / IS13SH / IS13SH

最新機種のスマホなどは各キャリア公式サイトから取得しましょう。

まとめ

今どうしてもキャリア判別をしたいと思っている人は「なぜキャリアを判別したいのか」をもう一度考えてみてください。
本当に必要な作業なのでしょうか?
対処方法には色々あるはずです。
どうしても判別が必要ならばユーザーに自己申告してもらってそれぞれに移ってもらう構成でもいいのではないでしょうか?
何かもっと良い方法があったら是非教えて下さい。

今日も知識欲は止まらない。

関連トピック

Way

JavaScriptでUA判別してスマホとタブレットを振り分ける方法

JavaScriptを使用してUAでiPhoneやAndroidのスマホを判定したり、増加傾向にあるタブレットを判別する方法メモ。 U

Facebook

FacebookのRSSを取得する方法@Facobook API JSON対応

FacebookのRSSを取得する方法メモです。Facebookでは大規模な仕様変更が何度も行われて、古い情報ではRSSの取得ができない

php_Missing_argument

PHPエラー対処方法「 Warning: Missing argument 1 for」

PHPにおけるPHP Warning: Missing argument 1 for... というエラーの原因と対処方法メモです。

Language

PHPのmb_send_mail関数やmail関数で文字化け問題を解消する

PHPのmb_send_mail関数やmail関数で文字化けに悩んでいませんか? 正直、色々な原因があるので特効薬のような対処法はあり

apk_android

Androidアプリのapkを解析してソースコードを見れるの?

Androidアプリを解析する方法が気になって調べてみると、とても簡単に解析できてしまうことに驚きます。 もちろん難読化といった処置を

php

PHPエラー対処法 First argument should be an array

[code] First argument should be an array [/code] このエラーは、 最初の引数

xml_error

PHPエラー対処方法「simplexml_load_file」&「simplexml_load_string」

PHP simplexml_load_fileを使用して「I/O warning : failed to load external e

mysql_limit_pf

MySQLのlimitで大量データのパフォーマンスが遅い重い!

MySQLのlimitを使用した場合、オフセット部分が増えるとパフォーマンスが低下する場合の対処方法メモ。 データベースからlimit

公開日:2012/05/22