UDN-企业互联网技术人气社区

板块导航

浏览  : 1976
回复  : 0

[讨论交流] openResty IP数据库脚本

[复制链接]
哥屋恩的头像 楼主
发表于 2016-10-23 13:25:53 | 显示全部楼层 |阅读模式
  ipip.net IP数据库之openresty版,为了方便nginx使用ip 数据所封装的拓展包。

  使用方式

  本脚本封装了ipip.net的主要接口配制好后就可以直接使用,并不需要再去复杂的内部实现。

  需要注意的是如果使用API访问需要http拓展包。

  代码我已提交至GitHub: https://github.com/icowan/lua-resty-17mon

  如果对lua不了解请看我前段时间写的: 《Lua基础学习方式 (一天学会) 》

  如果还没安装openresty请看: 《优雅的安装openresty 》

  nginx 配制

  要使用首先得载入自己写义的lualib,这个根据你安装的或使用方式去修改路径。

  1.   lua_package_path "/usr/local/openresty/lualib/?.lua;/var/www/lua-resty-17mon/lualib/?.lua;;";

  2.   lua_package_cpath "/usr/local/openresty/lualib/?.so;;";

  3.   error_log /var/www/lua-resty-17mon/logs/lua-resty-17mon.debug.log debug;

  4.   server {

  5.   listen 8080;

  6.   server_name localhost;

  7.   charset utf-8;

  8.   location /ipLocation {

  9.   resolver 8.8.8.8; # 如果要使用api的话 需要dns 这可以改成中国的会快一些

  10.   default_type "text/plain";

  11.   content_by_lua_file "/var/www/lua-resty-17mon/script/ip_location.lua";

  12.   }

  13.   }
复制代码


  lua 脚本使用

 
  1.  -- /var/www/lua-resty-17mon/script/ip_location.lua

  2.   ngx.req.read_body()

  3.   ngx.header.content_type = "application/json;charset=UTF-8"

  4.   local cjson = require "cjson"

  5.   local success = function(con)

  6.   return cjson.encode({

  7.   success = true,

  8.   body = con

  9.   })

  10.   end

  11.   local failure = function(err)

  12.   return cjson.encode({

  13.   success = false,

  14.   errors = err

  15.   })

  16.   end

  17.   -- 参数获取

  18.   local request_args = ngx.req.get_uri_args()

  19.   local ip_address = request_args['ip']

  20.   -- 如果不需要验证可以不用此拓展

  21.   local checkIp = require("ip_check"):new(ip_address)

  22.   -- 验证ip

  23.   local ok, err = checkIp:checkIp()

  24.   if not ok then

  25.   ngx.say(failure(err))

  26.   return

  27.   end

  28.   -- 使用本地数据库

  29.   local ipdetail, err = require("ip_location"):new(ip_address, "/var/www/lua-resty-17mon/file/17monipdb.dat")

  30.   if not ipdetail then

  31.   ngx.log(ngx.ERR, err)

  32.   ngx.say(failure(err))

  33.   return

  34.   end

  35.   local ipLocation, err = ipdetail:location()

  36.   if not ipLocation then

  37.   ngx.log(ngx.ERR, err)

  38.   ngx.say(failure(err))

  39.   return

  40.   end

  41.   ngx.say(success(ipLocation))
复制代码


  通过免费api获取ip信息

  如果通过api获取数据需要使用http服务,这里需要使用lua-resty-http 这里我已经把它直接放到lualib/resty目录了,可以直接使用 感谢pintsized提供的脚本

  1.   -- /var/www/lua-resty-17mon/script/ip_location.lua

  2.   local ipdetail, err = require("ip_location"):new(ip_address)

  3.   if not ipdetail then

  4.   ngx.log(ngx.ERR, err)

  5.   ngx.say(failure(err))

  6.   return

  7.   end

  8.   local ipLocation, err = ipdetail:locationApiFree()

  9.   if not ipLocation then

  10.   ngx.log(ngx.ERR, err)

  11.   ngx.say(failure(err))

  12.   return

  13.   end

  14.   ngx.say(success(ipLocation))
