文档章节

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

-九天-
 -九天-
发布于 2017/08/17 15:44
字数 757
阅读 13
收藏 0
点赞 0
评论 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


© 著作权归作者所有

共有 人打赏支持
-九天-
粉丝 6
博文 66
码字总数 65054
作品 0
南京
程序员
Web性能优化方案

第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢。是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上。 ...

xiaoxin ⋅ 2014/07/18 ⋅ 2

web编程隐藏的工作

web编程范围很广,包括后台服务端编程,比如使用jsp,php或asp编写动态网页,主要功能: 读取数据库获得数据集并按一定形式渲染成可见性页面 保存用户状态的功能(php的session) 通过服务端语...

chenwenli ⋅ 2012/06/25 ⋅ 11

Cloud Foundry新版router源码分析

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

长平狐 ⋅ 2012/08/24 ⋅ 0

关于浏览器模式和文本模式的困惑

什么是浏览器模式和文本模式? 经常使用IE开发者工具的同学,肯定见过浏览器模式和文本模式,对于这两个名词,综合相关文档解释如下: 浏览器模式(Browser Mode),用于切换IE针对该网页的默...

lg2045 ⋅ 2013/07/01 ⋅ 0

OpenResty(nginx+lua) 开发入门

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

English0523 ⋅ 2017/11/13 ⋅ 0

Node后端数据渲染

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

博文视点 ⋅ 2017/05/08 ⋅ 0

使用Nginx+Lua(OpenResty)开发高性能Web应用

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

DB_Terrill ⋅ 2016/10/26 ⋅ 0

用Nginx+Lua(OpenResty)开发高性能Web应用

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

长征2号 ⋅ 2017/08/30 ⋅ 0

xss攻击的初步了解

什么是XSS攻击 XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意HTML代码和客户端脚本,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而...

凡尘里的一根葱 ⋅ 2015/12/02 ⋅ 0

使用Nginx+Lua(OpenResty)开发高性能Web应用

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

fdhay ⋅ 2016/08/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

AppDelegate 设置Root相关

self.window = UIWindow.init(frame: UIScreen.main.bounds) self.window?.backgroundColor = UIColor.white self.window?.makeKeyAndVisible() self.window?.rootViewController = RootTabB......

west_zll ⋅ 17分钟前 ⋅ 0

Java并发系列5--倒计时器CountDownLatch

今天讲一个倒计时器工具,叫CountDownLatch。需要这个工具的场景大概有:当所有的小任务都完成之后,再启动大任务。 先看代码: public class CountDownLatchDemo {static final CountDow...

大大枣 ⋅ 18分钟前 ⋅ 0

SpreadJS使用进阶指南 - 使用 NPM 管理你的项目

前言 SpreadJS作为一款性能出众的纯前端电子表格控件,自2015年发布以来,已经被广泛应用于各领域“在线Excel”数据管理项目中。NPM,作为管理Node.js库最有力的手段,解决了很多NodeJS代码部...

葡萄城控件技术团队 ⋅ 19分钟前 ⋅ 0

Mac下IntelliJ IDEA快捷键大全

https://blog.csdn.net/lisongjia123/article/details/54949364

细节探索者 ⋅ 22分钟前 ⋅ 0

建造者模式

1、工厂模式中创建的对象大都是简单的对象 复杂的产品类并且拥有不同的属性特点的管理就需要用到建造者模式 2、建造者模式: 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以...

职业搬砖20年 ⋅ 23分钟前 ⋅ 0

Mysql数据库开发 怎么优化SQL语句?

 1) 现场抓出慢查询语句 show full processlist;   2) 配置参数:   slow_query_log_file = ON 慢查询开启开关   long_query_time =2 记录大于2秒的sql语句   log_queries_not_usi...

老男孩Linux培训 ⋅ 24分钟前 ⋅ 0

Laravel 安装执行php artisan migrate 出现字段过长错误

最近在自己研究Laravel Laravel版本:5.6 PHP版本:7.1.9 Mysql版本:5.7.19 Apache版本:2.4.27 系统版本:windows10 首先要保证电脑安装了composer,和node.js 执行命令 composer global ...

Marhal ⋅ 29分钟前 ⋅ 0

ELK6.0日志从收集到处理完整版教程(二)

ELK简介 Elasticsearch 开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。也可以认为ElasticSearch是一...

bz_z ⋅ 32分钟前 ⋅ 0

Spark项目之电商用户行为分析大数据平台之(七)数据调研--基本数据结构介绍

目录 一、user_visit_action(Hive表) 1.1 表的结构 1.2 表的说明 二、user_info(Hive表) 2.1 表的结构 2.2 表的说明 三、task(MySQL表) 3.1 表的结构 3.2 表的说明 四、工作流程...

xiaomin0322 ⋅ 37分钟前 ⋅ 0

评分卡模型剖析之一(woe、IV、ROC、信息熵)

信用评分卡模型在国外是一种成熟的预测方法,尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用,其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二...

火力全開 ⋅ 37分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部