🐱
Feeds API(SP-API)用 FileMaker cURLオプション作成カスタム関数
はじめに
こちらの記事で紹介した $cURLoption
を作成するスクリプト、
これを、コピペすれば済むようにカスタム関数化したコードを紹介します。
あくまでも Feeds API 用ですので、他の例えば Catalog Items API などでは使用できません(正規リクエストの作り方が違う為です)。
本題
必要な引数は7つあります。
- AccessKey
- SecretKey
- AccessToken
- HTTPMethod
- CanonicalUri
- SignedHeaders
- requestBody
それぞれの引数の詳細は、前述の記事で確認して下さい。
一つ注意点として、算出されるcURLオプションは POST の場合、
--request "POST"
--header "Authorization: AWS4-HMAC-SHA256 Credential=××××××××××/20230412/us-west-2/execute-api/aws4_request,SignedHeaders=content-type;host;x-amz-access-token;x-amz-date,Signature=××××××××××"
--header content-type:application/json
--header host:sellingpartnerapi-fe.amazon.com
--header x-amz-access-token:××××××××××
--header x-amz-date:20230412T043015Z
--data "@$requestBody"
といったように、変数名 $requestBody
でリクエストしますので、 変更したい場合はカスタム関数内の名称を修正して下さい。
それでは、カスタム関数 func.Feeds.cURLoption
のコードです。
//func.Feeds.cURLoption ( AccessKey ; SecretKey ; AccessToken ; HTTPMethod ; CanonicalUri ; SignedHeaders ; requestBody )
Let (
[
~AccessKey = AccessKey ;
~SecretKey = SecretKey ;
~AccessToken = AccessToken ;
~HTTPMethod = HTTPMethod ;
~CanonicalUri = CanonicalUri ;
~SignedHeaders = SignedHeaders ;
~requestBody = requestBody ;
//~CanonicalRequest(手順 1: 正規リクエストを作成する)
//~x_amz_dateは、株式会社フルーデンス 小巻さんの関数を利用させて頂いています。
~x_amz_date = Let (
[
~timestamp_local = Get ( タイムスタンプ ) ;
~timestamp = GetAsTimestamp ( Int ( Get ( 現在の時刻 UTC ミリ秒 ) / 1000 ) ) ;
~date = GetAsDate ( ~timestamp ) ;
~dateY = Year ( ~date ) ;
~dateM = Right ( "0" & Month ( ~date ) ; 2 ) ;
~dateD = Right ( "0" & Day ( ~date ) ; 2 ) ;
~time = GetAsTime ( ~timestamp ) ;
~timeH = Right ( "0" & Hour ( ~time ) ; 2 ) ;
~timeM = Right ( "0" & Minute ( ~time ) ; 2 ) ;
~timeS = Right ( "0" & Seconds ( ~time ) ; 2 )
] ;
~dateY & ~dateM & ~dateD & "T" & ~timeH & ~timeM & ~timeS & "Z"
) ;
~CanonicalHeader = Substitute ( ~SignedHeaders ;
[ ";" ; ¶ ];
[ "content-type" ; "content-type:application/json" ];
[ "host" ; "host:sellingpartnerapi-fe.amazon.com" ];
[ "x-amz-access-token" ; "x-amz-access-token:" & ~AccessToken ];
[ "x-amz-date" ; "x-amz-date:" & ~x_amz_date ]
) ;
~HashedPayload = Lower ( HexEncode ( CryptDigest ( ~requestBody ; "SHA256" ) ) ) ;
~CanonicalRequest = Substitute ( ~HTTPMethod & ¶ & ~CanonicalUri & ¶ & ¶ & ~CanonicalHeader & ¶ & ¶ & ~SignedHeaders & ¶ & ~HashedPayload ; ¶ ; Char ( 10 ) ) ;
//~HashedCanonicalRequest(手順 2: 正規リクエストのハッシュを作成する)
~HashedCanonicalRequest = Lower ( HexEncode ( CryptDigest ( ~CanonicalRequest ; "SHA256" ) ) ) ;
//~StringSign(手順 3: 署名文字列を作成する)
~StringSign = Substitute ( "AWS4-HMAC-SHA256" & ¶ & ~x_amz_date & ¶ & Left ( ~x_amz_date ; 8 ) & "/us-west-2/execute-api/aws4_request" & ¶ & ~HashedCanonicalRequest ; ¶ ; Char ( 10 ) ) ;
//~CalculateTheSignature(手順 4: 署名を計算する)
~hmacSigning = CryptAuthCode ( "aws4_request" ; "SHA256" ;
CryptAuthCode ( "execute-api" ; "SHA256" ;
CryptAuthCode ( "us-west-2" ; "SHA256" ;
CryptAuthCode ( Left ( ~x_amz_date ; 8 ) ; "SHA256" ; "AWS4" & ~SecretKey )
)
)
) ;
~CalculateTheSignature = Lower ( HexEncode ( CryptAuthCode ( ~StringSign ; "SHA256" ; ~hmacSigning ) ) ) ;
//~auth
~auth = "AWS4-HMAC-SHA256 " &
"Credential=" & ~AccessKey & "/" & Left ( ~x_amz_date ; 8 ) & "/us-west-2/execute-api/aws4_request," &
"SignedHeaders=" & ~SignedHeaders & "," &
"Signature=" & ~CalculateTheSignature ;
//~cURLoption
~cURLoption = List (
"--request " & Quote ( ~HTTPMethod ) ;
"--header " & Quote ( "Authorization: " & ~auth ) ;
"--header " & Substitute ( ~CanonicalHeader ; ¶ ; ¶ & "--header " ) ;
Case ( not IsEmpty ( ~requestBody ) ; "--data " & Quote ( "@$requestBody" ) )
)
];
~cURLoption
)
おわりに
うんざりする位長いですが、いかがでしょうか。
分かりやすいように、手順ごとに段階を分けたコードにしましたので、もし他のAPIにも応用したい方は、頑張って修正してみて下さい。
試していませんが、手順1の正規リクエスト作成の箇所を変えるぐらいだと思います。
それでは
Let's enjoy FileMaker!
Discussion