2018年7月27日金曜日

afterShip を利用して配送物の状態を調べる LogicFlow

大人の都合(?)もあり、配送されているものが今どういった状況化を調べるのに、どういったやり方がいいかなというのを探していた最中に、面白いサービスを見つけたので利用してみました。afterShip というサービスで、色々な配送業者から情報を取得することができるサービスです。今回は Flow のボタントリガを使って、自分に届く荷物が今どんな状態なのか調べるものを作ってみました。

1.下準備

afterShip のサイトを開くと次のように表示されます。

image

afterShip は月間で扱う荷物量によって、必要となるライセンスが異なります。月間 100 個の荷物であれば、無償アカウントで対応が可能で、それを超える場合は有償ライセンスや、別途相談という形を採用しています。ちょっとした EC ショップなどであれば、無償の範囲でも有効だと思います。

アカウントは右上の SignIn から作成します。

image

新規の場合は、一番下にある Create Account をクリックします。

image

するとこのように表示が変わりますので、氏名とメールアドレス・パスワードを指定して Create Account をクリックします。

image

無事にアカウントが作成できログインできると、上の画面に変わります。API を利用しないのであれば、この画面から荷物の問い合わせ番号を入力して状況を確認したり、現在登録されている荷物全体の状況を俯瞰したりすることになります。

2.最終的に作成する LogicFlow

今回は提供されている API を利用して、LogicFlow から荷物の状況を取得する、ということをやってみます。最終的な LogicFlow は以下のようになりました。

image

縦に長いですが、大まかにいうと

  1. 荷物の登録
  2. 荷物の状況取得
  3. 荷物の削除

となります。各工程で利用する API については、afterShip サイトにて開発者向けドキュメントも用意されていますので、そこを参照します。通常利用であれば、荷物を登録して状況確認したといっても、削除を行う必要はありません。業務であれば「配達完了した」「相手がいなくて持ち戻った」など、配達が終了する状態になってはじめて削除することが多いとは思いますが、今回は「最初に必ず登録を行う」ように処理を考えたため、最後に削除を行う形にしています。登録済みの荷物の場合、そこでエラーになりますがそのエラー処理を盛り込もうとすると、ちゃんと考えないといけないな、と思ったのでお試しでやっている今では行っていません。

開発者向けドキュメントの方には、状況によって戻されるステータスについても解説があるので、そこを見て処理を作るのがよいと思います。

image

3.API キーと配送会社情報の準備

さて利用するには、上記の流れに沿って API キーを準備する必要があります。初期状態で一つ用意されていますので、今回はそれを利用しています。サインイン後に表示されるマイページ的なところから、一番左下にある設定アイコンをクリックすると確認できます。

image

この API キーは、API を呼び出す際に必要になりますので、どこかにメモしておきます。

次に、API で配送会社を指定するために必要な情報を準備します。これは afterShip のサイトで Courier をクリックすると、対応している配送会社一覧が表示され、その中に Download Courier List とリンクが用意されていますのそれをクリックします。

image

今回はここで入手した配送会社の情報は、Excel 上に保持させて OneDrive に保存、LogicFlow 実行時にはその Excel から API 用の配送会社コードを取得するようにしています。業務で使うのなら、どこかの DB とかストレージ、今なら cosmosDB がいいかもしれません。

image

ダウンロードしたファイルは CSV 形式ですので、Excel で開きテーブルとして設定します。このファイルでいう左側の項目(Courier Slug)が API に渡す際に必要となる配送会社のコードのようなものです。本来であればこのように全件持つ必要はなく、自分が必要な配送業者に限定しておくのがよいと思います。

image

afterShip 側でも、必要となる業者を設定画面から登録しておく必要があります。基本は、ここで選択されている業者の情報が取得できる対象となります。

4.LogicFlow の作成

ここから実際に LogicFlow を作成していきます。今回はボタントリガを利用して、スマホから問い合わせをしたかったのもあり Flow を利用していますが、別のトリガを利用するのであれば Logic Apps でも問題ありません。

image

最初のボタントリガはこのような形で作成しました。送り状の番号と、利用した業者を選択させます。この時、業者の日本語での名称と英語名称を併記していますが、これはこの英語名称をもとに先に準備していた Excel シートから、API で利用するコードを取得させたいためです。

image

次に、今回の LogicFlow では何度か API 呼び出しを行いますので、API キーをあらかじめ選ぶだけで利用できるように「作成」アクションで定義しておきます。

そして Excel ファイルから配送会社を抽出するのですが、今回は全件取得してその結果に対してフィルタリングをかける、という方法を利用しています。Excel コネクタのアクションで 行を取得する というのがあるのでこれでいいかな?、と思い試してみたのですがうまくいかなかったので苦肉の策です。Flow であれば課金には影響しないので問題ありませんが、Logic Apps の場合は 1 アクション増やしてしまっているので、そこは注意が必要です。

