package com.taobao.loganalyzer.input.tanxpv.parser;
import java.util.ArrayList;
import java.util.List;
import com.taobao.loganalyzer.input.tanxpv.common.LogField;
import com.taobao.loganalyzer.input.tanxpv.common.LogRecord;
/**
* Tanx PV日志内容获取的封装
*
* @see <a
* href="http://sps.corp.taobao.com/ad/ADExchange/DocLib/Tan(X)%E7%B3%BB%E7%BB%9F%E6%97%A5%E5%BF%97%E8%AE%BE%E8%AE%A1.pdf">点击日志格式</a>
* @author kangtian
* <br> ChangeLog at 20110509 by kangtian</br>
* <li> 1.日志版本变更为1.1 </li>
* <li> 2.section8 UserSection添加新的字段</li>
* <br> ChangeLog at 20111117 by kangtian</br>
* <li> 1. 日志版本变更为1.2 </li>
* <li> 2. 5.6.5字段内容修改为DSP结算价格,5.6.8修改为结算价格
* <br> ChangeLog at 20121023 by yuanhang.ghj</br>
* <li> 1. 日志版本变更为1.3 </li>
* <li> 2. 5_7_23字段为过滤原因,5_7_24字段为过滤标记
* <br> ChangeLog at 20130729 by yuanhang.ghj</br>
* <li> 1. 日志版本变更为1.4 </li>
* <li> 2. 增加5_4_10字段为广告位投放尺寸 </li>
* <br> ChangeLog at 20131105 by yuanhang.ghj</br>
* <li>1.日志版本升级为2.0. 在原有的TanxPV日志中新增无线专有section.5_12 </li>
* <li>2.采用 ”广告位类型”区分pc流量和无线流量 </li>
* <li>广告位类型在http://sps.corp.taobao.com/ad/LOG/Lists/List3/TanxPV.aspx中的5_4_9字段。 </li>
* <li>广告位类型值的含义如下: </li>
* <li> 值为空或者为0,标示是来自pc流量 </li>
* <li> 值为1,标示是来自无线流量 </li>
* <br> ChangeLog at 20131217 by yuanhang.ghj</br>
* <li>1.日志版本升级为2.1. 启用5_6_16和 5_6_17字段,定向属性和定向类型 </li>
*/
public class TanxPVLog
{
private LogRecord lr = null;
TanxPVLog(LogRecord lr)
{
this.lr = lr;
}
private String getFieldContent(String name)
{
if (lr != null)
{
LogField lf = lr.getField(name);
return lf == null ? "" : (String) lf.getContent();
}
return "";
};
private List getFieldContentList(String name) {
if (lr != null) {
LogField lf = lr.getField(name);
return lf==null?null:(List)lf.getContent();
}
return null;
};
/**
*1.1 版本信息 版本信息初始为1.0
*
* @return 1.1 版本信息 版本信息初始为1.0
*/
public String getVersion()
{
return getFieldContent("Version");
}
/**
*2.1 时间戳
*
* @return 2.1 时间戳
*/
public String getTimestamp()
{
return getFieldContent("Timestamp");
}
/**
*2.2 PID(publisherid/networkid+siteid+adzoneid)样式: mm_nid_sid_adzid
*
* @return 2.2 PID(publisherid/networkid+siteid+adzoneid)样式:
* mm_nid_sid_adzid
*/
public String getPid()
{
return getFieldContent("Pid");
}
/**
*2.3 处理路径
*
* @return 2.3 处理路径
*/
public String getProcessPath()
{
return getFieldContent("ProcessPath");
}
/**
*2.4 浏览用户IP
*
* @return 2.4 浏览用户IP
*/
public String getUserIP()
{
return getFieldContent("UserIP");
}
/**
*2.5 Acookie
*
* @return 2.5 Acookie
*/
public String getCookie()
{
return getFieldContent("Cookie");
}
/**
*2.6 SessionID
*
* @return 2.6 SessionID
*/
public String getSessionID()
{
return getFieldContent("SessionID");
}
/**
*2.7 CG(不记录)
*
* @return 2.7 CG(不记录)
*/
public String getCg()
{
return getFieldContent("Cg");
}
/**
*2.8 展现类型(不记录)
*
* @return 2.8 展现类型(不记录)
*/
public String getViewType()
{
return getFieldContent("ViewType");
}
/**
*2.9 展现子类型(不记录)
*
* @return 2.9 展现子类型(不记录)
*/
public String getViewSubCategory()
{
return getFieldContent("ViewSubCategory");
}
/**
*2.10 Pub接口代码类型(不记录)
*
* @return 2.10 Pub接口代码类型(不记录)
*/
public String getPubCodeType()
{
return getFieldContent("PubCodeType");
}
/**
*2.11 ABTag(不记录)
*
* @return 2.11 ABTag(不记录)
*/
public String getAbTag()
{
return getFieldContent("AbTag");
}
/**
*2.12 是否后续请求(不记录)
*
* @return 2.12 是否后续请求(不记录)
*/
public String getFollowRequest()
{
return getFieldContent("FollowRequest");
}
/**
*2.13 广告展示的url
*
* @return 2.13 广告展示的url
*/
public String getFromURL()
{
return getFieldContent("FromURL");
}
/**
*2.14 topframe 的referrer(不记录)
*
* @return 2.14 topframe 的referrer(不记录)
*/
public String getTopFrameRefer()
{
return getFieldContent("TopFrameRefer");
}
/**
*2.15 当前window的referrer(不记录)
*
* @return 2.15 当前window的referrer(不记录)
*/
public String getWindowRefer()
{
return getFieldContent("WindowRefer");
}
/**
*2.16 浏览器UserAgent标识
*
* @return 2.16 浏览器UserAgent标识
*/
public String getUserAgent()
{
return getFieldContent("UserAgent");
}
/**
*2.17 refPID(不记录)
*
* @return 2.17 refPID(不记录)
*/
public String getRefPid()
{
return getFieldContent("RefPid");
}
/**
*3.1 网站分类(待定义)
*
* @return 3.1 网站分类(待定义)
*/
public String getSiteCategory()
{
return getFieldContent("SiteCategory");
}
/**
*3.2 网站分级(不记录)
*
* @return 3.2 网站分级(不记录)
*/
public String getSiteLevel()
{
return getFieldContent("SiteLevel");
}
/**
*4.1 广告位类目(不记录)
*
* @return 4.1 广告位类目(不记录)
*/
public String getAdzoneCategory()
{
return getFieldContent("AdzoneCategory");
}
/**
*4.2 广告位位置(不记录)
*
* @return 4.2 广告位位置(不记录)
*/
public String getAdzonePosition()
{
return getFieldContent("AdzonePosition");
}
/**
*4.3 广告位sizecode(待定义)
*
* @return 4.3 广告位sizecode(待定义)
*/
public String getAdzoneSize()
{
return getFieldContent("AdzoneSize");
}
/**
*4.4 广告位大小
*
* @return 4.4 广告位大小
*/
public String getAdzoneArea()
{
return getFieldContent("AdzoneArea");
}
/**
*4.5 是否首屏(不记录)
*
* @return 4.5 是否首屏(不记录)
*/
public String getIsFirstPage()
{
return getFieldContent("IsFirstPage");
}
/**
*4.6 广告位展现方式
*
* @return 4.6 广告位展现方式
*/
public String getViewMode()
{
return getFieldContent("ViewMode");
}
/**
*4.7 广告位最低限价(最低竞价额)
*
* @return 4.7 广告位最低限价(最低竞价额)
*/
public String getLimitPrice()
{
return getFieldContent("LimitPrice");
}
/**
*4.8 广告位属性(不记录)
*
* @return 4.8 广告位属性(不记录)
*/
public String getAdzoneAttribute()
{
return getFieldContent("AdzoneAttribute");
}
/**
*4.9 广告位类型 区分pc流量和无线流量.<li>值为空或者为0,标示是来自pc流量</li>.<li>值为1,标示是来自无线流量</li>
*
* @return 4.9 广告位类型
*/
public String getAdzoneType()
{
return getFieldContent("AdzoneType");
}
/**
*4.10 广告位投放尺寸
*
* @return 4.10 广告位类型
*/
public String getAdzonePutOnSize()
{
return getFieldContent("AdzonePutOnSize");
}
/**
*6.1 ServiceID: transid_adid_adbid_0 (广告ID) 样式: transid_adid_adbid_0 <br>
* 请注意: 我们不强调这四个ID的长度,希望大家在使用这个ID的时候按照”_”进行分割,而不是用长度来做硬编码。
* Id结尾的_0 是为了兼容现有KGB系统而设立的,目前Tanx系统中可以置为0,为了有需求时可以直接启用
*
* @return 6.1 ServiceID: transid_adid_adbid_0 (广告ID) 样式:
*/
public String getServiceID()
{
return getFieldContent("ServiceID");
}
/**
*6.2 广告客户ID(广告主ID) 直投广告主会记录广告主的ID,Exchange中为空
*
* @return 6.2 广告客户ID(广告主ID) 直投广告主会记录广告主的ID,Exchange中为空
*/
public String getCustomerID()
{
return getFieldContent("CustomerID");
}
/**
*6.3 产品类型(待定义)
*
* @return 6.3 产品类型(待定义)
*/
public String getProductType()
{
return getFieldContent("ProductType");
}
/**
*6.4 产品子类型(待定义)
*
* @return 6.4 产品子类型(待定义)
*/
public String getSubProductType()
{
return getFieldContent("SubProductType");
}
/**
*6.8 广告结算价格
* <br> 注:1.2及之后 广告结算价格实际上取的5.6.8的内容,5.6.5已经修改为Dsp结算价格
* @return 6.8 广告结算价格
*/
public String getCostPrice()
{
return getFieldContent("CostPrice");
}
/**
*6.5 版本1.2之后5.6.5已经修改为Dsp结算价格
* <br> 注:1.2及之后 广告结算价格实际上取的5.6.8的内容,5.6.5已经修改为Dsp结算价格
* @return 6.5 广告结算价格
*/
public String getDspCostPrice()
{
return getFieldContent("DspCostPrice");
}
/**
*6.6 客户竞价过程 此字段记录Exchange广告的竞价过程,由于一次pv通过exchange竞价中会有多条广告参与,
* 所以需要将不同network提供的广告竞价过程均记录下来。关心此字段的同学,请自行按相应的记录格式处理。
* <br>竞价id^CNetworkID^Dprice,ret[;price,ret][^C NetworkID^Dprice,ret[;price,ret]]……
* <br>ret的格式参考《Tan(X) Exchange 实时竞价API.pdf》的返回结果
* <br>例如: 某次竞价请求后,共有两个network参与竞价,一共3条结果,记录为:12345^C23456^D2.5,0;1.8;1^C45678^D1.9,2
* @return 6.6 客户竞价过程
*/
public String getBidProcess()
{
return getFieldContent("BidProcess");
}
/**
*6.7 流量类型(不记录)
*
* @return 6.7 流量类型(不记录)
*/
public String getFlowType()
{
return getFieldContent("FlowType");
}
/**
*6.8 页面内位置(不记录) --修改为广告结算价格
* <br>版本1.2之后5.6.8记录的为广告结算价格,请用getCostPrice()
* @return 6.8 页面内位置(不记录)
*/
@Deprecated
public String getAbsolutePosition()
{
return getFieldContent("AbsolutePosition");
}
/**
*6.9 匹配模式(不记录)
*
* @return 6.9 匹配模式(不记录)
*/
public String getMatchType()
{
return getFieldContent("MatchType");
}
/**
*6.10 匹配子模式(不记录)
*
* @return 6.10 匹配子模式(不记录)
*/
public String getSubMatchMode()
{
return getFieldContent("SubMatchMode");
}
/**
*6.11 广告类目(待定义)
*
* @return 6.11 广告类目(待定义)
*/
public String getAdCategory()
{
return getFieldContent("AdCategory");
}
/**
*6.12 广告类目confidence(不记录)
*
* @return 6.12 广告类目confidence(不记录)
*/
public String getAdCateConfidence()
{
return getFieldContent("AdCateConfidence");
}
/**
*6.13 广告来源
* 记录竞价成功的广告的所属NetworkID,Exchange中,此ID来源于竞价API中的Network反馈直投广告中此字段暂不记录,为空
*
* @return 6.13 广告来源
*/
public String getAdSource()
{
return getFieldContent("AdSource");
}
/**
*6.14 广告牌类型<br>
* 文字 1 <br>
* 图片 2 <br>
* Flash 3<br>
* 视频 4<br>
* 文字链 5<br>
* 图文 6<br>
* 自定义html/js代码广告 7
*
* @return 6.14 广告牌类型<br>
*/
public String getAdBoardType()
{
return getFieldContent("AdBoardType");
}
/**
*6.15 广告属性<br>
* Network提供的广告属性Guid, 在钻石展位接入时(如果钻石展位广告在此pv中竞价成功),则记录钻石展位广告的计划ID
*
* @return 6.15 广告属性<br>
*/
public String getAdAttribute()
{
return getFieldContent("AdAttribute");
}
/**
*6.16 定向类型
*
* @return 6.16 定向类型(不记录)
*/
public String getTargetType()
{
return getFieldContent("TargetType");
}
/**
*6.17 定向属性
*
* @return 6.17 定向属性.内部为整个串,不解析
*/
public String getTargetAttribute()
{
return getFieldContent("TargetAttribute");
}
/**
*7.1 随机数 直投广告中不记录(为空)
*
* @return 7.1 随机数 直投广告中不记录(为空)
*/
public String getRandomNum()
{
return getFieldContent("RandomNum");
}
/**
*7.2 随机数变量中对应的ascii 直投广告中不记录(为空)
*
* @return 7.2 随机数变量中对应的ascii 直投广告中不记录(为空)
*/
public String getAscii()
{
return getFieldContent("Ascii");
}
/**
*7.3 分辨率宽 直投广告中不记录(为空)
*
* @return 7.3 分辨率宽 直投广告中不记录(为空)
*/
public String getScreenWidth()
{
return getFieldContent("ScreenWidth");
}
/**
*7.4 分辨率高 直投广告中不记录(为空)
*
* @return 7.4 分辨率高 直投广告中不记录(为空)
*/
public String getScreenHeight()
{
return getFieldContent("ScreenHeight");
}
/**
*7.5 可用工作区宽度 直投广告中不记录(为空)
*
* @return 7.5 可用工作区宽度 直投广告中不记录(为空)
*/
public String getScreenAvailWidth()
{
return getFieldContent("ScreenAvailWidth");
}
/**
*7.6 可用工作区高度 直投广告中不记录(为空)
*
* @return 7.6 可用工作区高度 直投广告中不记录(为空)
*/
public String getScreenAvailHeight()
{
return getFieldContent("ScreenAvailHeight");
}
/**
*7.7 网页可见宽度 直投广告中不记录(为空)
*
* @return 7.7 网页可见宽度 直投广告中不记录(为空)
*/
public String getBodyClientWidth()
{
return getFieldContent("BodyClientWidth");
}
/**
*7.8 网页可见高度 直投广告中不记录(为空)
*
* @return 7.8 网页可见高度 直投广告中不记录(为空)
*/
public String getBodyClientHeight()
{
return getFieldContent("BodyClientHeight");
}
/**
*7.9 色深 直投广告中不记录(为空)
*
* @return 7.9 色深 直投广告中不记录(为空)
*/
public String getColorDepth()
{
return getFieldContent("ColorDepth");
}
/**
*7.10 时区 直投广告中不记录(为空)
*
* @return 7.10 时区 直投广告中不记录(为空)
*/
public String getTimeArea()
{
return getFieldContent("TimeArea");
}
/**
*7.11 History长度 直投广告中不记录(为空)
*
* @return 7.11 History长度 直投广告中不记录(为空)
*/
public String getHistoryLength()
{
return getFieldContent("HistoryLength");
}
/**
*7.12 是否开启java 直投广告中不记录(为空)
*
* @return 7.12 是否开启java 直投广告中不记录(为空)
*/
public String getIsOpenJava()
{
return getFieldContent("IsOpenJava");
}
/**
*7.13 插件个数 直投广告中不记录(为空)
*
* @return 7.13 插件个数 直投广告中不记录(为空)
*/
public String getPluginNum()
{
return getFieldContent("PluginNum");
}
/**
*7.14 Mime类型个数 直投广告中不记录(为空)
*
* @return 7.14 Mime类型个数 直投广告中不记录(为空)
*/
public String getMimeNum()
{
return getFieldContent("MimeNum");
}
/**
*7.15 Flash版本 直投广告中不记录(为空)
*
* @return 7.15 Flash版本 直投广告中不记录(为空)
*/
public String getFlashVersion()
{
return getFieldContent("FlashVersion");
}
/**
*7.16 HTTP_VIA
*
* @return 7.16 HTTP_VIA
*/
public String getHttpVia()
{
return getFieldContent("HttpVia");
}
/**
*7.17 HTTP_X_FORWARDED_FOR|HTTP_PROXY_CONNECTION
*
* @return 7.17 HTTP_X_FORWARDED_FOR|HTTP_PROXY_CONNECTION
*/
public String getHttpX()
{
return getFieldContent("HttpX");
}
/**
*7.18 HTTP_ACCEPT
*
* @return 7.18 HTTP_ACCEPT
*/
public String getHttpAccept()
{
return getFieldContent("HttpAccept");
}
/**
*7.19 HTTP_ACCEPT_CHARSET
*
* @return 7.19 HTTP_ACCEPT_CHARSET
*/
public String getHttpAccCharset()
{
return getFieldContent("HttpAccCharset");
}
/**
*7.20 HTTP_ACCEPT_LANGUAGE
*
* @return 7.20 HTTP_ACCEPT_LANGUAGE
*/
public String getHttpAccLanguage()
{
return getFieldContent("HttpAccLanguage");
}
/**
*7.21 HTTP_ACCEPT_ENCODING
*
* @return 7.21 HTTP_ACCEPT_ENCODING
*/
public String getHttpAccEncoding()
{
return getFieldContent("HttpAccEncoding");
}
/**
*7.22 HTTP_KEEP_ALIVE
*
* @return 7.22 HTTP_KEEP_ALIVE
*/
public String getHttpKeepAlive()
{
return getFieldContent("HttpKeepAlive");
}
/**
*7.23 FILTER_CODE
*
* @return 7.23 FILTER_CODE
*/
public String getFilterCode()
{
return getFieldContent("FilterCode");
}
/**
*7_24 FILTER_FLAG
*
* @return 7_24 FILTER_FLAG
*/
public String getFilterFlag()
{
return getFieldContent("FilterFlag");
}
/**
*8.1 最近行为信息
*
* @return 8.1 最近行为信息
*/
public String getUserActionInfo()
{
return getFieldContent("UserActionInfo");
}
/**
*8.2 人群分类信息
*
* @return 8.2 人群分类信息
*/
public java.util.List<CrowdInfo> getCrowdInfoList() {
return getCrowdInfoFieldContent("CrowdInfoList");
}
@SuppressWarnings("unchecked")
private List<CrowdInfo> getCrowdInfoFieldContent(String name) {
List<LogRecord> list = (List<LogRecord>)getFieldContentList(name);
List<CrowdInfo> crowds = null;
if (list != null) {
crowds = new ArrayList<CrowdInfo>();
for (LogRecord lr : list) {
crowds.add(new CrowdInfo(lr));
}
}
return crowds;
}
/**
*8.3 性别
*
* @return 8.3 性别
*/
public String getUserSex()
{
return getFieldContent("UserSex");
}
/**
*8.4 整体消费能力
*
* @return 8.4 整体消费能力
*/
public String getWholeConsumeAblity()
{
return getFieldContent("WholeConsumeAblity");
}
/**
*11.1 Session ID前4个bytes
*
* @return 11.1 Session ID前4个bytes
*/
public String getVerify()
{
return getFieldContent("Verify");
}
/**
*12.1 Session App包名
*
* @return 12.1 Session App包名
*/
public String getAppPackage()
{
return getFieldContent("12AppPackage");
}
/**
*12.2 Session 设备平台
*
* @return 12.1 Session App包名
*/
public String getDevicePlatform()
{
return getFieldContent("12DevicePlatform");
}
/**
*12.3 Session 操作系统
*
* @return 12.3 Session 操作系统
*/
public String getOS()
{
return getFieldContent("12OS");
}
/**
*12.4 Session 操作系统版本号
*
* @return 12.4 Session 操作系统版本号
*/
public String getOS_Version()
{
return getFieldContent("12OS_Version");
}
/**
*12.5 Session 制造厂商
*
* @return 12.5 Session 制造厂商
*/
public String getManufacturer()
{
return getFieldContent("12Manufacturer");
}
/**
*12.6 Session 设备型号
*
* @return 12.6 Session 设备型号
*/
public String getDeviceModel()
{
return getFieldContent("12DeviceModel");
}
/**
*12.7 Session 设备分辨率
*
* @return 12.7 Session 设备分辨率
*/
public String getDeviceScreen()
{
return getFieldContent("12DeviceScreen");
}
/**
*12.8 设备IMEI号
*
* @return 12.8 设备IMEI号
*/
public String getDeviceIMEI()
{
return getFieldContent("12DeviceIMEI");
}
/**
*12.9 Session 设备MAC号
*
* @return 12.9 Session 设备MAC号
*/
public String getDeviceMAC()
{
return getFieldContent("12DeviceMAC");
}
/**
*12.10 Session iOS设备的IDFA号
*
* @return 12.10 Session iOS设备的IDFA号
*/
public String getiOS_IDFA()
{
return getFieldContent("12iOS_IDFA");
}
/**
*12.11 网络连接类型
*
* @return 12.11 网络连接类型
*/
public String getDeviceNetwork()
{
return getFieldContent("12DeviceNetwork");
}
/**
*12.12 Session 经度
*
* @return 12.12 Session 经度
*/
public String getLongitude()
{
return getFieldContent("12Longitude");
}
/**
*12.13 Session 纬度
*
* @return 12.13 Session 纬度
*/
public String getLatitude()
{
return getFieldContent("12Latitude");
}
public List<String[]> getGoogleWeight() {
return getFieldContentList("googleweight");
}
public static class CrowdInfo {
private LogRecord lr = null;
private CrowdInfo(LogRecord lr) {
this.lr = lr;
}
private String getFieldContent(String name) {
if (lr != null) {
LogField lf = lr.getField(name);
return lf==null?"":(String)lf.getContent();
}
return "";
};
/**
* Section 8 字段 2 中的兴趣类目
* @return Section 8 字段 2 中的兴趣类目
*/
public String getCategory() {
return getFieldContent("Category");
}
/**
* Section 8 字段 2 中的分数
* @return Section 8 字段 2 中的分数
*/
public String getScore() {
return getFieldContent("Score");
}
/**
* Section 8 字段 2 中的消费能力
* @return Section 8 字段 2 中的消费能力
*/
public String getConsumeAbility() {
return getFieldContent("ConsumeAbility");
}
}
}