目的
通过本文你可以自己动手制作最新的号码归属地库
所需技术
ü html
ü js、ajax
ü php(或jsp)
ü mysq
基本思路
利用http://api.showji.com提供的查询接口,前台页面(querymobile.html)不断查询获归属地数据,再提交到后台处理页面(deal.php),把数据保存至数据库(phonenumber_db)表(tb_number)。
实现步骤
1. 前台html页面
一个开始号码输入框、一个【开始查询】按钮,还有一些显示查询结果的span标签,很简单。如下图:
部分源码如下:
…………
起始号码(前七位):<input type="text" name="m" value="1300000" " id="m" />
<input type="button" value="开始查询" id="btnQuery" οnclick="btnQuery(this)" />
<ul>
<li>所查号码:<span id="txtMobile"></span></li>
<li>归属省份:<span id="txtProvince"></span></li>
<li>归属城市:<span id="txtCity"></span></li>
<li>城市区号:<span id="txtAreaCode"></span></li>
<li>城市邮编:<span id="txtPostCode"></span></li>
<li>卡 类 型:<span id="txtCard"></span></li>
</ul>
…………
2. 前台js
js在这里很重要,代码较多,但都是基本的东西,有注释,应该好理解
/** **********全局变量定义************** */
// 开始号码(注:前七位手机号码即可)
var startNumber = 1300000;
// 是否停止
var isFinish = false;
/** ************************ */
// 根据元素id获取元素
// lxq 2011/09/11
/** ************************ */
function $(objID) {
return document.getElementById(objID);
}
/** ************************ */
// 号码查询后,执行的回调函数
// lxq 2011/09/11
/** ************************ */
function querycallback(obj) {
// 检查是否成功获取手机归属信息
if (obj["QueryResult"] != "True") {
// 显示查询到的归属信息
$("txtMobile").innerHTML = '<bold>暂无无数据</bold>';
$("txtProvince").innerHTML = '';
$("txtMobile").innerHTML = '';
$("txtCity").innerHTML = '';
$("txtAreaCode").innerHTML = '';
$("txtPostCode").innerHTML = '';
$("txtCard").innerHTML = '';
} else {
// 显示查询到的归属信息
$("txtMobile").innerHTML = obj["Mobile"];
$("txtProvince").innerHTML = obj["Province"];
$("txtCity").innerHTML = obj["City"];
$("txtAreaCode").innerHTML = obj["AreaCode"];
$("txtPostCode").innerHTML = obj["PostCode"];
$("txtCard").innerHTML = obj["Corp"] + obj["Card"];
// alert(obj.toJSONString());
// 将查询结果返回后台,交与jsp(或php处理
postDataToBack(obj);
}
}
/** ************************ */
// 查询号码函数,执行的回调函数
// lxq 2011/09/11
/** ************************ */
function query() {
// 若有停止查询,应跳出查询程序,不再继续执行
if (isFinish) {
return;
}
// 读取归属数据,成功后调用 querycallback 函数
var oHead = document.getElementsByTagName('head')[0];
var oTar = $("remotejs");
// 存在此js节点应删除,防止累计生成重复js代码
if (oTar)
oHead.removeChild(oTar);
var oScript = document.createElement('script');
oScript.type = "text/javascript";
oScript.id = "remotejs";
oScript.src = "http://api.showji.com/Locating/default.aspx?m="
+ escape(startNumber) + "&output=json&callback=querycallback";
oHead.appendChild(oScript);
startNumber++;
$("m").value = startNumber;
}
/** ************************ */
// 查询按钮事件
// lxq 2011/09/11
/** ************************ */
function btnQuery(btn) {
// 获取号码,进行验证
var mobile = $("m").value;
if (mobile.length == 1) {
alert('请输入号码');
return;
}
if (btn.value == '开始查询') {
var number = $("m").value;
if (number != '') {
try {
startNumber = parseInt(number);
} catch (err) {
$("m").value = startNumber;
}
;
} else {
$("m").value = startNumber;
}
btn.value = '停止查询';
isFinish = false;
query();
} else if (btn.value == '停止查询') {
btn.value = '继续查询';
isFinish = true;
} else if (btn.value == '继续查询') {
btn.value = '停止查询';
isFinish = false;
query();
}
};
/** ************************ */
// 提交数据到后台处理页面deal.php
// lxq 2011/09/11
/** ************************ */
var xmlHttp;
function postDataToBack(data) {
xmlHttp = null;
var url = "http://localhost/test/deal.php";
if (window.XMLHttpRequest) {// IE7, Firefox, Opera
xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {// IE6, IE5
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlHttp != null) {
xmlHttp.onreadystatechange = function() {
// 若后台处理完,继续查询下一个号码
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
// alert(xmlHttp.responseText);
query();
}
};
xmlHttp.open("POST", url, true);
xmlHttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
var urlparams = "Mobile=" + data["Mobile"] + "&Province="
+ data["Province"] + "&City=" + data["City"] + "&AreaCode="
+ data["AreaCode"] + "&PostCode=" + data["PostCode"] + "&Corp="
+ data["Corp"] + "&Card=" + data["Card"];
urlparams = encodeURI(urlparams);
xmlHttp.send(urlparams);
}
3. 后台处理页面
后台的处理思路是:先查询是否存在该号码信息,如存在则不再录入该号码信息,其他到没什么了,就是简单的sql操作了。
<?php
header("Content-type: text/html; charset=utf-8");
//获取前台提交数据
$Mobile = $_POST["Mobile"];
$Province = urldecode($_POST["Province"]);
$City = urldecode($_POST["City"]);
$AreaCode = $_POST["AreaCode"];
$PostCode = $_POST["PostCode"];
$Corp = urldecode($_POST["Corp"]);
$Card = urldecode($_POST["Card"]);
$con = mysql_connect("localhost", "root", "root");
if (!$con)
{
error_log("创建mysql连接失败:". mysql_error(),3,"log.txt");
die('Could not connect: ' . mysql_error());
}
mysql_query("set names utf8",$con);
$db_selected = mysql_select_db("phonenumber_db",$con);
$sql="SELECT * FROM tb_number WHERE Mobile = '".$Mobile."'";
$result = mysql_query($sql,$con);
$row = mysql_fetch_row($result);
//查询不到此号码时,才进行录入该号码
if($row == false){
$sql ="INSERT INTO `phonenumber_db`.`tb_number` (`IID`, `Mobile`, `Province`, `City`, `AreaCode`, `PostCode`, `Corp`, `Card`) VALUES"
." (NULL, '".$Mobile."', '".$Province."', '".$City."', '".$AreaCode."', '".$PostCode."', '".$Corp."', '".$Card."');";
$isSuccess = mysql_query($sql,$con);
if($isSuccess == false){
//echo '插入数据失败....';
error_log("插入数据失败:".error_get_last(),3,"./log.txt");
}
}
//关闭连接
mysql_close($con);
?>
4. 数据库脚本
忘了说了,前台、js、后台、数据库都应该使用utf-8编码,防止出现乱码。
一个数据库一张表,这这些了
表tb_number
字段 | 类型 | Null | 默认 | 注释 |
IID | bigint(20) | 否 |
| 内部标识 |
Mobile | varchar(7) | 否 |
| 号码 |
Province | varchar(50) | 否 |
| 省份 |
City | varchar(50) | 否 |
| 地市 |
AreaCode | varchar(25) | 否 |
| 区域码 |
PostCode | varchar(25) | 否 |
| 邮政编码 |
Corp | varchar(25) | 否 |
| 运营商 |
Card | varchar(25) | 否 |
| 品牌 |
总结
以前在网上看到有人这样搞过,记不清出,手机号码归属地的数据库网上也有些现成的数据库,不是最新的,好像就10~20万条记录吧。网友也要那个j2me搞滴手机号码源程序,才想起做最新库的事,反正闲着没事做