文档章节

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

-九天-
 -九天-
发布于 2017/08/17 15:44
字数 757
阅读 27
收藏 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


© 著作权归作者所有

共有 人打赏支持
-九天-
粉丝 8
博文 70
码字总数 71923
作品 0
南京
程序员
Cloud Foundry新版router源码分析

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

长平狐
2012/08/24
408
0
使用Nginx+Lua(OpenResty)开发高性能Web应用

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

DB_Terrill
2016/10/26
129
0
用Nginx+Lua(OpenResty)开发高性能Web应用

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

长征2号
2017/08/30
0
0
使用Nginx+Lua(OpenResty)开发高性能Web应用

使用Nginx+Lua(OpenResty)开发高性能Web应用 博客分类: 跟我学Nginx+Lua开发 架构 ngxluaopenresty 在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、...

fdhay
2016/08/31
45
0
使用Nginx+Lua(OpenResty)开发高性能Web应用

Nginx+Lua(OpenResty)开发高性能Web应用 使用Nginx+Lua(OpenResty)开发高性能Web应用 在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而...

oldgril
2017/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Java中生成比特币钱包地址

让我们通过学习比特币(Bitcoin)如何实施该技术的各个方面来工作,好吗?该技术包括以下几个方面: 比特币地址bitcoin address是用来发送和接收比特币的。 交易transaction是比特币从一个地...

geek12345
12分钟前
0
0
面试必备Linux基础知识

学习Linux之前,我们先来简单的认识一下操作系统。 一 从认识操作系统开始 1.1 操作系统简介 我通过以下四点介绍什么操作系统: 操作系统(Operation System,简称OS)是管理计算机硬件与软件...

小小明童鞋
12分钟前
2
0
SpringBoot基础教程3-1-3 Quartz定时任务单点持久化

1 概述 实际项目中,复杂的定时任务都会结合持久化,动态改变定时任务状态,本文将介绍基于Quartz的定时任务单点持久化方式,通过RESTful风格,演示定时任务的CRUD,最后使用Swagger测试。 ...

Mkeeper
29分钟前
3
0
Android入门—文件目录解析

AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录。我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息。但是对于这个文件,我...

haoyuehong
32分钟前
5
0
IDEA中Maven打包时如何跳过测试

方法1:直接使用IDEA提供的方式 Maven命令栏的工具栏有下图中的图标,上面就写着 Skip Tests 按下图标后,如下图,test就不可用了 直接使用package命令即可。 方法2:自己编辑maven命令 进入...

karma123
45分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部