文档章节

Lua脚本解析web端发送的数据与浏览器的useragent

-九天-
 -九天-
发布于 2017/08/17 15:44
字数 757
阅读 16
收藏 0
local cjson = require("cjson")
local cjson_safe = require("cjson.safe")
local logger = require("logger")
local uuid4= require("uuid4")
local args   = {}
local request_method = ngx.var.request_method
function string.split(str, delimiter)
	if str==nil or str=='' or delimiter==nil then
		return nil
	end
    local result = {}
    for match in (str..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match)
    end
    return result
end


function string.trim (s) return (string.gsub(s, "^%s*(.-)%s*$", "%1")) end

function getUAField(t)
	local separator=';'
	local tab={}

	local android=string.find(t,"Android")
        local iphone=string.find(t,"Mac")
	local windows=string.find(t,"Windows")

	--android手机
	if android  then
		tab["platform"]="android"
    		-- tab["number"]=android
    		tab["ismobiledevice"]="true"
		local startIndex =string.find(t,"Build")
		if startIndex then
			local res=string.sub(t,0,startIndex-1)
			local rtable=string.split(res,separator)
			local devicename=string.trim(rtable[#rtable])
			local name=string.find(t,"XiaoMi")
			if name then
				local name1 = string.sub(t,name,name+6)
				tab["number"]=name
				if devicename~=nil then
					tab["devicename"]=name1 .. "/" .. devicename
				end
			else
				if devicename~=nil then
					tab["devicename"]=devicename
				end
			end
		end

		local osvTable=string.split(string.sub(t,android) ,separator)
		if osvTable then
			local osvTab=string.split(osvTable[1] ,' ')
			tab["os_version"]=string.trim(osvTab[#osvTab])
		end
	end

	--iphone手机
	if iphone then
		local ipho = string.find(t,"iPhone")
		local mac = string.find(t,"Macintosh")
		if ipho then
			tab["platform"]="iOS"
			tab["devicename"]="iphone"
			tab["number"]=ipho	
			tab["ismobiledevice"]="true"
 			local vs=string.find(t,"CPU")	
			if vs then
			    local osvTable=string.sub(t,vs)
			    local osvTable1 = string.split(osvTable,' ')
		            local osversion = string.trim(osvTable1[4])
			    tab["os_version"]=osversion
		        end	
		end
		--mac电脑
		if mac then
			tab["platform"]="Mac"
			tab["number"]=mac
			tab["devicename"]="PC"
			tab["ismobiledevice"]="flase"
			local osvers = string.sub(t,mac)
			local osversi= string.split(osvers,separator)
			if osversi then
				local osvTab = string.split(osversi[2],' ')
				table["os_version"]=string.trim(osvTab[5])
			end
		end
	end
 	--windows电脑
    if windows  then
		tab["platform"]="Windows"
		tab["ismobiledevice"]="flase"
		local osvTable=string.split(string.sub(t,windows) ,separator)
		if osvTable then
			local osvTab=string.split(osvTable[1] ,' ')
			tab["os_version"]=string.trim(osvTab[#osvTab])
			tab["devicename"]="PC"
		end
	end

	if  next(tab)  == nil then
		tab["platform"]=""
		tab["devicename"]=""
		tab["os_version"]=""
		tab["number"]=""
		tab["ismobiledevice"]=""
	end

	return tab

end

--获取参数的值
if "GET" == request_method then
    args = ngx.req.get_uri_args()
elseif "POST" == request_method then
    ngx.req.read_body()
    args = ngx.req.get_post_args()
end

function getTimeStamp(t)
    return os.date("%Y-%m-%d %H:%M:%S",t)
end

if next(args) ~= nil then
	response = '{"flag":"-1", "msg":"content error"}'
	local UATable,err=getUAField(ngx.var.http_user_agent)



	--cd
	cd_arr = {}
	cd_arr["flag"] = "-1"
	cd_arr["havebt"] = "true"
	cd_arr["havegravity"] = "true"
	cd_arr["havewifi"] = "true"
	cd_arr["havegps"] = "true"
	cd_arr["devicename"]=UATable["devicename"]
	cd_arr["os_version"]=UATable["os_version"]
	cd_arr["platform"]=UATable["platform"]
    cd_arr["number"]=UATable["number"]
    cd_arr["ismobiledevice"]=UATable["ismobiledevice"]
	cd_arr["version"]="1.0.0"
	cd_arr["isjailbreak"]="flase"
	cd_arr["modulename"]=""
	cd_arr["phonenumber"]=""
	cd_arr["network"]=""
	cd_arr["latitude"]=""
	cd_arr["imsi"]=""
	cd_arr["lac"]=""
	cd_arr["wifimac"]=""
	cd_arr["longitude"]=""
	cd_arr["mccmnc "]=""
	cd_arr["cellid"]=""

	--event
	event_arr={}
	event_arr["version"]="1.0.0"
	event_arr["event_identifier"] = "-1"

	--usinglog
	usinglog_arr={}
	usinglog_arr["devicename"]=UATable["devicename"]
	usinglog_arr["version"]="1.0.0"
	usinglog_arr["duration"] = "-1"


	for key, val in pairs(args) do

		if key == "appkey" then
			event_arr["appkey"]=val
			usinglog_arr["appkey"]=val
			cd_arr["appkey"]=val
		elseif key == "acc" then
			event_arr["acc"]=val
		elseif key == "activity" then
			event_arr["activity"]=val
			usinglog_arr["activity"]=val
		elseif key == "session_id" then
			event_arr["session_id"]=val
			usinglog_arr["session_id"]=val
		elseif key == "label" then
			event_arr["label"]=val
		elseif key == "deviceid" then
			event_arr["deviceid"]=val
			usinglog_arr["deviceid"]=val
			cd_arr["deviceid"]=val
		elseif key == "time" then
			event_arr["time"]=val
			cd_arr["time"]=val
		elseif key == "event_identifier" then
			event_arr["event_identifier"]=val
			cd_arr["event_identifier"]=val
		elseif key == "start_millis" then
			usinglog_arr["start_millis"]=val
		elseif key == "duration" then
			usinglog_arr["duration"]=val
		elseif key == "end_millis" then
			usinglog_arr["end_millis"]=val
		elseif key == "lang" then
			cd_arr["language"]=val
		elseif key=="flag" then
			cd_arr["flag"]=val
		elseif key=="hw" then
			cd_arr["resolution"]=val
		end

		response = '{"flag":"1", "msg":"OK"}'
	end


	if event_arr["event_identifier"]  ~= "-1" then
		if event_arr["time"] ~= nil then
			event_arr["time"] = getTimeStamp(event_arr["time"]/1000)
		end
		event = {}
		event["data"] = event_arr
		log_line, err = cjson_safe.encode(event)
		log_file = ngx.var.log_file_event .. "." .. os.date(ngx.var.date_fmt, ngx.time())
		logger.info(log_file, log_line)
	elseif cd_arr["flag"] ~= "-1" then
		if cd_arr["time"] ~= nil then
			cd_arr["time"] = getTimeStamp(cd_arr["time"]/1000)
		end
		cd = {}
		cd["data"] = cd_arr
		log_line, err = cjson_safe.encode(cd)
		log_file = ngx.var.log_file_cd .. "." .. os.date(ngx.var.date_fmt, ngx.time())
		logger.info(log_file, log_line)
	elseif usinglog_arr["duration"]  ~= "-1" then
		if usinglog_arr["start_millis"] ~=nil and usinglog_arr["end_millis"] ~=nil then
			usinglog_arr["end_millis"]=getTimeStamp(usinglog_arr["end_millis"]/1000)
			usinglog_arr["start_millis"]=getTimeStamp(usinglog_arr["start_millis"]/1000)
		end
		usinglog = {}
		usinglog["data"] = usinglog_arr
		log_line, err = cjson_safe.encode(usinglog)
		log_file = ngx.var.log_file_usinglog .. "." .. os.date(ngx.var.date_fmt, ngx.time())
		logger.info(log_file, log_line)

		
	else
		response = '{"flag":"-1", "msg":"' .. err .. '"}'
	end

	ngx.say(response)
else
  ngx.say('{"flag":"-1", "msg":"No post data found"}')

end


© 著作权归作者所有

共有 人打赏支持
-九天-
粉丝 7
博文 68
码字总数 66551
作品 0
南京
程序员
使用Nginx+Lua(OpenResty)开发高性能Web应用

一、ngx_lua简介 1 、Nginx 优点 Nginx设计为一个主进程多个工作进程的工作模式,每个进程是单线程来处理多个连接,而且每个工作进程采用了非阻塞I/O来处理多个连接,从而减少了线程上下文切...

DB_Terrill
2016/10/26
129
0
Node后端数据渲染

引言:对于前端开发者来说,在大型Web应用开发中,很多时候并不需要完全重新设计整个应用后台的架构,更多的情况下需要结合Node的能力帮助我们解决前后端分离开发模式下无法解决的问题。本文...

博文视点
2017/05/08
0
0
Cloud Foundry新版router源码分析

调整格式太费力了,这里直接粘帖过来了,原文我写在自己的博客上了:http://lory-yang.com/2012/08/06/cloudfoundryrouter/。 Cloud Foundry在几个月前改进了它的router,我们可以在新版clo...

长平狐
2012/08/24
408
0
OpenResty(nginx+lua) 开发入门

OpenResty 官网:http://openresty.org/ OpenResty® - 中文官方站 http://openresty.org/cn/ OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台。最重要的一点是它将lua/l...

English0523
2017/11/13
0
0
用Nginx+Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。Nginx的高性能是大家公认的,而Nginx开...

长征2号
2017/08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ在CentOS环境安装

1.废话不多说准备一台虚拟机,系统为centos,我这里使用的系统版本如下图所示:

凌晨一点
53分钟前
0
0
线程池相关

在java.util.concurrent包下,提供了一系列与线程池相关的类。 使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度。当任务到达时,任务...

edwardGe
55分钟前
0
0
学习大数据这三个关键技术是一定要掌握!

大数据时代全面来临,大数据、人工智能等技术引领科技创新潮流,获得国家政策大力支持,前景广阔。学习大数据技术的人自然是络绎不绝, 学习大数据虽然是一个趋势,但也要注意大数据培训课程...

董黎明
今天
0
0
jetbrains 上传代码到github

设置中找github 获取token 验证是否成功 测试git 生成key,一路回车即可 ssh-keygen -t rsa -C “youremail@example.com” 打开pub复制key,需要再次输入一次密码 验证是否成功,输入yes即可...

阿豪boy
今天
0
0
分布式服务框架(拾遗)

前言 现在的大部分工程都已经是基于分布式架构来处理。所以这里对分布式框架做一个简单的总结 常用的RPC框架 RPC框架原理 RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同...

kukudeku
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部