Excelで蔵書リストを作りたい。
多いといっても数千冊の蔵書、改善されたといってもウェブ画面よりExcelが断然入力しやすいし、既存ウェブサービスはAmazonにない本を登録できないという残念仕様により不可。
昔作った Amazon Advertising API でISBNから本の情報を取得するVBAプログラム、署名が必要になったAPI仕様変更に対応できずお蔵入りしてたけどホコリを払って再挑戦した。はぁ~めんどかった。
みんな苦労してるようで、いろんな方のブログ等に助けられました。ありがとうございます。一式揃ってすぐ動く、というコード・説明は見当たらなかったので、ここにまとめてみます。
https://github.com/anarchiStraw/excel/blob/master/BookList.xlsm
bas単体も置きました。2010でないバージョンでもインポートすれば動くと思います(未確認)。
ただし、使うためにはAmazon.comのアカウント、アフィリエイト・タグが必要です。
、、、説明どころが思い当たらない、、、質問がもしきたら答えよう。
いちおう、AmazonへのリクエストURL生成箇所だけ載せておきましょう。
期待した結果が得られないときはイミディエイト・ウィンドウに出力されるURLをブラウザで見てみるといいです。
多いといっても数千冊の蔵書、改善されたといってもウェブ画面よりExcelが断然入力しやすいし、既存ウェブサービスはAmazonにない本を登録できないという残念仕様により不可。
昔作った Amazon Advertising API でISBNから本の情報を取得するVBAプログラム、署名が必要になったAPI仕様変更に対応できずお蔵入りしてたけどホコリを払って再挑戦した。はぁ~めんどかった。
みんな苦労してるようで、いろんな方のブログ等に助けられました。ありがとうございます。一式揃ってすぐ動く、というコード・説明は見当たらなかったので、ここにまとめてみます。
完成品
マクロを含むExcel(2010)ファイルをGithubで公開しています。ISBNを入力してマクロを実行するとタイトル等をAmazonから取得して書き出します。好きに使ってください。https://github.com/anarchiStraw/excel/blob/master/BookList.xlsm
bas単体も置きました。2010でないバージョンでもインポートすれば動くと思います(未確認)。
ただし、使うためにはAmazon.comのアカウント、アフィリエイト・タグが必要です。
- Amazon.com(米国)にアカウント作成。日本とは別管理なのでややこしい。https://affiliate-program.amazon.com/
- 続けて Affiliate account を作る。WebサイトのURLや用途、どう収益をあげるつもりか、とか聞かれるけど適当に答える。
- VBAエディタでmainモジュールを開き、アクセス・キー、シークレット・アクセス・キー、アフィリエイト・タグ を自分のものに書き換える。
お世話になったページ
みなさまありがとうございます。- VBAからAmazon Product Advertising API - 来月から本気出す。
必要な情報源がリストアップされています。おかげで以下のページにたどりつけました。 - 【Access】vbaでhmacが正しく計算できた!! - プラプラ式技術系 Access流!
困りごと(SHA256での署名作成)どんぴしゃのソースコード。ほぼそのまま取り込み。hmacがクリアできれば、AccessVBAからamazonのapiが使えると思います。
が私には高いハードルでその後半日かかりました、、、。
(あと、base64エンコード、URLエンコード等の情報はネットで入手できます。) - スーの道具箱/VBでハッシュを求める
SHAのハッシュ値を計算するモジュール。ほんとありがたい。そのままコピーさせていただきました。 - How do I base64 encode a string efficiently using excel vba - StackOverflow
Base64エンコードのソースコード。Stringを受け取って関数内でバイト配列を作っていますが、2の関数からは16進数が返るので、16進数からバイト配列を作って渡すように変えました。 - 日本語URLをExcelで手軽にURLエンコードする方法 - Colo-ri.jp
URLエンコードのソースコード - VBA XMLデータをDOMで扱う方法 - smilejapan.net
DOMのとっかかり。 - Signed Requests Helper - Amazon.com
リクエストしたいURLから、署名対象文字列、署名、署名付きURLを生成してくれる。検算用に。
ソースコード、ちょっと説明
main、SHA、testの3モジュールあって、使うのは main.setBookInfo です。、、、説明どころが思い当たらない、、、質問がもしきたら答えよう。
いちおう、AmazonへのリクエストURL生成箇所だけ載せておきましょう。
期待した結果が得られないときはイミディエイト・ウィンドウに出力されるURLをブラウザで見てみるといいです。
' asinに対するデータ取得URL
' optional引数はテスト用。
' 実際使うときは yourAccessKey, yourSecretKey, yourAssociateTag を正しい値に書き換えてください。
Function signedUrlFor(asin As String, _
Optional accessKey As Variant, Optional secretKey As Variant, _
Optional associateTag As Variant, Optional timestamp As Variant) As String
Dim endpoint As String
endpoint = "ecs.amazonaws.jp"
Dim path As String
path = "/onca/xml"
Dim params As String
params = "AWSAccessKeyId=" & IIf(IsMissing(accessKey), "yourAccessKey", accessKey) _
& "&AssociateTag=" & IIf(IsMissing(associateTag), "yourAssociateTag", associateTag) _
& "&ItemId=" & asin _
& "&Operation=ItemLookup" _
& "&ResponseGroup=ItemAttributes" _
& "&Service=AWSECommerceService" _
& "&Timestamp=" & urlEncode(IIf(IsMissing(timestamp), Format(Now, "yyyy-mm-ddThh:MM:ss+0900"), timestamp)) _
& "&Version=2011-08-01"
Dim stringToSign As String
stringToSign = "GET" & vbLf & endpoint & vbLf & path & vbLf & params
signedUrlFor = "http://" & endpoint & path & "?" & params _
& "&Signature=" & getSignature(stringToSign, IIf(IsMissing(secretKey), "yourSecretKey", secretKey))
Debug.Print signedUrlFor
End Function
けっこうな数の本の情報をまとめて欲しいと知り合いに頼まれて
返信削除途方に暮れていたので、ほんとに助かりました!!
ありがとうございました。