さくらのクラウドで待望のクーポン残高取得APIが公開されましたね!!
これまではいつのまにか使いすぎてた、とか有効期限が切れてる、なんてこともあったかと思いますが、このAPIを利用すれば残高や有効期限を監視できますのでバッチリですね!!
[UPDATE] スクリプトの誤りを修正しました 2018/1/26 17:10
クーポン残高取得APIの使い方
APIドキュメントはこちらにあります。
今回はcurlコマンドを使う方法とさくらのクラウド CLI usacloudを使う方法を紹介します。
curl
コマンドを使う場合
curlコマンドで直接APIを叩く場合は以下のようにします。
$ TOKEN=APIトークン $ SECRET=APIシークレット $ ACCOUNT_ID=アカウントID $ curl --user "$TOKEN":"$SECRET" \ https://secure.sakura.ad.jp/cloud/zone/is1a/api/system/1.0/coupon/$ACCOUNT_ID
APIキー(トークン/シークレット)はコントロールパネルのAPIキー画面からコピペでOKです。
アカウントIDはアカウント画面のリソースID
というやつです。
レスポンスは以下のようになります。
{ "AllCount": 1, "CountPerPage": 1, "Coupons": [ { "AppliedAt": "2019-01-10T11:12:13+09:00", "ContractID": "111111111111", "CouponID": "xxxxxxxxxxxxxxxx", "Discount": 999999, // クーポン残高 "MemberID": "abc99999", "ServiceClassID": 50122, "UntilAt": "2019-03-31T23:59:59+09:00" // クーポン有効期限 } ], "Page": 1, "is_ok": true }
あとはこれを加工すれば良いですね。
さくらのクラウド CLI usacloud
を使う場合
usacloudにおいてもv0.18からクーポンAPIに対応しました。
usacloudの場合、アカウントIDは実行時にAPIキーに紐付いたアカウントの情報を参照して設定しますので、APIキーだけ用意すればOKです。
ということで早速試してみます。
今回はこちらのUsacloud Sandboxを利用して実行してみます。
こちらを開いて適当にウィンドウ内(黒い部分)をクリックするとusacloudが使えるようになります。
まずusacloud config
コマンドを実行してAPIキーを入力します。
デフォルトゾーン/出力タイプも聞かれますが何も入力しなくてOKです。
その後 usacloud coupon
コマンドを実行するとクーポン一覧が表示されます。
(このアカウントには有効なクーポンが適用されてないためDiscount列が表示されてませんが、本来はDiscount列に残高表示されます。)
出力をJSONにする-o json
オプションやJSONの加工が行える--query
オプションなどもありますので色々と試してみてください。
定期的にクーポン残高を取得してSlackに通知する
APIを直接叩いたりusacloudコマンドを使うことでクーポン残高の取得ができました。
次にこれを応用して定期的にクーポン残高を取得して、閾値を下回っていた場合にはSlackに通知するようにしてみます。
クーポン残高を取得してSlackに通知するスクリプト
ということでこんなスクリプトにしてみました。
#!/bin/bash # パラメータ URL=${SLACK_WEBHOOK_URL} REMAINING=${COUPON_MIN_REMAINING} # バリデーション if [[ -z "${URL}" ]]; then echo "SLACK_WEBHOOK_URL is empty. exit(2)" exit 2 fi expr "$REMAINING" + 1 > /dev/null 2>&1 RET=$? if [[ $RET -gt 1 ]]; then echo "COUPON_MIN_REMAINING is not a number. exit(2)" exit 2 fi # クーポン残高取得 DISCOUNT=`usacloud coupon --usable -o json --query 'sum([].Discount)' 2>/dev/null` if [[ -z "$DISCOUNT" ]]; then JSON="{ \"text\": \"さくらのクラウドに有効なクーポンが登録されていません。\" }" curl -s -X POST -H 'Content-Type: application/json' -d "$JSON" $URL exit 0 fi expr "$DISCOUNT" + 1 > /dev/null 2>&1 RET=$? if [[ $RET -gt 1 ]]; then echo "'usacloud coupon' command returns invalid value: '${DISCOUNT}'" exit 2 fi # 残高が閾値を下回っているか判定 if [[ "$DISCOUNT" -le "$REMAINING" ]]; then # SlackのWebHookを叩く JSON="{ \"text\": \"さくらのクラウドのクーポン残高が${DISCOUNT}円になりました。\" }" curl -s -X POST -H 'Content-Type: application/json' -d "$JSON" $URL fi
ポイントはusacloud
コマンドを実行してる部分です。
以下のように実行しています。
usacloud coupon --usable -o json --query 'sum([].Discount)'
まず--usable
オプションをつけることで、残高があり有効期限内のクーポン情報のみ取得するようにしています。
その後-o json
と--query
でクーポン残高を算出しています。
ここでは単純に各クーポン情報のDiscount
列を合計するようにJMESPathでsum([].Discount)
と指定しています。
これを適当なファイル名で保存/実行権付与して実行してみます。ここではusacloud-coupon-monitor.sh
としました。
SlackのWebhookURLは適当に取得しておきます。
$ export SAKURACLOUD_ACCESS_TOKEN=APIトークン $ export SAKURACLOUD_ACCESS_TOKEN_SECRET=APIシークレット $ export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxxx/xxxx/xxxxxxxx" # SlackのWebhookURL $ export COUPON_MIN_REMAINING=3000 # クーポン残高の閾値 $ ./usacloud-coupon-monitor.sh
これを実行するとSlackに以下のような通知が届くはずです。 (アイコンなどは適当にSlackのWebhook管理画面で編集してます)
クーポンが登録されていない/有効期限が切れた場合:
残額が閾値を下回った場合:
これでうっかりクーポンの有効期限切れ/使いすぎを防げますね!
あとはこれをcronなりlaunchdなりに登録して毎日実行するようにすればOKです。
終わりに
今回はクーポンAPIを試してみました。
今回のスクリプトでは期限が切れたら or 残額が閾値を下回ったら通知をしていますが、 少し工夫すれば有効期限が残りn日になったら通知、といったこともできると思います。
usacloudではjson以外にもcsvやtsv、Goテンプレートによるカスタム出力にも対応してますのでお好みの方法で色々試してみてください。
以上です。