AmaGrea

By Koonies Last update Nov 12, 2009 — Installed 2,489 times.

There are 7 previous versions of this script.

// ==UserScript==
// @name           AmaGrea
// @namespace      http://d.hatena.ne.jp/Koonies/
// @description    超簡単にAmazonアソシエイト(アフィリエイト)リンクを商品ページで生成
// @include        http://www.amazon.co.jp/*
// @version        1.5
// ==/UserScript==

//リンクの動作確認には「リンクの動作確認ツール(https://affiliate.amazon.co.jp/gp/associates/network/tools/link-checker/main.html)」を利用

(function() {

    function checkUrl(url) {return (!CHECK_MODE) ? url : CHECK_URL + encodeURIComponent(url);}
    function $x(exp) {return document.evaluate(exp,document,null,7,null);}
    function $xi(exp,index) {return $x(exp).snapshotItem(index);}
    
    function getCookie(name, defaultValue) {
        //  console.log("getCookie: " + name);
        var start = document.cookie.indexOf( name + "=" );
        var len = start + name.length + 1;
        if (  ( !start ) && ( name != document.cookie.substring( 0, name.length ) )
           || ( start == -1 ) ) {
            return ( !!defaultValue ) ? defaultValue : null;
        }
        var end = document.cookie.indexOf( ';', len );
        if ( end == -1 ) end = document.cookie.length;
        return unescape( document.cookie.substring( len, end ) );
    }
    function setCookie(name, value, expires, path, domain, secure) {
        //  console.log("setCookie: " + name + " = " + value);
        var today = new Date();
        today.setTime( today.getTime() );
        if ( expires ) {
            expires = expires * 1000 * 60 * 60 * 24;
        }
        var expires_date = new Date( today.getTime() + (expires) );
        document.cookie = name+'='+escape( value ) +
            ( ( expires ) ? ';expires='+expires_date.toGMTString() : ';expires=Thu, 1-Jan-2030 00:00:00 GMT' ) + //expires.toGMTString()
            ( ( path ) ? ';path=' + path : ';path=/' ) +
            ( ( domain ) ? ';domain=' + domain : '' ) +
            ( ( secure ) ? ';secure' : '' );
    }
    function getToday() {
        var now, yy, mm, dd;
        now = new Date();
        yy = now.getYear();
        mm = now.getMonth() + 1;
        dd = now.getDate();
        if (yy < 2000) { yy += 1900; }
        if (mm < 10)   { mm = "0" + mm; }
        if (dd < 10)   { dd = "0" + dd; }
        return yy + "." + mm + "." + dd;
    }
    
    var start_time = new Date();

    //  定数定義
    var ASSOCIATE_ID = "associate_ID-22";
    var CHECK_MODE = false; //true;
    var CHECK_URL = "https://affiliate.amazon.co.jp/gp/associates/network/tools/link-checker/main.html??link=";
    var STAR_URL = "http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-@.gif"; /* '@'を置換して使う */
    
    var SIZE_NUM   = 3;
    var LABEL_SIZE = ["小", "中", "大"];
    var INT_SIZE   = [ 75 , 120 , 160 ];
    var DEFAULT_SELECTED_NUM = SIZE_NUM - 1;
    
    var xpath = {
        'ASIN'  : 'id("ASIN")',
        'STAR0' : 'id("handleBuy")/span/span/span[@class="asinReviewsSummary"]/a/span',
        //'STAR1' : 'id("customerReviews")/div[@class="content"]/table/tbody/tr[2]/td[1]/table[1]/tbody/tr/td[2]/div[2]/span[1]/span',
        //'REVW1' : 'id("customerReviews")/div[@class="content"]/table/tbody/tr[2]/td[1]/table[1]/tbody/tr/td[2]/div[2]/span[2]/b',
        'STAR1' : 'id("customerReviews")/div[@class="content"]/table/tbody/tr[2]/td[1]/table[1]/tbody/tr/td[2]/div/span[1]/span',
        'STAR2' : 'id("customerReviews")/div[@class="content"]/table/tbody/tr[2]/td[1]/table[2]/tbody/tr/td[2]/div/span[1]/span',
        'STAR3' : 'id("customerReviews")/div[@class="content"]/table/tbody/tr[2]/td[1]/table[3]/tbody/tr/td[2]/div/span[1]/span',
        'REVW1' : 'id("customerReviews")/div[@class="content"]/table/tbody/tr[2]/td[1]/table[1]/tbody/tr/td[2]/div/span[2]/b',
        'REVW2' : 'id("customerReviews")/div[@class="content"]/table/tbody/tr[2]/td[1]/table[2]/tbody/tr/td[2]/div/span[2]/b',
        'REVW3' : 'id("customerReviews")/div[@class="content"]/table/tbody/tr[2]/td[1]/table[3]/tbody/tr/td[2]/div/span[2]/b',
        'PRICE' : '//b[@class="priceLarge"]',
        'P_OFF' : 'id("priceBlock")/table[@class="product"]/tbody/tr[3]/td[@class="price"]',
        'MAKER' : 'id("handleBuy")/div//a',
        'TITLE' : 'id("btAsinTitle")',
        'RANK'  : 'id("SalesRank")',
        'ARANK' : 'id("SalesRank")/table/tbody/tr[1]/td[2]/b/a',
        'PIC'   : 'id("prodImageCell")/a/img|id("prodImage")',
        'GRID'  : 'id("handleBuy")/table[3]'
    };


    //  商品ページ以外で処理しない
    if (!$xi(xpath['GRID'],0)) return;


    var i;
    var table, trTop, trMid, trBot;
    var tblPreview, trPreview, tdPreviewL, tdPreviewR;
    var imgProduct, imgStar0, imgStar1, imgStar2, imgStar3;
    var aProduct1, aProduct2, aRank, aDetail;
    var divTitle, divInfo, divReview, divRank;
    var textareaHtml;

    var asin, url, title, maker, price, price_off;
    var poff_bak, star_bak, review_bak, rank_bak, detail_bak;

    /*  商品情報取得  */
    asin = $xi(xpath['ASIN'],0).value;
    url = "http://www.amazon.co.jp/gp/product/" + asin + "/ref=nosim?ie=UTF8&tag=" + getCookie("associateID", ASSOCIATE_ID);
    url = checkUrl(url);
    title = $xi(xpath['TITLE'],0).textContent;
    if (!$xi(xpath['MAKER'],0)) {
        maker = "";
    } else {
        maker = $xi(xpath['MAKER'],0).textContent;
    }
    if (!$xi(xpath['PRICE'],0)) {
        price = "";
    } else {
        price = $xi(xpath['PRICE'],0).textContent;
    }
    if (!$xi(xpath['P_OFF'],0)) {
        price_off = "";
    } else {
        price_off = $xi(xpath['P_OFF'],0).textContent;
        price_off = price_off.match(/[.0-9]+%/);
        price_off = "(" + price_off + " OFF)";
    }
    
    table = document.createElement('table');
    trTop = document.createElement('tr');
    trMid = document.createElement('tr');
    trBot = document.createElement('tr');

    tblPreview = document.createElement('table');
    trPreview  = document.createElement('tr');
    tdPreviewL = document.createElement('td');
    tdPreviewR = document.createElement('td');

    imgProduct = document.createElement('img');
    imgStar0 = document.createElement('img');
    imgStar1 = document.createElement('img');
    imgStar2 = document.createElement('img');
    imgStar3 = document.createElement('img');

    divTitle = document.createElement('div');
    divInfo = document.createElement('div');
    divReview = document.createElement('div');
    divRank = document.createElement('div');
    
    aProduct1 = document.createElement('a');
    aProduct2 = document.createElement('a');
    aRank = document.createElement('a');
    aDetail = document.createElement('a');
    textareaHtml = document.createElement('textarea');
    textareaHtml.cols = "50";
    
    //table.border = "3";
    table.style.borderColor = "AED2EE";
    table.style.borderStyle = "solid";

    table.appendChild(trTop);
    table.appendChild(trMid);
    table.appendChild(trBot);
    
    trMid.appendChild(textareaHtml);
    trBot.appendChild(tblPreview);
    
    /*  アソシエイトリンク用テーブル  */
    tblPreview.className = "AmaGrea";
    tblPreview.appendChild(trPreview);

    function getAssociateLinkCode() {
        return trBot.innerHTML + "\n";
    }
    function hasProductImage() {
        if (!$xi(xpath['PIC'],0)) {
            return false;
        } else {
            return ($xi(xpath['PIC'],0).src.indexOf("no-image-avail-img-map") <= 0);
        }
    }
    function getImgUrl(size) {
        return $xi(xpath['PIC'],0).src.replace(/_[A-Z]+[0-9]+_\.jpg/, "_SS" + INT_SIZE[size] + "_.jpg");
    }
    function appendProductImage(size) {
        //  console.log($xi(xpath['PIC'],0).src);
        if ($xi(xpath['PIC'],0).src.indexOf("no-image-avail-img-map") > 0) return;
        
        trPreview.appendChild(tdPreviewL);
        tdPreviewL.appendChild(aProduct1);
        tdPreviewL.className = "ag_img";
        aProduct1.appendChild(imgProduct);
        
        aProduct1.href = url;
        aProduct1.target = "_blank";
        imgProduct.src = getImgUrl(size);
    }
    function createStar(exp) {
        var img = document.createElement('img');
        img.src = STAR_URL.replace("@", $xi(exp,0).getAttribute("class").match(/([0-9][_0-9]*)\s*$/)[1].replace("_","-"));
        return img;
    }
    function appendProductInfo(poff,star,review,rank,detail) {
        poff_bak = poff;
        star_bak = star;
        review_bak = review;
        rank_bak = rank;
        detail_bak = detail;

        tdPreviewR.innerHTML = '';
        trPreview.appendChild(tdPreviewR);
        tdPreviewR.className = "ag_info";
        tdPreviewR.appendChild(divTitle);
        tdPreviewR.appendChild(divInfo);
        divTitle.appendChild(aProduct2);
        
        aProduct2.href = url;
        aProduct2.target = "_blank";
        aProduct2.textContent = title;
        
        divInfo.innerHTML = maker;
        divInfo.innerHTML += price;
        if (poff) {
            divInfo.innerHTML += price_off;
        }
        if (star) {
            imgStar0 = createStar(xpath['STAR0']);
            divInfo.appendChild(imgStar0);
        }
        
        divReview.innerHTML = '';
        if (review) {
            tdPreviewR.appendChild(divReview);
            
            imgStar1 = createStar(xpath['STAR1']);
            divReview.appendChild(imgStar1);
            divReview.innerHTML += $xi(xpath['REVW1'],0).textContent;
            if (!!$xi(xpath['STAR2'],0)) {
                divReview.innerHTML += "<br>";
                imgStar2 = createStar(xpath['STAR2']);
                divReview.appendChild(imgStar2);
                divReview.innerHTML += $xi(xpath['REVW2'],0).textContent;
            }
            if (!!$xi(xpath['STAR3'],0)) {
                divReview.innerHTML += "<br>";
                imgStar3 = createStar(xpath['STAR3']);
                divReview.appendChild(imgStar3);
                divReview.innerHTML += $xi(xpath['REVW3'],0).textContent;
            }
        }
        
        divRank.innerHTML ='';
        if (rank)
        {
            tdPreviewR.appendChild(divRank);
            
            aRank.href = $xi(xpath['ARANK'],0).href + "&tag=" + getCookie("associateID", ASSOCIATE_ID);
            aRank.href = checkUrl(aRank.href);
            aRank.target = "_blank";
            aRank.textContent = $xi(xpath['ARANK'],0).textContent;
            divRank.appendChild(aRank);
            divRank.innerHTML += ":" + $xi(xpath['RANK'],0).textContent.match(/([0-9]+\u4f4d) ─/)[1] + " (" + getToday() + ")"; //\u4f4d:位
        }
        if (detail)
        {
            tdPreviewR.appendChild(aDetail);
            aDetail.href = url;
            aDetail.target = "_blank";
            aDetail.textContent = "Amazon\u3067\u8a73\u7d30\u3092\u898b\u308b";
            
            tdPreviewR.innerHTML += '<font size="-2"> by <a href="http://d.hatena.ne.jp/Koonies/20091107/AmaGrea">AmaGrea</a></font>';
        }
    }
    if (hasProductImage()) {
        appendProductImage(getCookie("size", DEFAULT_SELECTED_NUM));
    }
    
    poff_bak   = (getCookie("poff", "true")=="true");
    star_bak   = !!$xi(xpath['STAR0'],0);
    review_bak = !!$xi(xpath['STAR1'],0) ? (getCookie("review", "true")=="true") : false;
    rank_bak   = !!$xi(xpath['ARANK'],0) ? (getCookie("rank", "true")=="true")   : false;
    detail_bak = (getCookie("detail", "false")=="true");
    //  console.log(   "priceoff: [" + String(poff_bak)  + "]"
    //             + "\nstar    : [" + String(star_bak)  + "]"
    //             + "\nreview  : [" + String(review_bak)+ "]"
    //             + "\nrank    : [" + String(rank_bak)  + "]");
    
    appendProductInfo(poff_bak, star_bak, review_bak, rank_bak, detail_bak);
    
    textareaHtml.value = getAssociateLinkCode(); //trBot.innerHTML;
    textareaHtml.readOnly = true;
    textareaHtml.addEventListener(
        'click',
        function() {
            textareaHtml.focus();
            textareaHtml.select();
        },true
    );
    
    
    var fontSetting;
    var divAmaID, textAmaID;
    var divSize, radioSize, labelSize;
    var divPOff, radioPOff, labelPOff;
    var divSOff, radioSOff, labelSOff;
    var divROff, radioROff, labelROff;
    var divDOff, radioDOff, labelDOff;
    radioSize = new Array(SIZE_NUM);
    labelSize = new Array(SIZE_NUM);
    
    fontSetting = document.createElement('font');
    fontSetting.size = "-1";
    
    /*  アソシエイト設定  */
    divAmaID = document.createElement('div');
    fontSetting.appendChild(divAmaID);
    textAmaID = document.createElement('input');
    textAmaID.type = "text";
    textAmaID.style.fontFamily = "arial";
    textAmaID.value = getCookie("associateID", ASSOCIATE_ID);
    textAmaID.addEventListener(
        'change',
        function() {
            setCookie("associateID", this.value);
            url = "http://www.amazon.co.jp/gp/product/" + asin + "/ref=nosim?ie=UTF8&tag=" + this.value;
            url = checkUrl(url);
            
            if (hasProductImage()) {
                appendProductImage(getCookie("size", DEFAULT_SELECTED_NUM));
            }
            appendProductInfo(poff_bak, star_bak, review_bak, rank_bak, detail_bak);
            textareaHtml.value = getAssociateLinkCode();
        },true
    );
    
    divAmaID.innerHTML = "+ <b>\u30a2\u30bd\u30b7\u30a8\u30a4\u30c8ID</b>:"; //アソシエイトID
    divAmaID.appendChild(textAmaID);
    
    if (hasProductImage()) {
        /*  画像サイズ設定  */
        divSize = document.createElement('div');
        fontSetting.appendChild(divSize);
        divSize.innerHTML = "+ <b>\u753b\u50cf\u30b5\u30a4\u30ba</b>:"; //画像サイズ
        for (i=0; i<SIZE_NUM; i++) {
            radioSize[i] = document.createElement('input');
            radioSize[i].type = "radio";
            radioSize[i].name = "Size";
            radioSize[i].id = "Size" + i;
            radioSize[i].value = i;
            radioSize[i].addEventListener(
                'click',
                function() {
                    setCookie("size", this.value);
                    imgProduct.src = getImgUrl(this.value);
                    textareaHtml.value = getAssociateLinkCode();
                },true
            );
            labelSize[i] = document.createElement('label');
            labelSize[i].textContent = LABEL_SIZE[i] + "(" + INT_SIZE[i] + ")";
            labelSize[i].htmlFor = "Size" + i;
            
            divSize.appendChild(radioSize[i]);
            divSize.appendChild(labelSize[i]);
        }
        radioSize[getCookie("size", DEFAULT_SELECTED_NUM)].defaultChecked = true;
    }
    
    if (!!$xi(xpath["P_OFF"],0)) {
        /*  割引情報  */
        divPOff = document.createElement('div');
        fontSetting.appendChild(divPOff);
        radioPOff = document.createElement('input');
        radioPOff.type = "checkbox";
        radioPOff.name = "POff";
        radioPOff.id = "POff";
        radioPOff.addEventListener(
            'click',
            function() {
                setCookie("poff", this.checked);
                appendProductInfo(this.checked, star_bak, review_bak, rank_bak, detail_bak);
                textareaHtml.value = getAssociateLinkCode();
            },true
        );
        labelPOff = document.createElement('label');
        labelPOff.innerHTML = "<b>\u5272\u5f15\u7387\u306e\u8868\u793a</b>"; //割引率の表示
        labelPOff.htmlFor = "POff";
        
        divPOff.appendChild(radioPOff);
        divPOff.appendChild(labelPOff);
        radioPOff.defaultChecked = poff_bak;
    }
    
    if (!!$xi(xpath["STAR1"],0)) {
        /*  レビュー情報  */
        divSOff = document.createElement('div');
        fontSetting.appendChild(divSOff);
        radioSOff = document.createElement('input');
        radioSOff.type = "checkbox";
        radioSOff.name = "SOff";
        radioSOff.id = "SOff";
        radioSOff.addEventListener(
            'click',
            function() {
                setCookie("review", this.checked);
                appendProductInfo(poff_bak, star_bak, this.checked, rank_bak, detail_bak);
                textareaHtml.value = getAssociateLinkCode();
            },true
        );
        labelSOff = document.createElement('label');
        labelSOff.innerHTML = "<b>\u30ec\u30d3\u30e5\u30fc\u306e\u8868\u793a</b>"; //レビューの表示
        labelSOff.htmlFor = "SOff";
        divSOff.appendChild(radioSOff);
        divSOff.appendChild(labelSOff);
        radioSOff.defaultChecked = review_bak;
    }
    
    if (!!$xi(xpath["RANK"],0)) {
        /*  ランキング情報  */
        divROff = document.createElement('div');
        fontSetting.appendChild(divROff);
        radioROff = document.createElement('input');
        radioROff.type = "checkbox";
        radioROff.name = "ROFF";
        radioROff.id = "ROFF";
        radioROff.addEventListener(
            'click',
            function() {
                setCookie("rank", this.checked);
                appendProductInfo(poff_bak, star_bak, review_bak, this.checked, detail_bak);
                textareaHtml.value = getAssociateLinkCode();
            },true
        );
        labelROff = document.createElement('label');
        labelROff.innerHTML = "<b>\u30e9\u30f3\u30ad\u30f3\u30b0\u60c5\u5831\u306e\u8868\u793a</b>"; //ランキング情報の表示
        labelROff.htmlFor = "ROFF";
        divROff.appendChild(radioROff);
        divROff.appendChild(labelROff);
        radioROff.defaultChecked = rank_bak;
    }
    
    /*  詳細リンク  */
    divDOff = document.createElement('div');
    fontSetting.appendChild(divDOff);
    radioDOff = document.createElement('input');
    radioDOff.type = "checkbox";
    radioDOff.name = "DOff";
    radioDOff.id = "DOff";
    radioDOff.addEventListener(
        'click',
        function() {
            setCookie("detail", this.checked);
            appendProductInfo(poff_bak, star_bak, review_bak, rank_bak, this.checked);
            textareaHtml.value = getAssociateLinkCode();
        },true
    );
    labelDOff = document.createElement('label');
    labelDOff.innerHTML += "<b>\u8a73\u7d30\u30ea\u30f3\u30af\u306e\u8868\u793a</b>"; //詳細を見るの表示
    labelDOff.htmlFor = "DOff";
    divDOff.appendChild(radioDOff);
    divDOff.appendChild(labelDOff);
    radioDOff.defaultChecked = detail_bak;



    
    trTop.innerHTML = '<b><font color="990000"><a href="http://userscripts.org/scripts/show/61416" target="_blank" title="\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u6700\u65b0\u7248\u3092\u30c1\u30a7\u30c3\u30af">AmaGrea</a></font></b><br>'; //スクリプトの最新版をチェック
    trTop.appendChild(fontSetting);
    
    /*  処理時間  */
    var lblTime = document.createElement('label');
    var end_time = new Date();
    lblTime.textContent = (String(end_time - start_time) + "[ms]");
    //fontSetting.appendChild(lblTime);
    
    /*  出力先  */
    var box = $xi(xpath["GRID"],0);
    box.appendChild(table);
    
    if (textAmaID.value == ASSOCIATE_ID) {
        textAmaID.focus();
        textAmaID.select();
        //alert("アソシエイトIDを設定してください\n(設定した値は保存されます)");
        alert("\u30a2\u30bd\u30b7\u30a8\u30a4\u30c8ID\u3092\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\n(\u8a2d\u5b9a\u3057\u305f\u5024\u306f\u4fdd\u5b58\u3055\u308c\u307e\u3059)");
    }
})();