Greasy Fork

Greasy Fork is available in English.

Amazon.co.jpの商品ページに各種リンク追加

Amazon.co.jpの商品ページに固定URL、サクラチェッカー、keepaなどのリンクを追加します

目前为 2023-01-21 提交的版本,查看 最新版本

// ==UserScript==
// @name         Amazon.co.jpの商品ページに各種リンク追加
// @namespace    https://www.amazon.co.jp/dp/
// @version      1.6
// @description  Amazon.co.jpの商品ページに固定URL、サクラチェッカー、keepaなどのリンクを追加します
// @match        https://www.amazon.co.jp/dp/*
// @match        https://www.amazon.co.jp/*/dp/*
// @match        https://www.amazon.co.jp/gp/product/*
// @match        https://www.amazon.co.jp/*/ASIN/*
// @match        https://www.amazon.co.jp/product-reviews/*
// @match        https://www.amazon.co.jp/*/product-reviews/*
// @grant        GM_addStyle
// @license      MIT
// @author       nanashi <[email protected]>
// ==/UserScript==

(() => {
    "use strict";

    // フレーム内(iframeなど)なら終了
    if(window != window.parent) return;

    // 外部リンクのアイコンをスタイルシートで設定(クラス名は衝突を避けるためにわざとダサくしてる)
    GM_addStyle(
        ".gaiburinku::after{" +
        "    content: url(\'data:image/gif;base64,R0lGODlhDAAMAIABADMzM////yH5BAEAAAEALAAAAAAMAAwAAAIajB+gmgvnookPrVYnw3Dr/nnWI4JlSDlaahQA\');" +
        "    opacity: 0.7;" +
        "    margin-left: 2px;" +
        "}"
    );

    // 追加するメイン関数
    const mainFunction = () => {
        // すでに追加済みなら終了
        if(document.getElementById("various_links")) return;

        // ASIN取得
        let asin = null;
        let element_asin = document.getElementById("ASIN");
        if(element_asin){
            let t = String(element_asin.getAttribute("value")).match(/[0-9A-Za-z]{10}/);
            if(t) asin = t[0];
        }
        if(!asin){
            let t = location.href.match(/\/(dp|gp\/product|product-reviews|ASIN)\/([0-9A-Za-z]{10})/);
            if(t) asin = t[2];
        }
        if(!asin) return;

        // 追加先取得
        let element_buybox = document.getElementById("buybox");
        if(!element_buybox) element_buybox = document.getElementById("cm_cr-buy_box");
        if(!element_buybox) return;

        // 追加要素作成
        const div_outer = document.createElement("div");
        div_outer.id = "various_links";
        div_outer.style.marginTop = "0.5em";
        div_outer.style.textAlign = "left";

        // 固定URL
        const div_fix = document.createElement("div");
        const a_fix = document.createElement("a");
        a_fix.setAttribute("href", "https://www.amazon.co.jp/dp/" + asin + "/");
        a_fix.textContent = "固定URL";
        div_fix.appendChild(a_fix);
        div_outer.appendChild(div_fix);

        // 販売元Amazon.co.jpを優先(固定URLにsmid=AN1VRQENFRJN5を付けたもの)
        const div_fix_amazon = document.createElement("div");
        const a_fix_amazon = document.createElement("a");
        a_fix_amazon.setAttribute("href", "https://www.amazon.co.jp/dp/" + asin + "/?smid=AN1VRQENFRJN5");
        a_fix_amazon.textContent = "商品URL(販売Amazon優先)";
        div_fix_amazon.appendChild(a_fix_amazon);
        div_outer.appendChild(div_fix_amazon);

        // サクラチェッカー
        const div_sakura = document.createElement("div");
        const a_sakura = document.createElement("a");
        a_sakura.setAttribute("href", "https://sakura-checker.jp/search/" + asin + "/");
        a_sakura.setAttribute("target", "_blank");
        a_sakura.setAttribute("class", "gaiburinku");
        a_sakura.textContent = "サクラチェッカーで検索";
        div_sakura.appendChild(a_sakura);
        div_outer.appendChild(div_sakura);

        // keepa
        const div_keepa = document.createElement("div");
        const a_keepa = document.createElement("a");
        a_keepa.setAttribute("href", "https://keepa.com/#!product/5-" + asin);
        a_keepa.setAttribute("target", "_blank");
        a_keepa.setAttribute("class", "gaiburinku");
        a_keepa.textContent = "keepaで検索";
        div_keepa.appendChild(a_keepa);
        div_outer.appendChild(div_keepa);

        // 作成した要素を追加
        element_buybox.parentNode.insertBefore(div_outer, element_buybox.nextElementSibling);
    };

    // 動的更新の監視対象
    let desktop_buybox = null;
    const buyboxidlist = ["dsv_buybox_desktop", "desktop_buybox_feature_div", "desktop_buybox", "combinedBuyBox"];
    for( let i=0; i < buyboxidlist.length; i++ ){
        desktop_buybox = document.getElementById(buyboxidlist[i]);
        if( desktop_buybox ) break;
    }
    if(desktop_buybox){
        (new MutationObserver(mainFunction)).observe(desktop_buybox, {childList:true});
    }

    // 初回実行
    mainFunction();
})();