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

Posted

技术标签:

【中文标题】使用 Powershell 从 Amazon 获取图书元数据【英文标题】:Use Powershell to get book metadata from Amazon 【发布时间】:2012-08-19 07:47:03 【问题描述】:

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

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

现在我的问题是,如何使用 Powershell 创建此 WebRequest 并使用我的 Sec Key 签署“String-to-Sign”?

文档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')))
**

希望有人能帮我解决这个问题...

谢谢, 安德烈亚斯

【问题讨论】:

如果您发布您收到的实际错误消息,您可能会得到更好的答案。 【参考方案1】:

除了 latkin 的评论之外,您还应该使用换行符构建您的字符串,否则您的签名将与亚马逊的签名不匹配。这是一个我必须匹配Amazon Product 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

【讨论】:

【参考方案2】:

您在 AWS 网站上看到过Product Advertising API Signed Request Sample Code - C# REST/Query 代码吗?

它包含一个 C# SignedRequestHelper 类,可以直接在您的 PowerShell 中使用,或者可能有助于弥合 AWS 请求签名方面的差距。

祝你好运!

扎克

【讨论】:

PS 中没有,但如果有的话我也不会感到惊讶。我的猜测是 PS 中的任何东西(助手等)仍然可能会下降到 C# 以重用受信任的库来生成哈希,至少例如HMACSHA256.【参考方案3】:

Zach 所指的库可能是您最好的选择。但是你在正确的轨道上,我认为你唯一错误的是构造最终的哈希字符串,你需要做

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

【讨论】:

以上是关于使用 Powershell 从 Amazon 获取图书元数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 从 Amazon.com 页面获取图像和数据?

Amazon API 从产品中获取所有图像

PowerShell - HTML 解析:从网站获取信息

使用 Filesystem Laravel 5.2 从 amazon s3 获取文件的签名 URL

使用 Powershell 从 GMAIL API 获取消息正文

从 Amazon SNS(APNS 生产)获取“EndpointDisabled”