复制代码


  通过付费api获取ip信息

  1.   -- /var/www/lua-resty-17mon/script/ip_location.lua

  2.   local ipdetail, err = require("ip_location"):new(ip_address, "", "your token")

  3.   if not ipdetail then

  4.   ngx.log(ngx.ERR, err)

  5.   ngx.say(failure(err))

  6.   return

  7.   end

  8.   local ipLocation, err = ipdetail:locationApi("your sid", "your uid")

  9.   if not ipLocation then

  10.   ngx.log(ngx.ERR, err)

  11.   ngx.say(failure(err))

  12.   return

  13.   end

  14.   ngx.say(success(ipLocation))
复制代码


  获取aip使用状态

  1.   -- /var/www/lua-resty-17mon/script/ip_location.lua

  2.   local ipdetail, err = require("ip_location"):new(ip_address, "your token")

  3.   if not ipdetail then

  4.   ngx.log(ngx.ERR, err)

  5.   ngx.say(failure(err))

  6.   return

  7.   end

  8.   local ipLocation, err = ipdetail:apiStatus()

  9.   if not ipLocation then

  10.   ngx.log(ngx.ERR, err)

  11.   ngx.say(failure(err))

  12.   return

  13.   end

  14.   ngx.say(success(ipLocation))
复制代码


  返回数据结构

  Response

  返回类型: JSON

参数
类型
备注
successbooltrue or false
errors or bodystring当success为false时errors有值否则返回body

  body返回参数详情

参数
类型
备注
countrystring国家
citystring省会或直辖市(国内)
regionstring地区或城市 (国内)
placestring学校或单位 (国内)
operatorstring运营商字段
latitudestring纬度
longitudestring经度
timeZonestring时区一, 可能不存在
timeZoneCodestring时区码
administrativeAreaCodestring中国行政区划代码
internationalPhoneCodestring国际电话代码
countryTwoDigitCodestring国家二位代码
worldContinentCodestring世界大洲代码

  返回结果参考:

  1.   {

  2.   "success": true,

  3.   "body": {

  4.   "country": "", // 国家

  5.   "city": "", // 省会或直辖市(国内)

  6.   "region": "", // 地区或城市 (国内)

  7.   "place": "", // 学校或单位 (国内)

  8.   "operator": "", // 运营商字段(只有购买了带有运营商版本的数据库才会有)

  9.   "latitude": "", // 纬度 (每日版本提供)

  10.   "longitude": "", // 经度 (每日版本提供)

  11.   "timeZone": "", // 时区一, 可能不存在 (每日版本提供)

  12.   "timeZoneCode": "", // 时区码, 可能不存在 (每日版本提供)

  13.   "administrativeAreaCode": "", // 中国行政区划代码 (每日版本提供)

  14.   "internationalPhoneCode": "", // 国际电话代码 (每日版本提供)

  15.   "countryTwoDigitCode": "", // 国家二位代码 (每日版本提供)

  16.   "worldContinentCode": "" // 世界大洲代码 (每日版本提供)

  17.   }

  18.   }
复制代码


  ERROR结果参考

  1.   {

  2.   "success": false,

  3.   "erros": "retun messages..."

  4.   }
复制代码


  查询状态结果参考

  1.   {

  2.   "success": true,

  3.   "body": {

  4.   "limit": false, // 是否已受访问限制

  5.   "hour": 99680, // 一个小时内剩余次数

  6.   "day": 999680, // 24小时内剩余次数

  7.   }

  8.   }
复制代码


  尾巴

  难得为开源社区贡献一份力量,希望有同样需求的同学们可以不用再去写复杂的底层逻辑,应该更多的把时间估计业务流程上。

  同样希望这个脚本能提供给ipip.net官方推荐脚本。

原文作者:不跑马拉松的摄影师不是好城续猿 来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部