🎄

RustでAmazon商品URLの不要部分削除するCLI作った

2022/12/17に公開

この記事は Rust Advent Calendar 2022 17日目の記事です。


はじめに

今年の9月,Rustの学習の一環として,Amazon商品URL内の省略可能部分(=日本語部分・パーセントエンコード部)を削除するCLIアプリを作りました。

該当レポジトリはこちらです。https://github.com/Yuki2Kisaragi/cuturl

作成した背景

(作った動機を書いてきます。読み飛ばしてOKです。)
他人にAmazon商品を教える際,Discord・SlackなどのアプリケーションにURLを貼って教えることがあると思います。
長文URLでトークのタイムラインを圧迫することが好きではなかったので,一々要らない箇所を削除していました。

例えば,この商品のURLで紹介します。(プログラミングRust第二版の商品URLです。)

これを

https://www.amazon.co.jp/dp/4873119782/?coliid=I3FY3GRN12MDQK&colid=112OTYINW3M1V&psc=1&ref_=lv_ov_lig_dp_it

↓のように短くします。

https://www.amazon.co.jp/dp/4873119782/

AmazonストアのURLと商品のASIN番号4873119782があれば商品ページに飛べます。

機械的に省略でき,楽をしたいと思ってCLI作成に取り掛かりました。

アプリの一部説明

Install

git clone https://github.com/Yuki2Kisaragi/cuturl
cd cuturl
cargo build --release
cp ./target/release/cuturl .
alias cuturl=./cuturl

(いずれ,cratesに登録したいと考えています。)

Usage

$ cuturl
Please input amazon_url : https://www.amazon.co.jp/dp/4873118174/?coliid=I1IVE2TUH5XLB6&colid=112OTYINW3M1V&psc=1&ref_=lv_ov_lig_dp_it
CONVERTED_URL : https://www.amazon.co.jp/dp/4873118174/
$ cuturl
Please input amazon_url : https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Rust%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95%E3%81%BE%E3%81%A7-%CE%BAeen-ebook/dp/B07QVQ7RDG/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=8SLSXOXMGC20&keywords=Rust+%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&qid=1662271136&sprefix=rust+20+e5+ae+9f+e8+b7+b5+e5+85+a5+e9+96+80%2Caps%2C203&sr=8-2
CONVERTED_URL : https://www.amazon.co.jp/dp/B07QVQ7RDG/

URL省略関数のソース

商品URLを短縮関数を紹介します。

処理としては,

Rustの正規表現クレートであるregexを使いURLの中のASIN番号を抜き出して,
原形となるAmazonURL(https://www.amazon.co.jp/gp/product/)と連結します。

fn convert_url(str_text: &str) -> Result<String> {
    lazy_static! {
        static ref RE: Regex = Regex::new(r"[A-Z0-9]{5,}").unwrap();
    }

    let amazon_url = "https://www.amazon.co.jp/gp/product/".to_string();
    let caps = RE
        .captures(str_text)
        .context(format!("Can not convert url: {}", str_text))?;
    let converted_url = amazon_url + &caps[0];
    Ok(converted_url)
}

lazy_static!マクロを使うことで,アクセス初回だけ実行します。

しかし,lazy_static!は現在のRustだと主流ではないので,Oncecellに変更しました。
また,グローバル変数に置きました。

static RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"[A-Z0-9]{5,}").unwrap());

最後に

このアプリもこれで終わらせず,TauriでGUIアプリにしたり,ファイル読み込み機能も実装したいと思います。

今年の1月にRustを始めて,やっと一年が経ちます。Rustのアドベントカレンダーに記事を書くことができ大変嬉しく,Rustマスターの良き1歩目となったかなと思います。

参考資料


追記(というかオチ)

この記事を執筆中にAmazonストアに商品の短縮URLをコピー機能を発見しました。
見つけたとき記事の書く意志が若干消えかけましたが,頑張って書きましたw。

Discussion