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

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

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

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

サンプル・プログラム

解説:IP帯域の取得処理

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

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

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

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

参考サイト

(この項おわり)
header