使用Powershell从Amazon获取图书元数据



我想使用亚马逊产品广告API创建一个带有Powershell的Web请求,该请求提交ISBN/ANSI编号并返回图书元数据。(标题,作者,…)

到目前为止,我已经创建了一个帐户来获取AssociateTag、AWSAccessKeyId和AWS密钥。有了这些信息,我可以在测试页面上创建一个签名的WebRequest,它非常完美。http://associates-amazon.s3.amazonaws.com/scratchpad/index.html

现在我的问题是,如何用Powershell创建这个WebRequest,并用我的Sec密钥对"要签名的字符串"进行签名

文件http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/rest-signature.html显示,我们需要生成一个HMAC-SHA256哈希密钥,该密钥将添加到WebRequest中。但我没能创建这样一个散列。。。

**
$AwsSecKey = "1234567890"
$string = "GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=I
temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview
s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&
Version=2009-01-06"
$hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha.key = [Text.Encoding]::ASCII.GetBytes($key)
$signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($string))
$sig = [string]::join("", ($signature | % {([int]$_).toString('x2')}))
**

希望有人能帮我。。。

谢谢,Andreas

除了latkin的注释外,您还应该用换行符构建字符串,否则您的签名将与亚马逊的签名不匹配。下面是一个我在亚马逊产品Scatchpad上匹配签名的例子。

$amazonserver="webservices.amazon.com"
$linebreak="`n"
$AWSAccessKey = "2345678"
$AssociateTag = "1234567" 
$secretkey = "1234567890"
$url = "/onca/xml"
$ItemID = "0679722769"
$timestamp = "2012-10-19T15%3A34%3A33.000Z"
$urlparams = "AWSAccessKeyId=" + $AWSAccessKey + "&AssociateTag=" + $AssociateTag + "&Condition=All&IdType=ASIN&ItemId=" + $ItemID + "&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers&Service=AWSECommerceService&Timestamp=" + $timestamp + "&Version=2011-08-01"
#write-host "Urlparams=$urlparams"
$stringtosign="GET" + $linebreak + $amazonserver + $linebreak + $url + $linebreak + $urlparams
#write-host "stringtosign=$stringtosign"
#Results from Amazon Products Scratchpad, http://associates-amazon.s3.amazonaws.com/scratchpad/index.html
$test="GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=2345678&AssociateTag=1234567&Condition=All&IdType=ASIN&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers&Service=AWSECommerceService&Timestamp=2012-10-19T15%3A34%3A33.000Z&Version=2011-08-01"
#Write-Host $test
$testsig ="9oGX%2Fs8K5ww6CLkAGYLPCiLPAp5kdEBYyBwzOF7fXZI%3D"
$hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha.key = [Text.Encoding]::ASCII.GetBytes($secretkey)
$signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($stringtosign))
#$sig = [string]::join("", ($signature | % {([int]$_).toString('x2')}))
#$sig
$sig = [Convert]::ToBase64String($signature)
$sig
Add-Type -AssemblyName System.Web
$encoded = [System.Web.HttpUtility]::UrlEncode($sig)
$encoded
$testsig -match $encoded

您是否在AWS网站上看到了产品广告API签名请求示例代码-C#REST/Query代码?

它包含一个C#SignedRequestHelper类,可以直接在PowerShell中使用,也可以帮助弥补AWS请求签名中的差距。

祝你好运!

Zach

Zach指向的库可能是你最好的选择。但你走在了正确的轨道上,我认为你唯一的错误是,要构建最终的哈希字符串,你需要进行

$sig = [Convert]::ToBase64String($signature)

最新更新