├── .gitignore ├── README.md ├── app.js ├── bin ├── export_to_csv.sh └── import_to_redis.sh ├── db └── telocation.db └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/** 2 | db/data.csv 3 | db/dump.rdb 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ###简介 2 | 手机归属地查询接口 3 | 4 | 5 | ###依赖 6 | * node.js 7 | * [restify](http://mcavage.github.com/node-restify) 8 | * redis-server 9 | * sqlite3 (可选) 10 | 11 | 12 | ###安装部署 13 | 首先安装`redis-server`,如果有`brew` 14 | 15 | brew install redis 16 | 17 | 18 | 同时安装`hiredis`可获得更高的性能 19 | 20 | brew install hiredis 21 | 22 | 23 | 安装依赖库 24 | 25 | cd moquery 26 | npm install -d 27 | 28 | 启动`redis-server`,导入数据 29 | 30 | ./bin/export_to_csv.sh 31 | ./bin/import_to_redis.sh 32 | 33 | 34 | 启动HTTP服务 35 | 36 | node app.js 37 | 38 | 通过`curl`命令测试 39 | 40 | curl -is http://localhost:3000/mobile/13800138000 41 | 42 | curl -is http://localhost:3000/mobile/19012312312334 43 | 44 | 45 | ###关于数据 46 | 归属地数据库从网上下载,共包含`249145`条记录。 47 | `telocation.db`是下载的原始sqlite数据文件 48 | `data.csv`是从`telocation.db`导出的`csv`文本格式 49 | 50 | 可以通过以下命令重新生成 51 | 52 | ./bin/export_to_csv.sh 53 | 54 | 执行后`./db/data.csv`会被覆盖 -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var restify = require('restify'); 2 | var redis = require('redis').createClient(); 3 | 4 | var server = restify.createServer({ 5 | name: 'moquery', 6 | version: '0.1.0' 7 | }); 8 | server.use(restify.acceptParser(server.acceptable)); 9 | server.use(restify.queryParser()); 10 | server.use(restify.bodyParser()); 11 | 12 | redis.on("error", function (err) { 13 | console.log("redis error : " + err); 14 | }); 15 | 16 | /** 17 | * 查询手机号归属地 18 | * 输入最少前7位的手机号 19 | */ 20 | server.get('/mobile/:number', function (req, res, next) { 21 | var num = req.params.number; 22 | console.log("查询的手机号:"+ num); 23 | //1300002 24 | redis.hgetall(num.substr(0,7) , function (err, obj) { 25 | if (err){ 26 | next(err); 27 | } 28 | if (obj.area){ 29 | obj.mobile = num; 30 | console.dir(obj); 31 | res.send(obj); 32 | } else { 33 | res.send(new restify.InvalidArgumentError("找不到对应的归属地")); 34 | } 35 | }); 36 | 37 | return next(); 38 | }); 39 | 40 | server.listen(3000, function () { 41 | console.log('%s listening at %s', server.name, server.url); 42 | }); 43 | 44 | 45 | -------------------------------------------------------------------------------- /bin/export_to_csv.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | sqlite3 -nullvalue -csv ./db/telocation.db "SELECT l.'_id', l.location AS 'provide', t.location AS 'area' FROM mob_location l LEFT JOIN tel_location t ON l.areacode = t.'_id'" > ./db/data.csv 4 | 5 | echo 'export data finished.' 6 | 7 | -------------------------------------------------------------------------------- /bin/import_to_redis.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | ##HMSET key field value [field value ...] 3 | 4 | cat ./db/data.csv | awk -F "|" "BEGIN {x=1} {print \"HMSET\", \$1, \"telecom\", \$2, \"area\", \$3 ; x++ }" | redis-cli > /dev/null 5 | 6 | 7 | echo 'import data finished.' 8 | echo 'try it now: ' 9 | echo ' $ redis-cli HGET 1300002 area' 10 | echo ' "安徽巢湖"' 11 | -------------------------------------------------------------------------------- /db/telocation.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roymax/moquery/ec57c5b3f2d7819667cda7d8e2e9373c87278694/db/telocation.db -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "moquery" 3 | , "version": "0.1.0" 4 | , "private": true 5 | , "dependencies": { 6 | "redis": "0.7.1" 7 | ,"restify": ">=1.0.0" 8 | } 9 | } --------------------------------------------------------------------------------