まとめ
- Amazonってリンクが無駄に長い
- そういうサイト1もあるが、macの右クリックからコピーしたい
- Automatorを使って作った
Amazonのリンクは長い
また、検索バーに入れていた値も引き継がれるため、どうやって検索したのかがわかってしまいます。
他人に共有するときなどは適していません。
Amazonリンクの仕組み
短縮方法
必要なのはdp/B007CEWVRW
のような10桁の文字列です。
ASINと呼ばれ、Amazonが商品につける固有のIDとなっています。2
これを使うだけで、こんなに短縮することができます。
https://amazon.co.jp/dp/B007CEWVRW
URLの種類
しかし、アフィリエイトリンクなどではまれにdb/
から始まる番号がない場合があるらしい。3
そのため、URLのパターンを網羅する必要があります。
上記サイトによれば、四つのパターンがあるようです。
Amazonリンク |
---|
dp/){ASIN}/ |
gp/product/{ASIN}/ |
exec/obidos/asin/{ASIN}/ |
o/ASIN/{ASIN}/ |
設計
要件がわかってきたところで、今回作るものの概要を考えます。
- macで右クリックから呼び出したい
- 入力されたURLを正規表現でパーズし、ASINを取り出す
- 最小のURLを再構成してクリップボードにコピー
今回はこれを目指すことにします。
要素技術
Automator
今回はURLを選択→右クリックのメニューからコピーや、クリップボードの操作を行いたかったので、OSと親和性の高いAutomatorを用いました。
と言っても、AppleはAutomatorにJavaScriptを対応させており、JavaScriptで完結することができます。
他にもAppleScriptなるものがあるようですが、このために勉強するのはだるいコストが高いのでやめました。
JavaScript
JavaScriptでクリップボードの操作など、OSに関わる操作をする場合、StandardAdditions
パッケージを用いる。
このパッケージはWeb上に公式のリファレンスが存在しない。(多分)
macのローカルに保存されているので、下記手順に従ってリファレンスを参照しましょう。4
- スクリプトエディタ
- ファイル
- 用語説明を開く
- 右上のAppleScriptをJavaScriptに変更
-
StandardAdditions.osax
を開く - それっぽい機能をクリック
例えばクリップボードへのコピーだと、Clipboard Commands
→setTheClipboardTo
に、
Clipboard Commands
setTheClipboardTo method : Place data on an application’s clipboard. Use inside a ‘tell’ block and activate the application first
setTheClipboardTo any : the data to place on the clipboard
とあり、setTheClipboardTo(any)
を使えばいいことがわかります。
実装
さて、やることとやり方がわかったので実装をします。
正規表現
今回はamazon.comでもamazon.co.jpでも動かしたかったので、正規表現は下記のようにしました。5
var regList = [];
regList.push(/(?:https?:\/\/)?([^\/]*\/).*dp\/([0-9A-Z]{10})(?:[^0-9A-Z]|$)/i);
regList.push(/(?:https?:\/\/)?([^\/]*\/).*product\/([0-9A-Z]{10})(?:[^0-9A-Z]|$)/i);
regList.push(/(?:https?:\/\/)?([^\/]*\/).*asin\/([0-9A-Z]{10})(?:[^0-9A-Z]|$)/i);
これで四つのパターンが網羅され、ドメインとASINがキャプチャされます。
URLが取れたらクリップボードにコピー
クリップボードにコピーするには、下記のように書きます。
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.setTheClipboardTo(url);
最初の二行はおまじないと思っています。
includeStandardAdditionsを入れないと、その時開いているソフトの機能しか呼び出せないようです。
URLが取れなかったら警告を吐く
用語説明を漁って、OKボタンのみのダイアログがあることがわかりました。
var dialogText = "Amazonリンクが正しく入力されませんでした。";
app.displayAlert(dialogText, {
buttons: "終了",
});
完成
成功した時は邪魔にならないように通知を入れたりして、完成したのが下記になります。
function getAsin(target) {
var regList = [];
regList.push(/(?:https?:\/\/)?([^\/]*\/).*dp\/([^\/|\?]*)/i);
regList.push(/(?:https?:\/\/)?([^\/]*\/).*product\/([^\/|\?]*)/i);
regList.push(/(?:https?:\/\/)?([^\/]*\/).*asin\/([^\/|\?]*)/i);
for (let reg of regList) {
var m = reg.exec(target);
if (m) {
return [m[1], m[2]];
}
}
}
function run(input, parameters) {
var app = Application.currentApplication();
app.includeStandardAdditions = true;
var domain, asin;
urlInfo = getAsin(input);
if (urlInfo) {
[domain, asin] = urlInfo;
url = "https://" + domain + "dp/" + asin;
app.setTheClipboardTo(url);
app.displayNotification("URLをコピーしました",{
withTitle: "成功",
})
}else{
var dialogText = "Amazonリンクが正しく入力されませんでした。";
app.displayAlert(dialogText, {
buttons: "終了",
});
}
}
GitHubにも載せてあります。
Automatorに載せる
これをAutomatorに載せて、右クリックから使えるようにします。
基本は画像の通り設定すればOKです。
URLが選択されているときに、右クリックメニューに表示されます。
終わりに
Javascript for Automationって衰退しているのか?ってくらい文献がないですね。
もっといい共有方法を知っている方がいたら教えてください。
-
めっちゃ便利なツール: https://howtobuyfromjapan.com/amazon_url_shortener.htm ↩
-
参考 Amazon: https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201446530 ↩
-
参考 ITMedia: https://www.itmedia.co.jp/bizid/articles/0805/13/news065.html ↩
-
参考 Apple公式: https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/OpenaScriptingDictionary.html ↩
-
参考 AmazonのURLからASINコードを抜き出すための正規表現コード
https://penpen-dev.com/blog/ama-asin-nukidasu/ ↩