読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin.Forms で Amazon Product Advertising API を使うには - コードでの URL 生成〜署名

こんにちは。エクセルソフトの田淵です。

前回のエントリーでは Amazon API を試しに使ってみるところまでを行いました。

ytabuchi.hatenablog.com

2016/7/21 時点での API 仕様です。変わる場合がありますのでご注意ください。

署名について

Scratchpad で[Run Request]ボタンからリクエストを生成した際に、[Request URL]セクションに生成された URL が表示されたはずです。[Unsigned URL]と[Signed URL]があり、例えば次のようになっています。

f:id:ytabuchi:20160721152757p:plain:w450

[Signed URL]が署名済みの URL なのですが、通常の URL にタイムスタンプと、URL をシークレットキーを使用して HMAC-SHA256 でハッシュ化した署名を追加する必要があります。署名については以下をご参照ください。

EULA に基本的には 1秒に 1回のアクセスが認められる。とあるように、沢山アクセスされては困るのでこのような処理をしているんだと思いますが、面倒ではありますね。ここからは実際にコードで URL を生成したいと思います。幸い Amazon にサンプルコードがありましたのでそれを使いましょう。

サンプルコードを見てみよう

Product Advertising API Signed Requests Sample Code - C# REST/QUERY

こちらをダウンロードして展開します。

コンソールアプリで動作を確認

AmazonProductAdvtApiSample.sln を開きます。

f:id:ytabuchi:20160721151411p:plain:w450

Mac の場合は、プロジェクトの .NET のバージョンを 4.5.1 にします。(Windows は恐らくそのまま使える?未調査です。すみません。)

f:id:ytabuchi:20160721152856p:plain:w450

変更時に警告が出る場合は OK で進みます。

f:id:ytabuchi:20160721153224p:plain:w450

ItemLookupSample.csSignedRequestHelper.cs がサンプルなのですが、そのままでは動きません。Product Advertising API の仕様が変わる前のサンプルコードのようです。正しく動くように変更していきます。

現行の仕様に合わせる

まずは現在の API の仕様に合わせて問い合わせの URL を作成する部分を変更します。

ItemLookupSample.csItemLookupSample クラスは主に以下を。

  • クラス変数を追加、変更。
    • MY_AWS_ASSOCIATE_TAGID_TYPE を追加。
    • DESTINATIONNAMESPACE を変更。
  • 上記の必要な定数を SignedRequestHelper の引数に追加。

SignedRequestHelper.csSignedRequestHelper クラスは主に以下を。

  • ItemLookupSample で引数に追加した変数を受け取れるように。
  • sortedMap Dictionary に必要事項を追加。

この時点での変更点は以下です。

github.com

これで実行してみましょう。以下の出力が得られれば成功です。

Method 1: ItemLookup Dictionary form. Title is ".NET開発テクノロジ入門2016年版Visual Studio 2015対応版"

Xamarin.Forms で動くように、PCL 対応する

では、これをそのまま Xamarin.Forms に持って行って動くか?というと動かないわけです。

うろ覚えですが、PCL の Profile 7 には System.Xml.XPath, System.Net.WebRequest, System.Security.Cryptography などの名前空間がなかったと思います。そのため、これらを別の方法で実装しなくてはいけません。

まずは以下を変更しました。

  • AmazonXml.cs を用意して、XML の受け口を用意
  • HttpClientXML を取得し、XmlSerializer でドカンとデシリアライズする

この時点での変更点は以下です。

github.com

次は PCLCrypto を使用した署名の処理に置き換えます。

  • ハッシュ化するアルゴリズムAmazonの場合はHMAC-SHA256)を決めて SecretKey を用いてhasherインスタンス
  • PCLCryptoを使用して、リクエストURLをhasherでハッシュ化して署名

この時点での変更点は以下です。

github.com

これで実行して、以下の出力が得られれば成功です。

Method 1: ItemLookup Dictionary form. Title is ".NET開発テクノロジ入門2016年版Visual Studio 2015対応版"

Xamarin.Forms で使ってみよう

ということで無事 PCL で動くようになりましたので、Xamarin.Forms アプリに組み込めば完成です(^^)

今回は Azure の Easy Table に接続するサンプルで使った関係でコードビハインドでゴリゴリですが、以下、サンプルです。

github.com

Azure の Table クラスを Task で返すように public async Task<TodoItem> Lookup(string isbn) にして、ISBN が 10桁の場合を考慮して IsbnConverter.ConvertToISBN13(isbn); だけ追加していますが、後はそのまま使っています。

こんな感じでタイトルを取得して、ListView には Title と画像と商品ページへのリンク(必要みたいだし)を入れています。

f:id:ytabuchi:20160721192536g:plain:w300

これで Amazon API も怖くないですね。AWS への問い合わせはわかりませんが、EC サイトはすべてこのように署名を追加する必要があるようです。

なお、10桁>13桁の変換は @ch3cooh 先生の PCL で動作する ISBN 10桁13桁入れ替えのコードをそのまま使わせてもらいました。ありがとうございます。

blog.ch3cooh.jp

Xamarin 気になった方は

是非 ダウンロード して触ってみてください。Visual Studio 2015 をご利用の方は Update 3 にアップデートする際にカスタムインストールで Xamarin を追加しましょう。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の導入支援サービスを始めました。ベースは基本的なアプリを一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは田淵までお問い合わせください(^^)

ytabuchi.hatenablog.com

Xamarin の情報が欲しい方はこのブログも購読いただいたり、私のTwitterアカウントをフォローいただいたりすると嬉しいです。

私が所属している エクセルソフト の宣伝を少しさせてください。弊社は開発者向けの様々なソフトウェアを扱っています。おなじみの ReSharper (JetBrains)、 や Atlassian の JIRA, Confluence、Office/PDF ファイルを .NET/Java で操作するライブラリ Aspose(アスポーズ)Windows アプリ、Web ページ、iOS/Android アプリの UI テストができる TestComplete などお勧めです(^^) また、Visual Studio Professional/Enterprise with MSDN も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。