Amazon の URL から余計なパラメータを取り除くユーザースクリプトを書いた

created: 2022-03-19

Amazon の商品ページの URL には、商品タイトルや遷移パラメータなどが含まれている。 商品ページを共有したいだけの時に長大な URL をシェアすると余計な情報まで共有されてしまうかもしれない。

そこで、余計なパラメータを取り除くユーザースクリプトを書いた。

gist.github:3a7d37f840ccfcbf345e302750f2b23b

例えば https://www.amazon.co.jp/%E9%8B%BC%E9%89%84%E9%83%BD%E5%B8%82-%E3%83%8F%E3%83%A4%E3%82%AB%E3%83%AF%E6%96%87%E5%BA%AB-SF-336-%E3%82%A2%E3%82%A4%E3%82%B6%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A2%E3%82%B7%E3%83%A2%E3%83%95/dp/4150103364/ref=pd_bxgy_1/355-0796311-2845020?pd_rd_w=88Sk2&pf_rd_p=020fee25-8ced-4191-bce3-27e7ce0c0e3b&pf_rd_r=40NVSRRD1YVKHDQ9CYTD&pd_rd_r=8b36acfc-e358-4d1e-94f2-325f1a793021&pd_rd_wg=mVsYB&pd_rd_i=4150103364&psc=1 のページを表示しようとすると https://www.amazon.co.jp/dp/4150120072/ に移動してくれる。

Firefox において GreamseMonkey と TemperMonkey で軽く動作を確認した。

スクリプト本体も以下に記載する。

// ==UserScript==
// @name        Amazon URL canonicalizer 
// @description Replace Amazon product page url with canonical form (`https://amazon.co.jp/dp/XXXXXXXX/`)
// @version     1.0.0
// @match       *://*.amazon.co.jp/dp/*
// @match       *://*.amazon.co.jp/*/dp/*
// @match       *://*.amazon.co.jp/gp/product/*
// @match       *://*.amazon.co.jp/*/ASIN/*
// @match       *://*.amazon.com/dp/*
// @match       *://*.amazon.com/*/dp/*
// @match       *://*.amazon.com/gp/product/*
// @match       *://*.amazon.com/*/ASIN/*
// @icon        https://www.amazon.co.jp/favicon.ico
// @run-at      document-start
// ==/UserScript==

/**
 * get ASIN from page location.
 * ASIN is also known as productId and is some-digit alphanumeric ID.
 * @return {string|null} ASIN
 */
const getASIN = () => {
  const patterns = [
    /(?:.+\/)?dp\/([^/?]+)/,
    /gp\/product\/([^/?]+)/,
    /ASIN\/([^/?]+)/,
  ];
  for(const pattern of patterns){
    const asin = location.href.match(pattern);
    if (asin) {
      return asin[1];
    }
  }
  // cannot get ASIN
  return null;
}

const isCanonicalUrl = () => {
  const pathPattern = /^\/dp\/[a-zA-Z0-9]+\/?$/;
  return location.pathname.match(pathPattern) !== null;
}

/**
 * location.replace(canonicalURL)
 */
const canonicalize = () => {
  const asin = getASIN();
  if (!asin) {
    return;
  }
  
  // i.e. https://www.amazon.co.jp/dp/XXXXXXXX/
  const canonicalUrl = `${location.protocol}//${document.domain}/dp/${asin}/`;
  location.replace(canonicalUrl);
}

const main = () => {
  if (!isCanonicalUrl()) {
    canonicalize();
  }
}

main();