🐱

Feeds API(SP-API)用 FileMaker cURLオプション作成カスタム関数

2023/04/12に公開約4,000字

はじめに

こちらの記事で紹介した $cURLoption を作成するスクリプト、
https://zenn.dev/ontherocks_plz/articles/00667ffaccf9e2
これを、コピペすれば済むようにカスタム関数化したコードを紹介します。

あくまでも 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

ログインするとコメントできます