今回利用している Excel コネクタのアクションでも、OData クエリとして抽出するデータの条件を指定できますので、それを利用するのもよいかと思います。

image

フィルタリングを行っているのは、このような条件で行っています。

split(triggerBody()['text_1'], ':')[1]

上記のように関数を指定して、Excel 上の配送業者名(Courier Name)が一致するものに絞り込みを行っています。ここで Split 関数で文字列を分割しているのですが、その時に利用しているのがボタントリガで選択させようとしていた、配送業者の日本語名と英語名を並列で表記しているものです。日本語名:英語名、として表示しているので:で分割を行い、0:日本語名、1:英語名という配列に分割しています。

image

その結果を見て、該当したデータがあったかどうかをこのような形で聞いています。

length(body('指定した配送会社を抽出'))

フィルタさせた結果に length 関数で、分割した結果の配列数を取得しています。対象が拾えた場合は、日本語名と英語名が拾えているので 2 となりますし、対象がなかった場合は 0 となります。

image

Excel から取得できた結果から、API に必要な配送会社コード(Courier Slug)を定義させています。

last(body('指定した配送会社を抽出'))?['Courier Slug']

ここでは last 関数を利用していますが、これは先にフィルタリングした結果が「(万が一)複数存在した場合」を考えてしまったこともあり、取得できた結果が何件であってもその最後の結果から拾えば大丈夫だろう、という考えに基づいています。実際には 1 件しかないのでこのように書かなくともよいのですが、その場合は

body('指定した配送会社を抽出')[0]?['Courier Slug']

のような形で書く必要があります。個人的に配列の最初の値を表す [0] の部分が好きではない、という理由もあります(

image

いよいよ API を呼び出す部分です。afterShip の開発者ドキュメントにあるように、荷物を登録する際には POST で必要な情報(配送会社、送り状の番号)を JSON 形式で付与して呼び出しを行います。

ヘッダ情報として、API キーと Content-type を指定するのも必要です。ここが誤っていると 403 エラー(認証エラー)となります。

image

API で登録した際に、afterShip 側から返却された結果を分析して、後で利用する ID 情報を拾えるようにします。ここは開発者ドキュメントでサンプルのレスポンス情報が記載されているので、その値をもとに JSON スキーマを生成します。

その後に 20 秒待機させていますが、これは afterShip に荷物を登録しても、すぐにはその情報が反映されないためです(登録後 afterShip 側で現在の荷物状況を取得しに行っているため)。少し時間を空けることで、最新状況を取得できます。

image

少し時間を空けたら、最新の状況を取得します。この時の URL に id という値を利用していますが、これが登録時の結果に含まれている値で、API を呼び出す際に URL に含めてあげることで「この荷物の情報を~」といった指定が簡単に行えるようになっています。REST 形式ってやつですね。API としては ID 値でなくとも、配送会社コード(Courier Slug)と送り状番号を含んだ形の URL にも対応しているので、ここはどちらでも構いません。私の場合は、二つの値を含ませるのが面倒だったので ID 値一つだけ利用するようにしています。

最新状態を取得できたら、その中の tag という値に最終状況が設定されています。これは afterShip サービス上で統一した値が設定されるようになっており、本来では配送会社ごとに異なる状態(日本語で配達中となっていたり、英語で delivering となっていたり)なのですが、それを意識したくなかったため、ここ値を利用しています。

配送業者ごとの値でもよい場合は checkpoint という配列で細かい詳細状況が返却されていますので、この配列の最新(一番最後のもの)を参照すればよいでしょう。

image

最後に、今回問い合わせた荷物の情報を DELETE 形式で API を呼び出し、afterShip サービスから削除しています。ここで削除しなかった場合は、afterShip のサイト上で荷物情報を確認できる状態のままとなっています。そして次に同じものを登録しようとしたときに、エラーとなりますのでこのあたりの組み立ては、ちょっと注意してください。

image

ここまでくみ上げると、ボタントリガで入力した送り状番号と配送業者をもとに、現在どうなっているかを afterShip サービスで検索、その結果をスマホにプッシュ通知といった LogicFlow が完成です。

API を利用しているので複雑なようにも感じられますが、今回のケースのようにそこまで複雑ではないものも世の中のサービスにはたくさんあります。そういったものを Logic Apps や Flow から呼び出してみて、いろいろなものをつなげてみてください。それが iPaas と呼ばれるサービスの得意分野となります!

0 件のコメント:

コメントを投稿