Amazon Product Advertising API 確認のチャンス2009年07月28日 01:22

アマゾンの Product Advertising API を利用するにあたり、
8月15日までに電子署名認証に対応しなきゃ!
ってことで、対応作業におおわらわだった方も多いと思います。

ワタクシいたがきもそのひとりでしたが。

PHP5での対応は、関数やフレームワークが充実しているおかげで難なく済み、
VBAでの対応も無事に済みました。
(http://itagaki.asablo.jp/blog/2009/06/19/4376804)

さて、アマゾンさんは、対応の確認のために二段階のメンテナンスを行うことを発表しました。

●第一弾
8月4日(火)午前3時~5日(水)午前3時
電子署名の含まれないリクエスト5つのうち1つは処理されない

●第二弾
8月11日(火)午前10時~12時
電子署名の含まれないリクエストは処理されない

そして8月15日からは、電子署名の含まれないリクエストは一切処理されなくなるわけです。

一応、現状でも、正しいシークレットキーで電子署名を作ってリクエストした場合にはちゃんと処理され、わざとシークレットキーを間違ったものにしてリクエストしてみた場合には処理されなくなるので、正しく対応できているはずでありますが、念のため、上記のメンテナンス時には、予期せぬエラーなどがないか確認してみるつもりです。

VBAでAmazon Pruduct Advertising API 署名認証2009年06月19日 20:06

Amazon アソシエイト Web サービスが「Product Advertising API」という名前に変わりました。

今回は名前が変わっただけでなく、「リクエストに認証のための電子署名を含める」ことが必要に。

そのために必要な技術要素は:

・ISO8601形式でのGMTでのタイムスタンプ作成
・パラメーターのバイト順での並べ替え
・SHA-256ハッシュ値生成
・HMACでのメッセージ認証コード生成
・BASE64エンコード
・URLエンコード(パーセントエスケープ)

これらをひとつひとつ実装して組み合わせればいいわけですが、
Visual Basicだと、これがまあ、いちいち面倒くさい・・・。
PHPとかならたぶん何の苦労もないんでしょうけどね。

でもやるしかない。


最も面倒なのがSHA-256。
これは結局、Phil Fresle さんのクラスモジュールを流用させてもらいました。

コチラ↓
http://www.frez.co.uk/freecode.htm#sha256
(SHA-256 Digest - VB and VBScript (ASP) versions)

ただし、そのままでは7bit ASCII以外のデータを処理できないため、
ほんの少し改造する必要がありました。
(ここでかなりはまった・・・)


次はHMAC。

HMACとは:
http://www.ipa.go.jp/security/rfc/RFC2104JA.html

なんだか難しげに書いてありますが、手続きとしてはカンタンなことで、
要は、秘密鍵の文字列と定数とをXORをかけたのをメッセージに
くっつけつつ、ハッシュ(今回はSHA-256)を二重にかけてやるだけ。


あとは、BASE64やら、URLエンコードやら、ソーティングやら、
面倒くさいけれども単純なことだけです。
ビール的飲料をあおりながら一気に書き上げました。

あ、ソーティングとかはちょっと人のコードを拝借しましたが :-p


こうして、VBAで生成した電子署名付きリクエストが無事に
これまでどおり通るようになりましたとさ。

めでたしめでたし。


アマゾンの電子署名認証へのVisual Basicでの対応でお困りの方へ♪
Excel VBAのサンプルコードを有償でご提供します。
連絡可能なeメールアドレスを添えてコメント欄でご連絡ください。

(追記)
既存のVBAコードへのアマゾン署名認証対応作業も承ります♪

(追記 2009年08月23日)
提供サンプルコードはAccessでも使えます♪

FizzBuzzに挑む - C編2009年04月07日 05:06

FizzBuzzプログラミングに挑んでみますた。

まずはCで!

考えに考えて、89文字でプログラムを成立させ、堂々の58位(56位タイ)にランクインしましたよ!

http://golf.shinh.org/p.rb?FizzBuzz#C

どうだ!

つか、これ以上削れないだろう!というところまで考えたとゆーのに、58番目なのか。

1位のひとはなんと73文字でプログラムを成立させているらすい・・・。
いったい、どうやって??

PHP4 で fputcsv2007年12月24日 04:28

PHP 4 には fgetcsv はあるが、なぜか fputcsv は無い。

(PHP 5 には両方ある)。

無いものはしょうがないので作りましたよ。

っていうか、ずっと前に書いてあったこのコードを、このブログの事始めに使ってみた。
function fputcsv_php4($handle, $fields)
{
    $new_fields = array();
    foreach ($fields as $value) {
        $value = str_replace('"', '""', $value);
        if (preg_match('/[,"\s]/', $value)) {
            $value = '"' . $value . '"';
        }
        $new_fields[] = $value;
    }
    return fputs($handle, implode(',', $new_fields) . "\n");
}
PHP 5 の fputcsv のパラメータ delimiter と enclosure については、さしあたり要らなかったのでざっくり省略しちゃっております。

(追記)
delimiter と enclosure にも対応しているコードはこちらにありました。