2006/12/22

Blogger Widget (3) for Amazaon Associates.

クロスドメイン問題に行き詰っていたAmazon アフィリエイト向けのWidgetですが、専用の外部ファイルを必要としない形、つまりはWidget内完結型での最終形はこんな感じになりました。


<script type="text/javascript" language="javascript">
<!--
/* Script for Amazon Associates */

var MAX_ADS = 3;
var LABEL_WORD_FACTOR = 4;

cKeyWords=function(name,value){this.name=name;this.value=value};
cKeyWords.compare=function(a,b){return b.value-a.value};

var org=window["onload"];
window["onload"]=
(typeof org!="function"?
function(event){insertAds(document.body,'div','post-body')}:
function(event){insertAds(document.body,'div','post-body');org(event)});


function insertAds(elm,tagName,className){
var elms=elm.getElementsByTagName(tagName);

for(var i=0; i<elms.length;i++){
var e=elms[i];
if(e.getAttribute("className")==classNamee.getAttribute("class")==className){

var words = getKeywordsFromElement(e);
var labelWords = getLabelWords(e);

// Evaluate keywords by Label
for(var n=0;n<labelWords.length;n++)
if(words[labelWords[n]])
words[labelWords[n]]*=LABEL_WORD_FACTOR;

var wordList = sortKeywordsByPoint(words);


// for Debug...
for(var n=0,t="Keywords::Debug=";n<wordList.length;n++){
t=t+wordList[n].name+"["+wordList[n].value+"] ";
}
var eee=document.createElement("p");
eee.style.fontSize="75%";
eee.style.display="none";
eee.innerHTML=t;
e.appendChild(eee);

var eDiv = document.createElement("div");

for(var n=0;n<MAX_ADS&&n<wordList.length;n++){
var eSpan = document.createElement("span");
var eAd = document.createElement("iframe");
eAd.setAttribute("src"
, "http://rcm-jp.amazon.co.jp/e/cm?t=isawseash-22"
+ "&o=9&p=9&l=st1"
+ "&mode=books-jp"
+ "&search=" + encodeURI(wordList[n].name)
+ "&fc1=<1=&lc1=&bg1=&f=ifr");
eAd.setAttribute("scrolling","no");
eAd.setAttribute("frameborder","0");
eAd.setAttribute("border","0");
eAd.setAttribute("height","150");
eAd.setAttribute("width","180");
eAd.setAttribute("marginheight","0" );
eAd.setAttribute("marginwidth","0");

if (document.documentElement.getAttribute("style") == document.documentElement.style){
eAd.style.borderStyle ="none";
var s1 ="BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none"
var s2 = eAd.outerHTML;
s2 = s2.replace(s1,"border:none");
eSpan.innerHTML =s2;
}
else{
eAd.setAttribute("style","border:none;");
eAd = eSpan.appendChild(eAd);
}
eDiv.appendChild(eSpan);
}//__for(ads)
e.appendChild(eDiv);
}//__if
}//__for
}


function getKeywordsFromElement(elm){
var re = new RegExp;
re.compile("([A-Z]+[a-z0-9\.#\+-]+[ \.][A-Z0-9]+[a-z0-9\.#\+-]+)"
+"([A-Z]+[A-Za-z0-9\.\+#\-]+)([繧。-繝エ繝シ]+)","g");

var s = getPostDocumentText(elm,"(prescriptform)");

var token = s.match(re);
var rslt=new Array();

if(token){
for(var i=0;i<token.length;i++){
if( rslt[token[i]])
rslt[token[i]]++;
else
rslt[token[i]]=1;
}//__for
}//__if(token)

return rslt;
}//__function getKeyworksFromElement;

function getPostDocumentText(elm,exceptTagNames){
var sRslt="";
var re=new RegExp(exceptTagNames,"i");
for(var i=0;i<elm.childNodes.length;i++){
var e=elm.childNodes[i];
if(elm.childNodes[i].nodeType==1
&&!String(e.tagName).match(re)){
sRslt=sRslt+getPostDocumentText(e,exceptTagNames);
}
else if(e.nodeType==3){
sRslt=sRslt+e.nodeValue;
}
}//__for(childNodes)
return sRslt;
}

function sortKeywordsByPoint(keywords){
var wordList = new Array();
for( v in keywords)
if(typeof keywords[v]!="function")
wordList.push(new cKeyWords(v,keywords[v]));
wordList.sort(cKeyWords.compare);
return wordList;
}//__sortKeywordsByPoint

function getLabelWords(ePost){
var arRslt = new Array();

for(var eNext = ePost.nextSibling;eNext.nodeType!=1;eNext=eNext.nextSibling);
var eSpans = eNext.getElementsByTagName("span"); //Lable is in Span Elemnet.

for(var i=0; i<eSpans.length;i++){
var e=eSpans[i];
if(e.getAttribute("className")=="post-labels"e.getAttribute("class")=="post-labels"){
var eKeywords= e.getElementsByTagName("a");
for(var l=0;l<eKeywords.length;l++){
arRslt.push(eKeywords[l].innerHTML);
}
break;
}//__if
}//__for

return arRslt;
}//__getSearchKeyword
-->
</script>

そんなに特殊な事をしてるわけではなくて、ベタにキーワードを抽出というか、英単語とカタカナの単語を抜き出して出現回数で順位付け、それらの単語がLabelで使われている場合は倍率ドンって感じにして、上位から順にAmazon用のタグを作成して並べるって感じです。

例によって該当しないキーワードの場合は売れ筋商品が表示されたり、Books-jp指定しているだけなので、キーワードによっては不思議な書籍が表示されますが、それはそれで楽しめないようではダメですな。

BlogのPost(記事)に直接アフィリエイトなiframeとか埋めてしまうと、後で消すとか変更とか出来ませんが、Widgetにした事で動的な後付ですから変更が容易になるあたりが利点ではありますが、意図しない物が選択・表示されてしまう悲哀を背負っていますので、その辺りの改善は外部ファイル連携バージョンで対応する予定です。

外部に置くのはxslファイルにするか、それともRESTでJSONPな感じなAPIを用意するかは、まだ考え中ですが、最近のテーマは「素敵なGoogle生活」だったりするんで、場所もGoogle関係とするとGoogle Page Createtorとかになってしまうんで、Javascriptファイルやxslファイルは置けてもAPIの実装は無理だしとか。

関連のありそうな記事

0 コメント: