📦

宅配物追跡CLIツールの作成及び登録自動化の試み

#tech#Go

2023-9-7

  • 追跡番号付きの宅配物を追跡できるCLIツールを作った
  • 各事業者が送ってくる追跡番号を一元化できる
  • 追跡番号を登録するのも面倒なので半自動化した

takuhai

宅配便はよく届く.そしてその中の多くは追跡番号が発行されてメールなどで通知される.しかしこれには大きく次のような課題感があると思う:

  • 現在配達中の全ての宅配物の状況を見たいときに,事業者が異なる宅配物があると面倒
  • 追跡番号は大体メールで届くので,他の雑多なメールと混ざる可能性がある
  • 追跡番号が荷物ごとに別のメールで通知されると入力ページに番号をコピペする処理が煩雑

というのを一昨日に佐川急便の追跡番号通知メール[1]が来て思ったので,コマンドを叩くと追跡番号の登録,削除,対応する宅配物の状態取得などをしてくれるCLIツールを作った.今のところ佐川急便,クロネコヤマト,日本郵便に対応している.

コードはもう少し整えてから公開したいので未公開だが, コードを公開した.使用法としては例えば宅配物の登録時には

$ takuhai reg --sagawa -t 1234567890 -n 荷物

みたいな感じで--sagawaとか--yamatoとか--jpostとかで事業者を指定して(短縮フラグもあり),-tで追跡番号を指定,-nでエイリアスを張れるようになっている.エイリアスが無いと追跡番号から何の荷物であるのかが非自明で,大変なので張れるようにした.

事業者と追跡番号の指定は当然必須なのでコマンド入力時に必須の設定にしても良かったのだが,折角bubbleteaを知ったので指定が欠けていたらいい感じに入力ダイアログを出して指定できるようにした.

特定の荷物について見たかったら

$ takuhai show -t 1234567890
$ takuhai show -n 荷物

のどちらかみたいにする.この際,裏で各宅配業者に対応したHTTPリクエストが飛んで現在の宅配状況を収集する.

$ takuhai show -a

で登録されている全ての荷物の配送状況を表示する.

また,本コマンドは宅配物情報のインポート・エクスポートにも対応している.宅配物が輸送されるなら,宅配物情報もまた輸送されるのである.

takuhaiコマンドでは,自分の環境内に存在する荷物について,そのうちのいくつかを選択してエクスポートすることができる.すなわち,

$ takuhai export -n hoge -n foo -p exported.yml

のようにすることで,登録時にhogeと名付けられた荷物とfooと名付けられた荷物の情報をexported.ymlにエクスポートすることができる.

このようにしてエクスポートされたymlファイルは,他人がインポートすることができる:

$ takuhai import -p exported.yml

これにより,exported.yml内の情報が自分の環境に入る.こうした仕組みは例えば,複数人に関係がある荷物であるが,届け先は1カ所であるという場面などで,特に有用であると考える.実際,先日はやっている会社の名刺を複数人分まとめて発注したが,各人の名刺はまとめてCEO宅に届けられるため,takuhaiコマンドを用いることで各人が宅配物の配送状況を自身のペースでウォッチできるようになる.

技術スタック

Goで書いた.CLIを開発するのにcobraが有用であると聞いたので触れてみたかったからというのが大きい.そのためフレームワークとしてはcobraと,TUIにbubbleteaを用いた.特にbubbleteaは実装例が豊富で良かった.cobraもcobra-cliから雛形を簡単に作れて楽だった.

各事業者対応

作成にあたっては,追跡番号を基にして,各宅配事業者の追跡番号ページからコマンドが宅配状況を勝手に取ってこれるようにする必要がある.このため,各事業者の追跡番号ページについて,どのように追跡番号を埋め込んでどこにリクエストを投げると対応する荷物の宅配状況が知れるのかを調査する必要がある.

当然事業者側からしてみれば想定された使い方ではないのでどのようにデータがやり取りされているかをChromeのネットワークタブなどから頑張って推察して[2]コードを書いた.なので対応事業者を増やすのは普通に面倒.

登録自動化の試み

ここまででコマンドを手で叩いて追跡番号を入力すればターミナル上で宅配物の情報を一元化できるようにはなった.しかし追跡番号を打つのは面倒であり,この部分も半自動化できる余地がありそうなので試みた.ここから先どの程度自動化できるかは人によるのであくまで個人的な話.

対象

追跡番号が送られてくるメールは基本的に@gmail.comなので,本文中に追跡番号が記載されているようなものについては,適当にGASを書いて文面から内部でフィルターすることで取り出すことができる.

送り状ナンバーがメール本文中に記載されていないが頻繁に届くものとしてはAmazonがあるので,これはGAS内で別途取り出すことにした.

半自動化

いずれにせよ,追跡番号が含まれていそうなメール(文面でフィルター)とAmazonで個人的にはほとんどのケースはカバーできるように思えたので,これを定期的にフィルターして取り出すジョブを書いた.現在の実装ではローカルのファイル内に追跡対象荷物の一覧をストアしているので,やむなしで自分用のDiscordサーバー[3]にチャンネルを新設し,

  • メールの文面(エイリアスは自分で張るので文面を見たい)
  • コマンドのサジェスト(宅配事業者のフラグと追跡番号入り)

を報告させるようにした.このため,これをコピペしてエイリアスを張ればよくなった.

展望

  • ChinaPostのトラッキングをしたい.というのも「荷物が破壊されました」ステータスがコンソール上に出るのを見たい.

  • データのストア方式を見直したい.現在だとローカルなファイルにデータがストアされているので,追跡番号登録の完全な自動化には至っていない.例えばGAEにFastAPIのサーバーを立ててこれをリモートリポジトリみたいな扱いにしてローカルでfetchするというのを考えているけどfetch面倒だな...と思って渋っている.

  • エイリアスの張替えをできるようにしたい

  • GHAでcronジョブを設定しておいて適当な追跡番号を各事業者のエンドポイントに投げたレスポンスのパースに失敗しないかをチェックしたい.というのも追跡結果ページのレイアウトが変えられてしまうとそれに対応しなければならないため.

脚注
  1. ちなみにずっと真夜中でいいのに。のグッズ発送通知だった.服やらトートバッグやらエンボス加工プレートやら他にも色々が届いた. ↩︎

  2. せっかくあまり予定が無い日なのに何をしているんだろうという気持ちにはなった ↩︎

  3. 自分とbotしか入っていないサーバーがあり,様々な用途に使っている. ↩︎