PHPで携帯キャリアのIPアドレス帯域を求める

(1/1)
携帯サイトでは、携帯キャリア各社が利用している IP 帯域を調べ、携帯電話からのアクセスかどうかを確認することが多い。この IP 帯域は、携帯キャリア各社が公表している。
今回は、PHP を使って公表データの IP 帯域の部分を抽出・表示するプログラムを作ってみることにする。

サンプル・プログラムの実行例

PHPで携帯キャリアのIPアドレス帯域を求める

サンプル・プログラム

解説:IP帯域の取得処理

0114: /**
0115:  * NTTドコモのIPアドレス帯域を取得する
0116:  * @return array IPアドレス帯域を示す配列
0117: */
0118: function getDoCoMo() {
0119:     $url = 'https://www.nttdocomo.co.jp/service/developer/smart_phone/spmode/index.html';
0120:     $IPs = FALSE;
0121:     $cnt = 0;
0122: 
0123:     if (($infp = @fopen($url, 'r')) == FALSE)    return FALSE;
0124:     $IPs['DoCoMo'][$cnt] = '#DoCoMo';
0125:     $cnt++;
0126: 
0127:     //IPアドレス帯域までスキップ
0128:     while (! feof($infp)) {
0129:         $s = mb_convert_encoding(fgets($infp), INTERNAL_ENCODING, 'SJIS');
0130:         if (preg_match('/<h2 class\="title">/u', $s) > 0)     break;
0131:     }
0132: 
0133:     //IPアドレス帯域を読み込む
0134:     while (! feof($infp)) {
0135:         $s = mb_convert_encoding(fgets($infp), INTERNAL_ENCODING, 'SJIS');
0136:         if (preg_match('/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+)/iu', $s$arr) > 0) {
0137:             $IPs['DoCoMo'][$cnt] = $arr[1];
0138:             $cnt++;
0139:         }
0140:     }
0141:     fclose($infp);
0142: 
0143:     return $IPs;
0144: }
0145: 
0146: /**
0147:  * au by KDDIのIPアドレス帯域を取得する
0148:  * @return array IPアドレス帯域を示す配列
0149: */
0150: function getAu() {
0151:     $url = 'http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html';
0152:     $IPs = FALSE;
0153:     $cnt = 0;
0154: 
0155:     if (($infp = @fopen($url, 'r')) == FALSE)    return FALSE;
0156:     $IPs['au'][$cnt] = '#au';
0157:     $cnt++;
0158: 
0159:     //IPアドレス帯域を読み込む
0160:     while (! feof($infp)) {
0161:         $s = mb_convert_encoding(fgets($infp), INTERNAL_ENCODING, 'SJIS');
0162:         if (preg_match('/<td[^\>]*><div class="TableText">(.+)<\/div><\/td>/u', $s$arr) > 0) {
0163:             $s1 = strip_tags($arr[1]);
0164:             if (preg_match('/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/u', $s1) == 0)  continue;
0165:             $s = mb_convert_encoding(fgets($infp), INTERNAL_ENCODING, 'SJIS');
0166:             $s2 = '';
0167:             if (preg_match('/(\/[0-9]+)/u', $s$arr) > 0)    $s2 = $arr[1];
0168:             $IPs['au'][$cnt] = $s1 . $s2;
0169:             $cnt++;
0170:         }
0171:     }
0172:     fclose($infp);
0173:     
0174:     return $IPs;
0175: }
0176: 
0177: /**
0178:  * SoftBankのIPアドレス帯域を取得する
0179:  * @return array IPアドレス帯域を示す配列
0180: */
0181: function getSoftBank() {
0182:     $url = 'http://creation.mb.softbank.jp/mc/tech/tech_web/web_ipaddress.html';
0183:     $IPs = FALSE;
0184:     $cnt = 0;
0185: 
0186:     if (($infp = @fopen($url, 'r')) == FALSE)    return FALSE;
0187:     $IPs['SoftBank'][$cnt] = '#SoftBank';
0188:     $cnt++;
0189: 
0190:     //IPアドレス帯域までスキップ
0191:     while (! feof($infp)) {
0192:         $s = fgets($infp);
0193:         if (preg_match('/<h4>IPアドレス<\/h4>/u', $s) > 0)    break;
0194:     }
0195: 
0196:     //IPアドレス帯域を読み込む
0197:     while (! feof($infp)) {
0198:         $s = fgets($infp);
0199:         if (preg_match('/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+)/u', $s$arr) > 0) {
0200:             $IPs['SoftBank'][$cnt] = $arr[1];
0201:             $cnt++;
0202:         }
0203:     }
0204:     fclose($infp);
0205: 
0206:     return $IPs;
0207: }
0208: 
0209: /**
0210:  * ワイモバイル(EMOBILE)のIPアドレス帯域を取得する
0211:  * @return array IPアドレス帯域を示す配列
0212: */
0213: function getEMnet() {
0214:     $url = 'http://developer.emnet.ne.jp/ipaddress.html';
0215:     $IPs = FALSE;
0216:     $cnt = 0;
0217: 
0218:     if (($infp = @fopen($url, 'r')) == FALSE)    return FALSE;
0219:     $IPs['EMnet'][$cnt] = '#EMnet';
0220:     $cnt++;
0221: 
0222:     //IPアドレス帯域を読み込む
0223:     while (! feof($infp)) {
0224:         $s = fgets($infp);
0225:         if (preg_match('/\<div.+?>([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+)/u', $s$arr) > 0) {
0226:             $IPs['EMnet'][$cnt] = $arr[1];
0227:             $cnt++;
0228:         }
0229:     }
0230:     fclose($infp);
0231: 
0232:     return $IPs;
0233: }

携帯キャリア各社は、下記ページで IP 帯域を公表している。
各々のページの構造を解析して作ったのが、取得処理用のユーザー関数 getDoCoMo, getAu, getSoftBank, getEMnet である。

構造は簡単で、IP アドレス帯域が羅列されている部分までスキップし、正規表現を使って IP アドレスを取り出すというものである。getAu については、スキップ処理は行わない。
ただし、このような取得方法をしているため、各社の公表ページの仕様やレイアウトが変わると、このプログラムは正常に動かなくなってしまう。

プログラムのアウトプットは、Apache の ".htaccess" にそのまま利用できるテキスト形式にした。

参考サイト

(この項おわり)
header