RustでAmazon商品URLの不要部分削除するCLI作った
この記事は 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フォーマットに関するメモ
- lazy_static はもう古い!? once_cell を使おう
- lazy_staticはもう古い。遅延初期化にはonce_cellを使おう
追記(というかオチ)
この記事を執筆中にAmazonストアに商品の短縮URLをコピー機能を発見しました。
見つけたとき記事の書く意志が若干消えかけましたが,頑張って書きましたw。
Discussion