花了点时间阅读了google的show_ads.js,替换了其中的一些函数 为可理解的函数名,也适当做了些注释,不知道对不对,时间仓促,错误难免,供大家分析,了解其中的原理。
// JScript source code
(
function()
{
function Var2Char(c) //将值转换为字符串形式 如 7 转换为'7'
{
return c!=null?'"'+c+'"':'""'
}
function AdjustEscape(c) //编码函数 这个是如果存在 encodeURIComponent 这个函数,那么就用这个调用来获得URL编码,因为
{ //encodeURIComponent 是支持UTF-8也就是unicode编码的
if(typeof encodeURIComponent=="function") //
{return encodeURIComponent(c)}
else
{return escape(c)}
}
function AppendADUrlParameter(c,a) //返回google_ad_url的参量对字符串形式,条件是值不为空
{
if(a)
{
window.google_ad_url+="&"+c+"="+a
}
}
function SafeAppendAdUrl(c,a) //组合一个值对的安全方法
{
if(a){AppendADUrlParameter(c,AdjustEscape(a))}
}
function SetColorParameterc,a,b) //设定颜色对象的值对
{
if(a&&typeof a=="object")
{a=a[b%a.length]}
AppendADUrlParameter("color_"+c,a)
}
function SetLocalEnvironment(c,a)
{//b 代表当前某个窗口的屏幕属性 e 代表是否支持javascript f代表时区
var b=c.screen,e=navigator.javaEnabled(),f=-a.getTimezoneOffset();
if(b)
{
AppendADUrlParameter("u_h",b.height); //设定参量
AppendADUrlParameter("u_w",b.width);
AppendADUrlParameter("u_ah",b.availHeight);
AppendADUrlParameter("u_aw",b.availWidth);
AppendADUrlParameter("u_cd",b.colorDepth)
}
AppendADUrlParameter("u_tz",f); //设定时区
AppendADUrlParameter("u_his",history.length); //历史列表长度?这个google需要干什么呢?
AppendADUrlParameter("u_java",e);
if(navigator.plugins)
{
AppendADUrlParameter("u_nplug",navigator.plugins.length) //设定plug
}
if(navigator.mimeTypes) //设定mime支持类型参数长度
{
AppendADUrlParameter("u_nmime",navigator.mimeTypes.length)
}
}
function SetPerfixca(c) //增加ca-前缀
{
c=c.toLowerCase();
if(c.substring(0,3)!="ca-")
{
c="ca-"+c
}
return c
}
//V 函数显示js来加载广告
function ViewGoogleAD(c,a,b,e) // c 代表广告特定窗口 a 为所在的主窗口 ?
{
b=b.substring(0,2000);
b=b.replace(/%/w?$/,"");
if(c.google_ad_output=="js"&&(c.google_ad_request_done||c.google_radlink_request_done))
{//输出方式js
a.write('<script language="JavaScript1.1" src='+Var2Char(b)+"><//script>")
}
else
if(c.google_ad_output=="html") //输出方式 html
{
if(c.name!="google_ads_frame") //如果不是这个名字就加载一个div中的frame
{
if(e!=null){a.write('<div id="'+e+'">')}
a.write('<iframe name="google_ads_frame" width='+Var2Char(c.google_ad_width)+" height="+Var2Char(c.google_ad_height)+" frameborder="+Var2Char(c.google_ad_frameborder)+" src="+Var2Char(b)+' marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no">');
a.write("</iframe>");
if(e!=null)
{
a.write("</div>")
}
}
}
else
if(c.google_ad_output=="textlink")
{//输出脚本来显示文字
a.write('<script language="JavaScript1.1" src='+Var2Char(b)+"><//script>")
}
}
function InitNull(c) //初始化函数,全部赋值null
{var a=null;
c.google_ad_frameborder=a; //广告的帧边框
c.google_ad_format=a; //广告格式
c.google_page_url=a; //广告页的url
c.google_language=a; //语言
c.google_gl=a; //?
c.google_country=a; //所在国家,因为这个也是问题,涉及到区域、还有宗教等麻烦问题
c.google_region=a; //范围
c.google_city=a; //所在城市
c.google_hints=a; //点击了吗
c.google_safe=a;
c.google_encoding=a;
c.google_ad_output=a;
c.google_max_num_ads=a;
c.google_ad_channel=a;
c.google_contents=a;
c.google_alternate_ad_url=a;
c.google_alternate_color=a;
c.google_color_bg=a;
c.google_color_text=a;
c.google_color_link=a;
c.google_color_url=a;
c.google_color_border=a;
c.google_color_line=a;
c.google_reuse_colors=a;
c.google_adtest=a;
c.google_kw_type=a;
c.google_kw=a;
c.google_num_radlinks=a;
c.google_max_radlink_len=a;
c.google_rl_filtering=a;
c.google_rl_mode=a;
c.google_rt=a;
c.google_rl_dest_url=a;
c.google_num_radlinks_per_unit=a;
c.google_ad_type=a;
c.google_image_size=a;
c.google_feedback=a;
c.google_skip=a;
c.google_page_location=a;
c.google_referrer_url=a;
c.google_ad_region=a;
c.google_ad_section=a;
c.google_bid=a;
c.google_cpa_choice=a;
c.google_cust_age=a;
c.google_cust_gender=a;
c.google_cust_interests=a;
c.google_cust_id=a;
c.google_cust_job=a;
c.google_cust_u_url=a;
c.google_cust_l=a;
c.google_cust_lh=a;
c.google_cust_ch=a;
c.google_ed=a;
c.google_targeting=a;
c.google_ad_host=a;
c.google_ad_slot=a;
c.google_ad_override=a;
c.google_ui_features=a
}
function SmartAnalyse(c)
{
var a=null,b=window,e=document,f=new Date,g=f.getTime(),h=b.google_ad_format; //h 是广告的尺寸
if(b.google_cpa_choice) //是CPA方式吗
{
b.google_ad_url="http://pagead2.googlesyndication.com/cpa/ads ?";
b.google_ad_url+="client="+escape(SetPerfixca(b.google_ad_client));
b.google_ad_region="_google_cpa_region_";
AppendADUrlParameter("cpa_choice",b.google_cpa_choice);
if(typeof e.characterSet!="undefined")
{
SafeAppendAdUrl("oe",e.characterSet) //i函数是组合值对
}
else
if(typeof e.charset!="undefined")
{
SafeAppendAdUrl("oe",e.charset)
}
}
else
{
b.google_ad_url="http://pagead2.googlesyndication.com/pagead/ads ?"; //返回AD
b.google_ad_url+="client="+escape(SetPerfixca(b.google_ad_client))
}
AppendADUrlParameter("host",b.google_ad_host); //加上host=的值对
var j=b.google_num_slots_by_client,
C=b.google_num_slots_by_channel,
l=b.google_prev_ad_formats_by_region;
if(b.google_ad_region==a&&b.google_ad_section!=a)
{
b.google_ad_region=b.google_ad_section
}
var k=b.google_ad_region==a?"":b.google_ad_region,w=false; //新增一个w?
if(h) //如果有尺寸要求,那么需要解析尺寸
{
w=h.indexOf("_0ads")>0
}
if(w)//如果尺寸存在 就进行解析获得尺寸的行为
{
if(b.google_num_0ad_slots) //如果存在广告位 那么增加
{
b.google_num_0ad_slots=b.google_num_0ad_slots+1
}
else
{
b.google_num_0ad_slots=1
}
if(b.google_num_0ad_slots>3) //不可以超过3个,返回吧
{
return false
}
}
else
if(!b.google_cpa_choice) //不是CPA付费方式的广告,那就是按照点击、显示次数来付费
{
if(b.google_num_ad_slots)
{
b.google_num_ad_slots=b.google_num_ad_slots+1 //多少个广告位都无所谓了
}
else
{
b.google_num_ad_slots=1
}
if(b.google_num_slots_to_rotate) //点击???
{
l[k]=a;
if(b.google_num_slot_to_show==a)
{
b.google_num_slot_to_show=g%b.google_num_slots_to_rotate+1 //广告轮换显示
}
if(b.google_num_slot_to_show!=b.google_num_ad_slots)
{
return false
}
}
else
if(b.google_num_ad_slots>3&&k=="")
{
return false
}
}
AppendADUrlParameter("dt",f.getTime()); //组合时间
AppendADUrlParameter("hl",b.google_language); //语言
if(b.google_country)
{
AppendADUrlParameter("gl",b.google_country) //国家代码
}
else
{
AppendADUrlParameter("gl",b.google_gl)
}
AppendADUrlParameter("gr",b.google_region);
SafeAppendAdUrl("gcs",b.google_city);
SafeAppendAdUrl("hints",b.google_hints);
AppendADUrlParameter("adsafe",b.google_safe);
AppendADUrlParameter("oe",b.google_encoding);
AppendADUrlParameter("lmt",b.google_last_modified_time); // 这个应该是通知google进行判断是否需要更新AD,因为网页更新了,所以网页内容可能改变了,通过document.lastModify参数获知
SafeAppendAdUrl("alternate_ad_url",b.google_alternate_ad_url);
AppendADUrlParameter("alt_color",b.google_alternate_color); //客户端设置界面的时候设置 google_alternate_color
AppendADUrlParameter("skip",b.google_skip);
AppendADUrlParameter("targeting",b.google_targeting);
//以上组合具体值
var p=b.google_ad_client; //获得google_ad_client = "pub-9258403919995769"; 这样的值
if(!j[p]) //j 是存放那些client的数组(slot)
{
j[p]=1;j.length+=1 //新增一个
}
else
{
j[p]+=1 //该client的值增加
}
if(l[k]) //当前格式
{
SafeAppendAdUrl("prev_fmts",l[k].toLowerCase());
if(j.length>1)
{
AppendADUrlParameter("slot",j[p]) //携带google_ad_client的slot数
}
}
if(h&&!b.google_ad_slot) //h是广告尺寸
{
SafeAppendAdUrl("format",h.toLowerCase()); //组合格式
if(l[k])
{
l[k]=l[k]+","+h //确定格式
}
else
{
l[k]=h //按照定义的格式显示了
}
}
AppendADUrlParameter("num_ads",b.google_max_num_ads);
AppendADUrlParameter("output",c!=a?c:b.google_ad_output);
AppendADUrlParameter("adtest",b.google_adtest);
if(b.google_ad_slot)
{
AppendADUrlParameter("slotname",b.google_ad_slot)
}
SafeAppendAdUrl("correlator",b.google_correlator);
if(b.google_ad_channel)
{
var x=b.google_ad_channel;
SafeAppendAdUrl("channel",x);
var y="",z=x.split("+");
for(var s=0;s<z.length;s++)
{
var t=z[s];
if(!C[t])
{
C[t]=1}else{y+=t+"+"}
}
SafeAppendAdUrl("pv_ch",y)
}
SafeAppendAdUrl("url",b.google_page_url);
SetColorParameter"bg",b.google_color_bg,g);
SetColorParameter"text",b.google_color_text,g);
SetColorParameter"link",b.google_color_link,g);
SetColorParameter"url",b.google_color_url,g);
SetColorParameter"border",b.google_color_border,g);
SetColorParameter"line",b.google_color_line,g);
if(b.google_reuse_colors)
AppendADUrlParameter("reuse_colors",1);
else
AppendADUrlParameter("reuse_colors",0);
AppendADUrlParameter("kw_type",b.google_kw_type);
SafeAppendAdUrl("kw",b.google_kw);
SafeAppendAdUrl("contents",b.google_contents);
AppendADUrlParameter("num_radlinks",b.google_num_radlinks);
AppendADUrlParameter("max_radlink_len",b.google_max_radlink_len);
AppendADUrlParameter("rl_filtering",b.google_rl_filtering);
AppendADUrlParameter("rl_mode",b.google_rl_mode);
AppendADUrlParameter("rt",b.google_rt);
SafeAppendAdUrl("rl_dest_url",b.google_rl_dest_url);
AppendADUrlParameter("num_radlinks_per_unit",b.google_num_radlinks_per_unit);
AppendADUrlParameter("ad_type",b.google_ad_type);
AppendADUrlParameter("image_size",b.google_image_size);
AppendADUrlParameter("region",b.google_ad_region);
AppendADUrlParameter("feedback_link",b.google_feedback);
SafeAppendAdUrl("ref",b.google_referrer_url);
SafeAppendAdUrl("loc",b.google_page_location);
AppendADUrlParameter("bid",b.google_bid);
AppendADUrlParameter("cust_age",b.google_cust_age);
AppendADUrlParameter("cust_gender",b.google_cust_gender);
AppendADUrlParameter("cust_interests",b.google_cust_interests);
AppendADUrlParameter("cust_id",b.google_cust_id);
AppendADUrlParameter("cust_job",b.google_cust_job);
AppendADUrlParameter("cust_u_url",b.google_cust_u_url);
AppendADUrlParameter("cust_l",b.google_cust_l);
AppendADUrlParameter("cust_lh",b.google_cust_lh);
AppendADUrlParameter("cust_ch",b.google_cust_ch);
AppendADUrlParameter("ed",b.google_ed);
SafeAppendAdUrl("ui",b.google_ui_features);
if(CompareLocation(b,e)&&e.body)
{
var A=e.body.scrollHeight,B=e.body.clientHeight;
if(B&&A)
{
SafeAppendAdUrl("cc",Math.round(B*100/A))
}
}
AppendADUrlParameter("google_ad_override",b.google_ad_override);
AppendADUrlParameter("flash",b.google_flash_version);
SetLocalEnvironment(b,f);
return true;
}
// H函数结束
function SmartViewGoogleAD()
{
var c=window,a=document,b=false;
if(IsHTMLFormat(c.google_ad_output,c.google_ad_client)&&!IsSupportDHTML())
{
b=true //广告输出跟客户站点要求的格式 是否匹配?
}
var e=b?"json_html":null;
if(!SmartAnalyse(e)) //分析出广告不成功 就退出
{
return
}
if(!b) //不匹配吗
{
ViewGoogleAD(c,a,c.google_ad_url,null) //根据当前window document和广告的ADURL来显示广告
}
else
{
ScriptViewAD() //需要再次通过JS来获取往广告服务器回调,此时服务器来回肯定需要时间
}
InitNull(c) //重新设置window的google相关值
}
function CallBackFunction(c,a,b) //调用G函数 后返回一个T
{
SmartViewGoogleAD();
return true
}
function CompareLocation(c,a)
{
return c.top.location==a.location //看看当前的window的最上location是否是文档的location一致
}
function CheckADArea(c,a) //检验广告区域是否合法
{
var b=a.documentElement; //返回文档的根元素
if(CompareLocation(c,a))return false; //如果当前文档的url同window的最顶层一致 就不用继续了
if(c.google_ad_width&&c.google_ad_height)
{
var e=1,f=1;
if(c.innerHeight)
{
e=c.innerWidth;f=c.innerHeight //继承父亲的 inner属性
}
else
if(b&&b.clientHeight)
{
e=b.clientWidth;f=b.clientHeight
}
else
if(a.body)
{
e=a.body.clientWidth;
f=a.body.clientHeight
}
if(f>2*c.google_ad_height||e>2*c.google_ad_width)
{
return false //长度不可超过预定义的高宽的2倍啊
}
}
return true
}
function ViewADMainFunction(c) //
{
var a=window,b=document,e=b.location,f=b.referrer,g=null,h=a.onerror;
a.onerror=c; //出错 去调用 CallBackFunction(),也就是SmartViewGoogleAD()的安全调用方法
if(a.google_ad_frameborder==g) //对于null值 设定为0
{
a.google_ad_frameborder=0
}
if(a.google_ad_output==g)
{
a.google_ad_output="html"
}
if(a.google_ad_format==g&&a.google_ad_output=="html")
{
a.google_ad_format=a.google_ad_width+"x"+a.google_ad_height //广告格式
}
if(a.google_page_url==g)
{
a.google_page_url=f; //reffer作为宿主页
if(!CheckADArea(a,b)) //广告区域不合法了 那可能是修改了代码 和设置 需要检验文档是否修改过 取 文档的lastModified属性
{
a.google_page_url=e;
a.google_last_modified_time=Date.parse(b.lastModified)/1000;
a.google_referrer_url=f
}
}
else
{
a.google_page_location=f;
if(!CheckADArea(a,b))
{a.google_page_location=e}
}
if(a.google_num_slots_by_channel==g)
{
a.google_num_slots_by_channel=[]
}
if(a.google_num_slots_by_client==g)
{
a.google_num_slots_by_client=[]
}
if(a.google_prev_ad_formats_by_region==g)
{
a.google_prev_ad_formats_by_region=[]
}
if(a.google_correlator==g)
{
a.google_correlator=(new Date).getTime()
}
if(a.google_adslot_loaded==g)
{a.google_adslot_loaded={}
}
if(a.google_adContentsBySlot==g)
{a.google_adContentsBySlot={}
}
if(a.google_flash_version==g)
{a.google_flash_version=I().toString()
}
a.onerror=h //还原错误处理过程
}
function IsIncludeChar(c) //判断是否包含某个字符串
{
if(c in q)
{
return q[c]
}
return q[c]=navigator.userAgent.toLowerCase().indexOf(c)!=-1
}
var q={};
function IsIEorOpers() //是否是msie 或者 opera浏览器
{
return IsIncludeChar("msie")&&!window.opera
}
function IsSafari()
{return IsIncludeChar("safari")} //是否是 safari 类浏览器
function GetUserAgentVer() //返回版本号
{
var c=navigator.userAgent,a=c.indexOf("MSIE ");
if(a==-1)
{return 0}
else
{
return parseFloat(c.substring(a+5,c.indexOf(";",a)))
}
}
function IsSupportDHTML() //用来判断当前浏览器是否不支持DHTML
{
if(IsIEorOpers())
{var c=GetUserAgentVer();
return c<=5
}
else if(IsIncludeChar("firefox"))
{
var a=navigator.userAgent.indexOf("Firefox")+8,b=parseInt(navigator.userAgent.charAt(a)),e=navigator.userAgent.slice(a);
return b<1
}
else if(IsSafari())
{
var a=navigator.userAgent.indexOf("Safari")+7,e=navigator.userAgent.slice(a),f=parseInt(e);
return f<412
}
else if(window.opera!=null)
{
var a=navigator.userAgent.indexOf("Opera")+6,e=navigator.userAgent.slice(a),b=parseInt(e);
return b<9
}
else if(!IsIEorOpers()&&!IsSafari()&&IsIncludeChar("mozilla"))
{
var a=navigator.userAgent.indexOf("Netscape")+9,e=navigator.userAgent.slice(a),b=parseInt(e);
return b<7
}
else
{return true}
}
function IsHTMLFormat(c,a)
{
if(c!="html") //如果输出格式不是html那么 返回false
{return false}
var b={};
b["ca-pub-8954402009499768"]=true; //当前数组赋值 ?
return b[a]!=null //实际上这个函数判断 a 是不是请求的 ca-pub-8954402009499768
}
function ScriptViewAD() //回调函数,表示当前广告需要调用js来实现
{var c=window;AppendADUrlParameter("impl","s");
AppendADUrlParameter("callback","_google_setAdContentsBySlotForSync");
document.write("<script src = '"+c.google_ad_url+"'><//script>") //再次调用js进行获取广告资源
}
window.google_createDivWithContent=function(c) //按照div方式来生成广告?
{var a=window,b="google_ads_div_"+c,e="<div id="+b+">",f=a.google_adContentsBySlot[c]; //此处存放了div的广告html代码
if(f==null)
{return}
e+=f._html_;
e+="/n</div>/n";
document.write(e)
};
window.google_createDOMIframe=function(c,a,b,e)
{
var f=document.getElementsByTagName("script"), //取得全部script的集合
g=f[f.length-1], //g为最后一个,实际上就是当前script
h=document.createElement("iframe"); //创建一个iframe
h.id="google_ads_iframe_"+c; //iframe name
h.width=a; //宽
h.height=b; //高
h.vspace=0; //边际都为0
h.hspace=0;
h.allowTransparency="true"; //包含 容器的属性
h.scrolling="no";
h.marginWidth=0;
h.marginHeight=0;
h.frameBorder=0;
h.style.border=0;
g.parentNode.appendChild(h); //获取当前script的夫元素然后加入创建的iframe
h.contentWindow.document.write(e); //输出正文内容
h.contentWindow.document.close() //关闭
};
window.google_createiframe=function(c,a,b,e,f) //按照动态脚本的方式创建一个iframe
{
var g="google_ads_div_"+c,h="google_ads_iframe_"+c,j="<div id="+g+">";
j+="<iframe id="+h+' width="'+e+'" height="'+f+'" vspace="0" hspace="0" allowtransparency="true" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" style="border:0px;" src="'+a.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(//"/g,""")+'"';
j+=' onload="'+b+'"';j+="></iframe></div>";
document.write(j)
};
var v="google_ads_iframe_".length; //名字的长度
function M(c) //获得一个元素的id,然后返回该元素ID去掉 google_ads_iframe_ 后的ID
{
var a=c.getAttribute("id"),
b=a.substr(v,a.length-v);
return b
}
window._google_syncAdSlotLoaded=function(c)
{var a=M(c); //??多余?
window.google_loadiframe(c) //?
};
window._google_setAdContentsBySlotForSync=function(c) //定义回调函数,回调函数是帧 同宿主页的交互途径
{
var a=window;
for(var b in c)
{
var e=c[b];
a.google_adContentsBySlot[b]=e;
if(e==null||e._empty_)
{}
else
if(e._expandable_)
{
a.google_createDivWithContent(b)
}
else
{
if(navigator.userAgent.indexOf("MSIE ")>0)
{
a.google_adslot_loaded[b]=false;
var f="window._google_syncAdSlotLoaded(this);";
a.google_createiframe(b,"about:blank",f,e._width_,e._height_)
}
else
{
a.google_createDOMIframe(b,e._width_,e._height_,e._html_)
}
}
}
};
function GetQueryStringNameValues(c) //输入一个网址,获得网址的查询字符串位置的值对数组
{
var a={},b=c.split("?"),e=b[b.length-1].split("&"); //e获得参数中的值对
for(var f=0;f<e.length;f++)
{
var g=e[f].split("=");
if(g[0])
{
try
{
a[g[0].toLowerCase()]=g.length>1?(window.decodeURIComponent?decodeURIComponent(g[1].replace(//+/g," ")):unescape(g[1])):""
}
catch(h)
{}
}
}
return a
}
function SetADOverrivdeValue() //将当前文档的值对值 google_ad_override 覆盖 当前窗口的值
{
var c=window,a=GetQueryStringNameValues(document.URL);
if(a["google_ad_override"]) //如果存在 google_ad_override 属性,那么继承该属性到当前窗口
{c.google_ad_override=a["google_ad_override"]}
}
function I() //函数返回当前浏览器的版本信息i
{ var c=0;
if(navigator.plugins&&navigator.mimeTypes.length) //查看plugins是否存在
{
var a=navigator.plugins["Shockwave Flash"];
if(a&&a.description)
{
c=a.description.replace(/([a-zA-Z]|/s)+/,"").split(".")[0] // c 获得版本
}
}
else
if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0)
{
c=3;var b=1;
while(b)
{
try
{
b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+(c+1));
c++
}
catch(e)
{
b=null
}
}
}
else
if(IsIEorOpers())
{
try
{
var b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7")
}
catch(e)
{
try
{
var b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
c=6;b.AllowScriptAccess="always"
}
catch(e)
{
if(c==6)
{return c}
}
try
{
b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash")
}
catch(e)
{}
}
if(b!=null)
{
c=b.GetVariable("$version").split(" ")[1].split(",")[0]
}
}
return c //返回插件的版本 看是否支持相关特性
}
// I 函数结束
SetADOverrivdeValue(); //覆盖值对
ViewADMainFunction(CallBackFunction); //把K函数作为参数 传递给P函数
SmartViewGoogleAD();
}
)
()