RPAの本質を見極めて「業務プログラマ」を育成すべし
Shopify Webhookが複数回飛んでくる等のナゾ
Shopifyとkintoneを連携させて軽量なMAができる環境を構築している。
Shopifyの購買データをkintoneに連携したり、kintoneで追加した顧客や商品データをShopifyに同期するなどをお互いのAPIを使ってやり取りしている。
Shopifyは顧客や注文のイベントが発生するタイミングでWebhookを発火するので、これを拾ってkintoneに登録する。
ShopifyのWebhookを使っていて一部ナゾ的な動きがあるのでまとめてみる。
- 同一IDのWebhookイベントが複数回発行される
- 1、2分おきに3回ほど同一のWebhook(例えばorder/create)が呼ばれる
- イベントの時系列は保証されない
- order/createが呼ばれてからのorder/paidが呼ばれる、と思っていたがどうやら順不動でくるよう
Shopifyのドキュメントを読むと上記は仕様のようだ。しかも「Webhookの発行自体が保証されないので定期的に不整合ができていないかチェックしてね」とも書いてあった。
ということで、一度テンポラリのWebhook置き場を設けて、そこを定期的に見に行くような仕組みが必要そうになった。
また一定期間でShopifyとkintoneの不整合部分を監視するような仕組みも必要ですね。
DBは増やしたくないので、上記2個ともkintoneのアプリを使ってできないかお試し中。
この辺りのベストプラクティスが知りたい。
Shopify APIで商品登録
Shopify熱いですね。
当社では顧客や在庫、商品などの管理情報はkintoneで管理してそれをShopifyに連携するケースが多いです。
今回はkintoneで商品登録(編集)されたデータをShopifyに反映する機能をPython/JSで実装しました。
動作としては、kintoneの商品登録アプリが変更されるとWebhookがAWS API Gatewayに飛んで、そこからShopifyのAPI経由で商品を登録(編集)します。
Shopifyの商品登録において価格情報はvariantというオブジェクトに登録する必要があります。
ですので、一旦Productオブジェクトで新規の商品を作って、variantに価格をセットしてアップデートします。(これ、ワントランザクションでできる方法知ってる方いましたがプリーズ教えてください)
EventBridge経由で受けたShopifyのWebhookはVerifyすべきか
結論としては「不要」とのことです。
APIGatewayとEventBridge経由のLambdaのeventの中身が異なっており、APIGatewayで受け取ったbody部分がEventBridge経由は別物(payload)となっており、そもそも検証できずハマっていたところ、下記の回答を見つけることができました。やれやれ。
Just wanted to provide an update to this issue.
There is no need to validate HMAC with EventBridge. Only Shopify is able to produce events into the partner event source that you would have configured in the App Setup for your app.For anyone still doing the validation and having issues with some webhooks, we’re currently trying to resolve an issue with Amazon and json encoding that in some cases causes an issue with the generated HMAC.
It’s best to simply remove HMAC validation for EventBridge and Pub/Sub deliveries as these are both considered trusted delivery channels. Only HTTP webhooks require HMAC validation.
https://community.shopify.com/c/shopify-apis-and-sdks/amazon-eventbridge-webhook-verification/td-p/891705
Shopify APIのトークンを取得するまで(2021/9 Python版)
kintoneを情報基盤にした業務効率化支援をしていますが、最近業務効率化のその先にある「売上向上」を目的としたkintone活用の相談が増えてきています。
今回のクライアントは今流行りのEコマースSaaSである「Shopify」とkintoneを連携させて、顧客と商品管理をkintoneとShopify間で同期させたい、ということでした。
kintoneとShopifyには豊富なAPIが用意されており、いつもの通りAWSを中間サーバーにすれば要望の機能が果たせそうです。
今回は事前調査としてShopifyのストアにカスタムアプリを導入してそのカスタムアプリを通じてデータをIN/OUTしてみましたが、最初のOAuth認証部分が想像より大変だったので今後のためにもメモしておきます。公式ドキュメントなどそこそこ文献は揃っていましたがバージョンが古かったりして手こずりました。
また認証はできたものの、謎の動きの理由が残ったままなので継続調査が必要です。とりあえずトークンだけ取れればいい、という場合は以下の手順を参考にして下さい。
Shopifyアプリの作成
shopify-cliというコマンドラインでShopifyを操作できるツールをインストールします
$ brew install shopify-cli
カスタムアプリを作成します
$ shopify node create
この時点でShopify PartnerのWeb管理画面には作成したアプリが表示されているのでそのAPIキーとAPIシークレットをメモしておきます
作成されたプロジェクトフォルダに移動します
$ cd test-app
$shopify node serve を実行して認証用のコールバックサーバNGROKを起動します
NGROKはローカルに仮のSSLコールバックサーバを立ててくれるサービスです(雑な説明)
Do you want to update your application url? はYes と回答します
To install and start using your app, open this URL in your browser:
https://6972-240f-74-2d17-1-3927-87d0.ngrok.io/auth?shop=xxxx.myshopify.com
上記の表示が出るので、開発ストアにインストールします。
そうすると自動的にWebの管理画面のリダイレクトURL欄にNGROKのURLが登録されています(便利ですね)
OAuth認証の用意が整ったのでトークンを取得します。
トークンはPythonのShopify APIを利用します。
https://github.com/Shopify/shopify_python_api/blob/master/README.md
$ pip install –upgrade ShopifyAPI
Python
shopify.Session.setup(api_key=API_KEY, secret=API_SECRET)
state = binascii.b2a_hex(os.urandom(15)).decode(“utf-8”)
redirect_uri = “https://xxxxxxxx.ngrok.io/auth/callback”
scopes = [‘read_products’, ‘read_orders’]
newSession = shopify.Session(shop_url, api_version)
auth_url = newSession.create_permission_url(scopes, redirect_uri, state)
print(auth_url)
上記を実行して表示されたURLをブラウザから実行して、ユーザー認証します。
どハマりポイント1
このままいけばURLにcodeが表示されるはずなのですが、何回かリダイレクトした後NGROKの画面はきちんと出てくるものの肝心のcodeが取得できません。色々試行錯誤した結果、NGROKを落とした状態で再度ユーザー認証すると途中でリダイレクトが終わってcodeが取得できました。。。
どハマりポイント2
やっとcodeが取れたのであとはトークン取得するところでまたまたエラーとなってしまいました。
Python
access_token = session.request_token(request_params) # Error
どうやらaccess_token = session.request_token(request_params)の関数の中でパラメータ(code / timestamp / hmac)のverifyがうまくいっていない模様です。
そこで、こちらのドキュメントにPOSTで取得する方法が載っていたのでやってみると。。。
https://shopify.github.io/shopify_python_api/
POST https://SHOP_NAME.myshopify.com/admin/oauth/access_token
with the following parameters:
client_id – Required – The API key for your app
client_secret – Required – The shared secret for your app
code – Required – The code you received in step 3
Python
url = “https://{}.myshopify.com/admin/oauth/access_token”.format(shop_name)
_header = {“Content-Type” : “application/json”}
PARAMS = {“client_id”:API_KEY, “client_secret”:API_SECRET, “code”:code}
resp = requests.post(url, headers=_header, json=PARAMS)
r = json.loads(resp.text)
at = r[“access_token”]
見事トークンが取得できました!
取得できたはいいものの何故動いているかが分からないので、ちょっとこのままでは使えそうにないです。継続調査が必要ですね。どなたかわかる方いれば〜〜。
なお、実ストアへのインストールは管理画面から「マーチャントインストールリンク」を発行して、ストアのアカウントでログイン後、このリンクでインストールを承認します。パートナーでログイン中のブラウザでこれをやろうとするとエラーになるので、ブラウザをあたらに起動して実行します。
参考にしたURL
https://dev.classmethod.jp/articles/shopify-with-eventbridge/
https://shopify.github.io/shopify_python_api/
kintoneのコメントをTeamsに連携する
sam build –use-container でResolveDependenciesエラー
sam build –use-container をすると下記のエラーが発生。
Running PythonPipBuilder:ResolveDependencies
Error: PythonPipBuilder:ResolveDependencies – {protobuf==3.17.1(wheel)}
protobufのリリース履歴を確認しつつrequirements.txtで指定するバージョンを下げたら
キントーンの受注データをマネーフォワードへ連携する(kintone to Moneyfoward)
VSCodeのAWS Toolkitで特定のパッケージが読み込めなくなってしまったメモ
エラー内容Building SAM application…Running command: (not started) [/usr/local/bin/sam build –build-dir /tmp/aws-toolkit-vscode/….Building codeuri: . runtime: python3.8 metadata: {} functions: [‘funcname’]Running PythonPipBuilder:ResolveDependenciesBuild FailedError: PythonPipBuilder:ResolveDependencies – {python-docx==0.8.10(sdist)}
ビルドsam build –use-container[–use-container] が超ポイント。Docker コンテナ内でビルドをしてくれるようになる。ローカル実行sam local invoke funcnameデプロイsam deploy -g