文档章节

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

-九天-
 -九天-
发布于 2017/08/17 15:44
字数 757
阅读 30
收藏 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
博文 73
码字总数 76531
作品 0
朝阳
程序员
私信 提问
腾讯御安全深度解析暗云Ⅲ

腾讯御安全深度解析暗云Ⅲ 【关键词:腾讯御安全,APK漏洞扫描,APP保护,Android防破解】 前面对暗云的分析报告中,腾讯电脑管家安全团队和腾讯御安全基本摸清暗云Ⅲ的感染方式和传播方式,也定...

御安全123
03/06
0
0
Cloud Foundry新版router源码分析

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

长平狐
2012/08/24
451
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应用

一、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

没有更多内容

加载失败,请刷新页面

加载更多

hive load insert

本文主要是翻译Hive官网关于Load的解释,原文来源于:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Loadingfilesintotables 介绍 Hive Load语句......

hblt-j
11分钟前
0
1
spring cloud中微服务之间的调用以及eureka的自我保护机制

我自己搭建了一个客户端微服务: 所以现在有两个微服务,我们所实现的就是微服务1和微服务2之间的调用 注册中心就不用多说了,具体看一下两个微服务 在project-solr中的constroller中: @Res...

架构师springboot
14分钟前
0
0
从源码角度理解Java设计模式——装饰者模式

一、饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活。 适用场景:动态的给一个对象添加或者撤销功能。 优点:可以不改变原有对象的情况下动态扩展功...

我叫刘半仙
19分钟前
0
0
Java中前台接收后台List数据并循环打印

在Java后端获取到了数据,然后我们需要传到前端页面展现出来。 方法有两种: 方法一: 后端: request.setAttribute("list",list); 前端: <%ArrayList list = (ArrayList) request.get...

小_橙_子
28分钟前
1
0
Java:字节流和字符流(输入流和输出流)

什么是流 如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互...

编程SHA
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部