Amazonの製品広告APIを使用する

こんにちは、ハブロフスク!



画像



この投稿では、 Amazon Product Advertising APIでの最初の経験についてお話したいと思います 。 このAPIを使用すると、Amazonサイトで製品および製品に関連付けられているすべての情報のパラメーター化された検索を実行できます。 ヘルプ用のアフィリエイトプログラムもあり、将来収益化できます(1.パートナーIDを取得、2。リクエストに追加、3。利益?...)。 ここでアフィリエイトプログラムを登録できます

興味があれば、読んでください。



背景



背景から投稿を開始しますが、なぜそこにたどり着いたのですか? それは、2012年の3月で、まさに始まりでした。 そして、地平線上で「国際女性の日」が見られるようになりました。そこでは、母親、妻、娘、少女に花、様々な贈り物を与えることが慣習となっています。 数分間熟考した後、妻にそれぞれ2つ目のiPadと花を購入することにしました。 デバイスとは異なり、花は問題なく購入できるため、購入は「X」日まで延期されることになりました。 私が住んでいる都市では、あらゆる種類のガジェットの市場が十分に開発されておらず、健全な競争はありません(原則として不健康です)。そのため、価格は単純に高すぎます。 幸いなことに、私の同僚は海外出張中だったので、 Amazon.comでデバイスを購入することにしまし 。 多くのオファーがあり、価格も300ドルから700ドルの範囲でした。 どういうわけか、より良いオファーを求めてサイトにアクセスして、一部の再販業者がとんでもない価格で販売するために8つの新しいデバイスを投げ出したのを見て、チェックアウトしてデータをフォームに詰めようとしていたときに、それらはすでに記入されていました。 このトピックに関するちょっとしたグーグルで、このデバイスの価格を監視するために何かを書くことにしました。



インセプション



開始するには、 AWSアカウントに移動し、[ セキュリティ認証情報 ]に移動して、[ 新しいアクセスキーを作成する ]をクリックします 。 その結果、次の図を取得します。



大切な鍵のペアを受け取りましテストしてみましょう。 フォームにキーを入力し、特定の状況のURLをUnsigned URLに書き込みます。

http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService &Version=2011-08-01 &AssociateTag=520 &Operation=ItemLookup &ResponseGroup=Large &ItemId=B0047DVWLW
      
      







少し説明しましょう。アフィリエイトプログラムを登録しなかったので、アソシエイトタグを先頭から登録しました。 Operation = ItemLookup(サービスがサポートするすべての操作はここにあります )は、すべてのまたは一部のプロパティ( ResponseGroupに応じて)を目的のItemId( URLで決定可能)で返します。



[署名付きURLを表示]をクリックします。これで、キーで署名されたリンクができました。 それを通過すると、以下が得られます。



タイプのXML応答(少し短くする必要がありましたが、Habrはそれを完全に食べることを拒否しました):
 <ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"> <OperationRequest> <HTTPHeaders> <Header Name="UserAgent" Value="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"/> </HTTPHeaders> <RequestId>9645cf90-c1ae-4505-be21-08198e5e8274</RequestId> <Arguments> <Argument Name="ItemId" Value="B0047DVWLW"/> <Argument Name="Operation" Value="ItemLookup"/> <Argument Name="Service" Value="AWSECommerceService"/> <Argument Name="AWSAccessKeyId" Value="AKIAILZWKKRUXK7QRNRA"/> <Argument Name="Timestamp" Value="2012-09-21T10:34:09.000Z"/> <Argument Name="Signature" Value="w8kK7v5WuPO2lxaUwtnw1fax10SMcqN8Wg8qTqUDeHQ="/> <Argument Name="ResponseGroup" Value="Large"/> <Argument Name="AssociateTag" Value="520"/> <Argument Name="Version" Value="2011-08-01"/> </Arguments> <RequestProcessingTime>0.2015160000000000</RequestProcessingTime> </OperationRequest> <Items> <Request> <IsValid>True</IsValid> <ItemLookupRequest> <IdType>ASIN</IdType> <ItemId>B0047DVWLW</ItemId> <ResponseGroup>Large</ResponseGroup> <VariationPage>All</VariationPage> </ItemLookupRequest> </Request> <Item> <ASIN>B0047DVWLW</ASIN> <ParentASIN>B004QGY7M6</ParentASIN> <DetailPageURL> http://www.amazon.com/Apple-MC979LL-Tablet-White-Generation/dp/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB0047DVWLW </DetailPageURL> <ItemLinks> <ItemLink> <Description>Technical Details</Description> <URL> http://www.amazon.com/Apple-MC979LL-Tablet-White-Generation/dp/tech-data/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>Add To Baby Registry</Description> <URL> http://www.amazon.com/gp/registry/baby/add-item.html%3Fasin.0%3DB0047DVWLW%26SubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>Add To Wedding Registry</Description> <URL> http://www.amazon.com/gp/registry/wedding/add-item.html%3Fasin.0%3DB0047DVWLW%26SubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>Add To Wishlist</Description> <URL> http://www.amazon.com/gp/registry/wishlist/add-item.html%3Fasin.0%3DB0047DVWLW%26SubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>Tell A Friend</Description> <URL> http://www.amazon.com/gp/pdp/taf/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>All Customer Reviews</Description> <URL> http://www.amazon.com/review/product/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>All Offers</Description> <URL> http://www.amazon.com/gp/offer-listing/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> </ItemLinks> <SalesRank>8</SalesRank> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL75_.jpg </URL> <Height Units="pixels">63</Height> <Width Units="pixels">75</Width> </SmallImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL160_.jpg </URL> <Height Units="pixels">135</Height> <Width Units="pixels">160</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL.jpg </URL> <Height Units="pixels">365</Height> <Width Units="pixels">434</Width> </LargeImage> <ImageSets> <ImageSet Category="primary"> <SwatchImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL30_.jpg </URL> <Height Units="pixels">25</Height> <Width Units="pixels">30</Width> </SwatchImage> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL75_.jpg </URL> <Height Units="pixels">63</Height> <Width Units="pixels">75</Width> </SmallImage> <ThumbnailImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL75_.jpg </URL> <Height Units="pixels">63</Height> <Width Units="pixels">75</Width> </ThumbnailImage> <TinyImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL110_.jpg </URL> <Height Units="pixels">93</Height> <Width Units="pixels">110</Width> </TinyImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL160_.jpg </URL> <Height Units="pixels">135</Height> <Width Units="pixels">160</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL.jpg </URL> <Height Units="pixels">365</Height> <Width Units="pixels">434</Width> </LargeImage> </ImageSet> <ImageSet Category="variant"> <SwatchImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL30_.jpg </URL> <Height Units="pixels">15</Height> <Width Units="pixels">30</Width> </SwatchImage> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL75_.jpg </URL> <Height Units="pixels">38</Height> <Width Units="pixels">75</Width> </SmallImage> <ThumbnailImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL75_.jpg </URL> <Height Units="pixels">38</Height> <Width Units="pixels">75</Width> </ThumbnailImage> <TinyImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL110_.jpg </URL> <Height Units="pixels">56</Height> <Width Units="pixels">110</Width> </TinyImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL160_.jpg </URL> <Height Units="pixels">81</Height> <Width Units="pixels">160</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L.jpg </URL> <Height Units="pixels">253</Height> <Width Units="pixels">500</Width> </LargeImage> </ImageSet> <ImageSet Category="variant"> <SwatchImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL30_.jpg </URL> <Height Units="pixels">30</Height> <Width Units="pixels">25</Width> </SwatchImage> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL75_.jpg </URL> <Height Units="pixels">75</Height> <Width Units="pixels">61</Width> </SmallImage> <ThumbnailImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL75_.jpg </URL> <Height Units="pixels">75</Height> <Width Units="pixels">61</Width> </ThumbnailImage> <TinyImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL110_.jpg </URL> <Height Units="pixels">110</Height> <Width Units="pixels">90</Width> </TinyImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL160_.jpg </URL> <Height Units="pixels">160</Height> <Width Units="pixels">131</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L.jpg </URL> <Height Units="pixels">500</Height> <Width Units="pixels">409</Width> </LargeImage> </ImageSet> <ImageSet Category="variant"> <SwatchImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL30_.jpg </URL> <Height Units="pixels">30</Height> <Width Units="pixels">25</Width> </SwatchImage> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL75_.jpg </URL> <Height Units="pixels">75</Height> <Width Units="pixels">63</Width> </SmallImage> <ThumbnailImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL75_.jpg </URL> <Height Units="pixels">75</Height> <Width Units="pixels">63</Width> </ThumbnailImage> <TinyImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL110_.jpg </URL> <Height Units="pixels">110</Height> <Width Units="pixels">93</Width> </TinyImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL160_.jpg </URL> <Height Units="pixels">160</Height> <Width Units="pixels">135</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL.jpg </URL> <Height Units="pixels">365</Height> <Width Units="pixels">309</Width> </LargeImage> </ImageSet> </ImageSets> <ItemAttributes> <Binding>Personal Computers</Binding> <Brand>Apple</Brand> <CatalogNumberList> <CatalogNumberListElement>B0047DVWLW</CatalogNumberListElement> </CatalogNumberList> <Color>White</Color> <EAN>0885909471812</EAN> <EANList> <EANListElement>0885909471812</EANListElement> <EANListElement>0811331000009</EANListElement> </EANList> <Feature>Designed for Apple's 2nd generation of iPads</Feature> <Feature> 9.7-inch (diagonal) LED-backlit glossy widescreen Multi-Touch display with IPS technology </Feature> <Feature>1 GHz dual-core Apple A5 custom-designed processor</Feature> <Feature>Forward facing and rear facing cameras</Feature> <Feature>Apple's iOS 4 and access to Apple's app store</Feature> <Format>CD-ROM</Format> <HardwarePlatform>Mac</HardwarePlatform> <IsAutographed>0</IsAutographed> <IsEligibleForTradeIn>1</IsEligibleForTradeIn> <IsMemorabilia>0</IsMemorabilia> <ItemDimensions> <Height Units="hundredths-inches">949</Height> <Length Units="hundredths-inches">35</Length> <Weight Units="hundredths-pounds">133</Weight> <Width Units="hundredths-inches">732</Width> </ItemDimensions> <Label>Apple Computer</Label> <LegalDisclaimer> Item Will Not Be Shipped Until Payment Clears And Funds Are Tranferred To My Bank Account! </LegalDisclaimer> <ListPrice> <Amount>39900</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$399.00</FormattedPrice> </ListPrice> <Manufacturer>Apple Computer</Manufacturer> <Model>MC979LL/A</Model> <MPN>MC979LL/A</MPN> <NumberOfItems>1</NumberOfItems> <OperatingSystem>Apple iOS 5.0</OperatingSystem> <PackageDimensions> <Height Units="hundredths-inches">350</Height> <Length Units="hundredths-inches">1140</Length> <Weight Units="hundredths-pounds">133</Weight> <Width Units="hundredths-inches">960</Width> </PackageDimensions> <PackageQuantity>1</PackageQuantity> <PartNumber>MC979LL/A</PartNumber> <ProductGroup>Personal Computer</ProductGroup> <ProductTypeName>TABLET_COMPUTER</ProductTypeName> <Publisher>Apple Computer</Publisher> <Size>16GB</Size> <SKU>118087@634532900684301250</SKU> <Studio>Apple Computer</Studio> <Title> Apple iPad 2 MC979LL/A Tablet (16GB, Wifi, White) 2nd Generation </Title> <TradeInValue> <Amount>33000</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$330.00</FormattedPrice> </TradeInValue> <UPC>811331000009</UPC> <UPCList> <UPCListElement>811331000009</UPCListElement> <UPCListElement>885909471812</UPCListElement> </UPCList> </ItemAttributes> <OfferSummary> <LowestNewPrice> <Amount>39900</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$399.00</FormattedPrice> </LowestNewPrice> <LowestUsedPrice> <Amount>34000</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$340.00</FormattedPrice> </LowestUsedPrice> <LowestRefurbishedPrice> <Amount>34999</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$349.99</FormattedPrice> </LowestRefurbishedPrice> <TotalNew>85</TotalNew> <TotalUsed>100</TotalUsed> <TotalCollectible>0</TotalCollectible> <TotalRefurbished>17</TotalRefurbished> </OfferSummary> <Offers> <TotalOffers>1</TotalOffers> <TotalOfferPages>1</TotalOfferPages> <MoreOffersUrl> http://www.amazon.com/gp/offer-listing/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </MoreOffersUrl> <Offer> <OfferAttributes> <Condition>New</Condition> </OfferAttributes> <OfferListing> <OfferListingId> 5tIFOSgtOfWUjj1N2%2FBqWUyXOtsYzDcDWOygGn8T3wdoo5gs1FLVQGbaoTAnVlGmTXh1rWsYI57d%2FfNHr%2BWexLUNQrcrhi1RM1OxR%2B65I%2Fs2Ofz0nfJ83bhbwZNUqm75udmgNjgk2t%2F3%2FJhFd5Cc87KIbmpEK7SH </OfferListingId> <Price> <Amount>41400</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$414.00</FormattedPrice> </Price> <AvailabilityAttributes> <AvailabilityType>futureDate</AvailabilityType> <MinimumHours>0</MinimumHours> <MaximumHours>0</MaximumHours> </AvailabilityAttributes> <IsEligibleForSuperSaverShipping>1</IsEligibleForSuperSaverShipping> </OfferListing> </Offer> </Offers>
      
      



2B65I%2Fs2Ofz0nfJ83bhbwZNUqm75udmgNjgk2t%2F3%2FJhFd5Cc87KIbmpEK7SH <ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"> <OperationRequest> <HTTPHeaders> <Header Name="UserAgent" Value="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"/> </HTTPHeaders> <RequestId>9645cf90-c1ae-4505-be21-08198e5e8274</RequestId> <Arguments> <Argument Name="ItemId" Value="B0047DVWLW"/> <Argument Name="Operation" Value="ItemLookup"/> <Argument Name="Service" Value="AWSECommerceService"/> <Argument Name="AWSAccessKeyId" Value="AKIAILZWKKRUXK7QRNRA"/> <Argument Name="Timestamp" Value="2012-09-21T10:34:09.000Z"/> <Argument Name="Signature" Value="w8kK7v5WuPO2lxaUwtnw1fax10SMcqN8Wg8qTqUDeHQ="/> <Argument Name="ResponseGroup" Value="Large"/> <Argument Name="AssociateTag" Value="520"/> <Argument Name="Version" Value="2011-08-01"/> </Arguments> <RequestProcessingTime>0.2015160000000000</RequestProcessingTime> </OperationRequest> <Items> <Request> <IsValid>True</IsValid> <ItemLookupRequest> <IdType>ASIN</IdType> <ItemId>B0047DVWLW</ItemId> <ResponseGroup>Large</ResponseGroup> <VariationPage>All</VariationPage> </ItemLookupRequest> </Request> <Item> <ASIN>B0047DVWLW</ASIN> <ParentASIN>B004QGY7M6</ParentASIN> <DetailPageURL> http://www.amazon.com/Apple-MC979LL-Tablet-White-Generation/dp/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB0047DVWLW </DetailPageURL> <ItemLinks> <ItemLink> <Description>Technical Details</Description> <URL> http://www.amazon.com/Apple-MC979LL-Tablet-White-Generation/dp/tech-data/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>Add To Baby Registry</Description> <URL> http://www.amazon.com/gp/registry/baby/add-item.html%3Fasin.0%3DB0047DVWLW%26SubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>Add To Wedding Registry</Description> <URL> http://www.amazon.com/gp/registry/wedding/add-item.html%3Fasin.0%3DB0047DVWLW%26SubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>Add To Wishlist</Description> <URL> http://www.amazon.com/gp/registry/wishlist/add-item.html%3Fasin.0%3DB0047DVWLW%26SubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>Tell A Friend</Description> <URL> http://www.amazon.com/gp/pdp/taf/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>All Customer Reviews</Description> <URL> http://www.amazon.com/review/product/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> <ItemLink> <Description>All Offers</Description> <URL> http://www.amazon.com/gp/offer-listing/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </URL> </ItemLink> </ItemLinks> <SalesRank>8</SalesRank> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL75_.jpg </URL> <Height Units="pixels">63</Height> <Width Units="pixels">75</Width> </SmallImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL160_.jpg </URL> <Height Units="pixels">135</Height> <Width Units="pixels">160</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL.jpg </URL> <Height Units="pixels">365</Height> <Width Units="pixels">434</Width> </LargeImage> <ImageSets> <ImageSet Category="primary"> <SwatchImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL30_.jpg </URL> <Height Units="pixels">25</Height> <Width Units="pixels">30</Width> </SwatchImage> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL75_.jpg </URL> <Height Units="pixels">63</Height> <Width Units="pixels">75</Width> </SmallImage> <ThumbnailImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL75_.jpg </URL> <Height Units="pixels">63</Height> <Width Units="pixels">75</Width> </ThumbnailImage> <TinyImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL110_.jpg </URL> <Height Units="pixels">93</Height> <Width Units="pixels">110</Width> </TinyImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL._SL160_.jpg </URL> <Height Units="pixels">135</Height> <Width Units="pixels">160</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/41Yisrlx%2BFL.jpg </URL> <Height Units="pixels">365</Height> <Width Units="pixels">434</Width> </LargeImage> </ImageSet> <ImageSet Category="variant"> <SwatchImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL30_.jpg </URL> <Height Units="pixels">15</Height> <Width Units="pixels">30</Width> </SwatchImage> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL75_.jpg </URL> <Height Units="pixels">38</Height> <Width Units="pixels">75</Width> </SmallImage> <ThumbnailImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL75_.jpg </URL> <Height Units="pixels">38</Height> <Width Units="pixels">75</Width> </ThumbnailImage> <TinyImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL110_.jpg </URL> <Height Units="pixels">56</Height> <Width Units="pixels">110</Width> </TinyImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L._SL160_.jpg </URL> <Height Units="pixels">81</Height> <Width Units="pixels">160</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/31lmfWbe6-L.jpg </URL> <Height Units="pixels">253</Height> <Width Units="pixels">500</Width> </LargeImage> </ImageSet> <ImageSet Category="variant"> <SwatchImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL30_.jpg </URL> <Height Units="pixels">30</Height> <Width Units="pixels">25</Width> </SwatchImage> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL75_.jpg </URL> <Height Units="pixels">75</Height> <Width Units="pixels">61</Width> </SmallImage> <ThumbnailImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL75_.jpg </URL> <Height Units="pixels">75</Height> <Width Units="pixels">61</Width> </ThumbnailImage> <TinyImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL110_.jpg </URL> <Height Units="pixels">110</Height> <Width Units="pixels">90</Width> </TinyImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L._SL160_.jpg </URL> <Height Units="pixels">160</Height> <Width Units="pixels">131</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/41omkn%2BPH6L.jpg </URL> <Height Units="pixels">500</Height> <Width Units="pixels">409</Width> </LargeImage> </ImageSet> <ImageSet Category="variant"> <SwatchImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL30_.jpg </URL> <Height Units="pixels">30</Height> <Width Units="pixels">25</Width> </SwatchImage> <SmallImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL75_.jpg </URL> <Height Units="pixels">75</Height> <Width Units="pixels">63</Width> </SmallImage> <ThumbnailImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL75_.jpg </URL> <Height Units="pixels">75</Height> <Width Units="pixels">63</Width> </ThumbnailImage> <TinyImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL110_.jpg </URL> <Height Units="pixels">110</Height> <Width Units="pixels">93</Width> </TinyImage> <MediumImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL._SL160_.jpg </URL> <Height Units="pixels">160</Height> <Width Units="pixels">135</Width> </MediumImage> <LargeImage> <URL> http://ecx.images-amazon.com/images/I/31gqTQEEqAL.jpg </URL> <Height Units="pixels">365</Height> <Width Units="pixels">309</Width> </LargeImage> </ImageSet> </ImageSets> <ItemAttributes> <Binding>Personal Computers</Binding> <Brand>Apple</Brand> <CatalogNumberList> <CatalogNumberListElement>B0047DVWLW</CatalogNumberListElement> </CatalogNumberList> <Color>White</Color> <EAN>0885909471812</EAN> <EANList> <EANListElement>0885909471812</EANListElement> <EANListElement>0811331000009</EANListElement> </EANList> <Feature>Designed for Apple's 2nd generation of iPads</Feature> <Feature> 9.7-inch (diagonal) LED-backlit glossy widescreen Multi-Touch display with IPS technology </Feature> <Feature>1 GHz dual-core Apple A5 custom-designed processor</Feature> <Feature>Forward facing and rear facing cameras</Feature> <Feature>Apple's iOS 4 and access to Apple's app store</Feature> <Format>CD-ROM</Format> <HardwarePlatform>Mac</HardwarePlatform> <IsAutographed>0</IsAutographed> <IsEligibleForTradeIn>1</IsEligibleForTradeIn> <IsMemorabilia>0</IsMemorabilia> <ItemDimensions> <Height Units="hundredths-inches">949</Height> <Length Units="hundredths-inches">35</Length> <Weight Units="hundredths-pounds">133</Weight> <Width Units="hundredths-inches">732</Width> </ItemDimensions> <Label>Apple Computer</Label> <LegalDisclaimer> Item Will Not Be Shipped Until Payment Clears And Funds Are Tranferred To My Bank Account! </LegalDisclaimer> <ListPrice> <Amount>39900</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$399.00</FormattedPrice> </ListPrice> <Manufacturer>Apple Computer</Manufacturer> <Model>MC979LL/A</Model> <MPN>MC979LL/A</MPN> <NumberOfItems>1</NumberOfItems> <OperatingSystem>Apple iOS 5.0</OperatingSystem> <PackageDimensions> <Height Units="hundredths-inches">350</Height> <Length Units="hundredths-inches">1140</Length> <Weight Units="hundredths-pounds">133</Weight> <Width Units="hundredths-inches">960</Width> </PackageDimensions> <PackageQuantity>1</PackageQuantity> <PartNumber>MC979LL/A</PartNumber> <ProductGroup>Personal Computer</ProductGroup> <ProductTypeName>TABLET_COMPUTER</ProductTypeName> <Publisher>Apple Computer</Publisher> <Size>16GB</Size> <SKU>118087@634532900684301250</SKU> <Studio>Apple Computer</Studio> <Title> Apple iPad 2 MC979LL/A Tablet (16GB, Wifi, White) 2nd Generation </Title> <TradeInValue> <Amount>33000</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$330.00</FormattedPrice> </TradeInValue> <UPC>811331000009</UPC> <UPCList> <UPCListElement>811331000009</UPCListElement> <UPCListElement>885909471812</UPCListElement> </UPCList> </ItemAttributes> <OfferSummary> <LowestNewPrice> <Amount>39900</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$399.00</FormattedPrice> </LowestNewPrice> <LowestUsedPrice> <Amount>34000</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$340.00</FormattedPrice> </LowestUsedPrice> <LowestRefurbishedPrice> <Amount>34999</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$349.99</FormattedPrice> </LowestRefurbishedPrice> <TotalNew>85</TotalNew> <TotalUsed>100</TotalUsed> <TotalCollectible>0</TotalCollectible> <TotalRefurbished>17</TotalRefurbished> </OfferSummary> <Offers> <TotalOffers>1</TotalOffers> <TotalOfferPages>1</TotalOfferPages> <MoreOffersUrl> http://www.amazon.com/gp/offer-listing/B0047DVWLW%3FSubscriptionId%3DAKIAILZWKKRUXK7QRNRA%26tag%3D520%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0047DVWLW </MoreOffersUrl> <Offer> <OfferAttributes> <Condition>New</Condition> </OfferAttributes> <OfferListing> <OfferListingId> 5tIFOSgtOfWUjj1N2%2FBqWUyXOtsYzDcDWOygGn8T3wdoo5gs1FLVQGbaoTAnVlGmTXh1rWsYI57d%2FfNHr%2BWexLUNQrcrhi1RM1OxR%2B65I%2Fs2Ofz0nfJ83bhbwZNUqm75udmgNjgk2t%2F3%2FJhFd5Cc87KIbmpEK7SH </OfferListingId> <Price> <Amount>41400</Amount> <CurrencyCode>USD</CurrencyCode> <FormattedPrice>$414.00</FormattedPrice> </Price> <AvailabilityAttributes> <AvailabilityType>futureDate</AvailabilityType> <MinimumHours>0</MinimumHours> <MaximumHours>0</MaximumHours> </AvailabilityAttributes> <IsEligibleForSuperSaverShipping>1</IsEligibleForSuperSaverShipping> </OfferListing> </Offer> </Offers>









Responseから、どの情報が価値があるかが明確になります(たとえば、ResponseGroup = Largeが採用されたため、特定の問題については、ResponseGroup = Offersの方が多くの追加データが得られました)。



サービスの操作に関するすべての情報は、 開発者ガイドに記載されています。



自転車検索



このサービスはWSDLを提供します。 つまり ソリューションにWebサービス参照として追加すると、その結果、サービスを操作するためのプロキシが取得されます。 すべては問題ありませんが、サービスに送信するリクエストには、受信したSAK(秘密アクセスキー)で署名する必要があります。

当社の認証プロセスは次のとおりです。



AWSから:



すべてが非常に明確ですが、サービスにはSAKによるrekvestをサブスクライブする機能がありません。 当時の最も簡単な解決策は、サンプルを調べて必要な機能を見つけたようですが、すべてが見た目ほど単純ではありません。 私がレビューしたすべてのサンプルのうち、rekvestにサインアップするための有効なコードを見つけることができませんでした。 すぐにグーグルは解決策を見つけました:

C#署名ソリューションリクエスト
 class SignRequestHelper { private string endPoint; private string akid; private byte[] secret; private HMAC signer; private const string REQUEST_URI = "/onca/xml"; private const string REQUEST_METHOD = "GET"; /* * Use this constructor to create the object. The AWS credentials are available on * http://aws.amazon.com * * The destination is the service end-point for your application: * US: ecs.amazonaws.com * JP: ecs.amazonaws.jp * UK: ecs.amazonaws.co.uk * DE: ecs.amazonaws.de * FR: ecs.amazonaws.fr * CA: ecs.amazonaws.ca */ public SignRequestHelper(string awsAccessKeyId, string awsSecretKey, string destination) { this.endPoint = destination.ToLower(); this.akid = awsAccessKeyId; this.secret = Encoding.UTF8.GetBytes(awsSecretKey); this.signer = new HMACSHA256(this.secret); } /* * Sign a request in the form of a Dictionary of name-value pairs. * * This method returns a complete URL to use. Modifying the returned URL * in any way invalidates the signature and Amazon will reject the requests. */ public string Sign(IDictionary<string, string> request) { // Use a SortedDictionary to get the parameters in natural byte order, as // required by AWS. ParamComparer pc = new ParamComparer(); SortedDictionary<string, string> sortedMap = new SortedDictionary<string, string>(request, pc); // Add the AWSAccessKeyId and Timestamp to the requests. sortedMap["AWSAccessKeyId"] = this.akid; sortedMap["Timestamp"] = this.GetTimestamp(); // Get the canonical query string string canonicalQS = this.ConstructCanonicalQueryString(sortedMap); // Derive the bytes needs to be signed. StringBuilder builder = new StringBuilder(); builder.Append(REQUEST_METHOD) .Append("\n") .Append(this.endPoint) .Append("\n") .Append(REQUEST_URI) .Append("\n") .Append(canonicalQS); string stringToSign = builder.ToString(); byte[] toSign = Encoding.UTF8.GetBytes(stringToSign); // Compute the signature and convert to Base64. byte[] sigBytes = signer.ComputeHash(toSign); string signature = Convert.ToBase64String(sigBytes); // now construct the complete URL and return to caller. StringBuilder qsBuilder = new StringBuilder(); qsBuilder.Append("http://") .Append(this.endPoint) .Append(REQUEST_URI) .Append("?") .Append(canonicalQS) .Append("&Signature=") .Append(this.PercentEncodeRfc3986(signature)); return qsBuilder.ToString(); } /* * Sign a request in the form of a query string. * * This method returns a complete URL to use. Modifying the returned URL * in any way invalidates the signature and Amazon will reject the requests. */ public string Sign(string queryString) { IDictionary<string, string> request = this.CreateDictionary(queryString); return this.Sign(request); } /* * Current time in IS0 8601 format as required by Amazon */ private string GetTimestamp() { DateTime currentTime = DateTime.UtcNow; string timestamp = currentTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); return timestamp; } /* * Percent-encode (URL Encode) according to RFC 3986 as required by Amazon. * * This is necessary because .NET's HttpUtility.UrlEncode does not encode * according to the above standard. Also, .NET returns lower-case encoding * by default and Amazon requires upper-case encoding. */ private string PercentEncodeRfc3986(string str) { str = HttpUtility.UrlEncode(str, System.Text.Encoding.UTF8); str = str.Replace("'", "%27").Replace("(", "%28").Replace(")", "%29").Replace("*", "%2A").Replace("!", "%21").Replace("%7e", "~").Replace("+", "%20"); StringBuilder sbuilder = new StringBuilder(str); for (int i = 0; i < sbuilder.Length; i++) { if (sbuilder[i] == '%') { if (Char.IsLetter(sbuilder[i + 1]) || Char.IsLetter(sbuilder[i + 2])) { sbuilder[i + 1] = Char.ToUpper(sbuilder[i + 1]); sbuilder[i + 2] = Char.ToUpper(sbuilder[i + 2]); } } } return sbuilder.ToString(); } /* * Convert a query string to corresponding dictionary of name-value pairs. */ private IDictionary<string, string> CreateDictionary(string queryString) { Dictionary<string, string> map = new Dictionary<string, string>(); string[] requestParams = queryString.Split('&'); for (int i = 0; i < requestParams.Length; i++) { if (requestParams[i].Length < 1) { continue; } char[] sep = { '=' }; string[] param = requestParams[i].Split(sep, 2); for (int j = 0; j < param.Length; j++) { param[j] = HttpUtility.UrlDecode(param[j], System.Text.Encoding.UTF8); } switch (param.Length) { case 1: { if (requestParams[i].Length >= 1) { if (requestParams[i].ToCharArray()[0] == '=') { map[""] = param[0]; } else { map[param[0]] = ""; } } break; } case 2: { if (!string.IsNullOrEmpty(param[0])) { map[param[0]] = param[1]; } } break; } } return map; } private string ConstructCanonicalQueryString(SortedDictionary<string, string> sortedParamMap) { StringBuilder builder = new StringBuilder(); if (sortedParamMap.Count == 0) { builder.Append(""); return builder.ToString(); } foreach (KeyValuePair<string, string> kvp in sortedParamMap) { builder.Append(this.PercentEncodeRfc3986(kvp.Key)); builder.Append("="); builder.Append(this.PercentEncodeRfc3986(kvp.Value)); builder.Append("&"); } string canonicalString = builder.ToString(); canonicalString = canonicalString.Substring(0, canonicalString.Length - 1); return canonicalString; } } class ParamComparer : IComparer<string> { public int Compare(string p1, string p2) { return string.CompareOrdinal(p1, p2); } }
      
      







次のように使用します。

 /*...*/ SignRequestHelper signRequestHelper = new SignRequestHelper(Settings.Default.MyAWSKeyID, Settings.Default.MyAWSSecretKey, Settings.Default.Destination); /*....*/ XmlDocument document = RetrieveXmlResponse(this.signRequestHelper.Sign(requestString)); /*...*/ private static XmlDocument RetrieveXmlResponse(string url) { try { WebRequest request = HttpWebRequest.Create(url); WebResponse response = request.GetResponse(); XmlDocument doc = new XmlDocument(); doc.Load(response.GetResponseStream()); return doc; } catch (Exception e) { Console.WriteLine("Caught Exception: " + e.Message); Console.WriteLine("Stack Trace: " + e.StackTrace); } return null; }
      
      





最初は、応答から来たXmlDocumentを解析しようとしました(これは根本的に間違っており、多くの時間がかかりました)。 その後、 ItemLookupResponseクラス(XML応答のルート要素)と逆シリアル化が存在するプロキシを思い出しました。 そして、すべてが何度も簡単に決定されました。

 public ItemLookupResponse RetrieveItemDetails(string itemID) { ItemLookupResponse result = new ItemLookupResponse(); string requestString = String.Format(Settings.Default.RequestFormatString, Settings.Default.ServiceParameter, Settings.Default.VersionParameter, Settings.Default.OperationParameter, ResponseGroup.Large.ToString(), itemID, Settings.Default.AssociateTagParameter); XmlDocument document = RetrieveXmlResponse(this.signRequestHelper.Sign(requestString)); var ser = new XmlSerializer(typeof(ItemLookupResponse), Settings.Default.NamespaceURI); try { var wrapper = (ItemLookupResponse)ser.Deserialize(new XmlNodeReader(document.DocumentElement)); result = wrapper; } catch (Exception ex) { Console.WriteLine("Caught Exception: " + ex.Message); Console.WriteLine("Stack Trace: " + ex.StackTrace); } return result; }
      
      





その結果、必要なすべてのプロパティを持つItemLookupResponse オブジェクトを取得しますItemオブジェクトから価格を取得できます

 Item item = GetItem(result); /* item.OfferSummary.LowestCollectiblePrice; item.OfferSummary.LowestNewPrice; item.OfferSummary.LowestRefurbishedPrice; item.OfferSummary.LowestUsedPrice; */
      
      





私たちが欲しかったものすべてが手に入りました。 ItemLookupの予約リクエストは1つに限定されず、ItemId = B0047DVWLWですぐに予約リクエストを行うことができます。 ItemIDは、いわゆるASIN (Amazon Standard Identification Number)です。 ItemLookupResponseをもう少し調べてみたところ、このセクションが目を引きました。

 <SimilarProducts> <SimilarProduct> <ASIN>B0013FRNKG</ASIN> <Title> Apple iPad 2 MC769LL/A Tablet (16GB, WiFi, Black) 2nd Generation </Title> </SimilarProduct> <SimilarProduct> <ASIN>B003D8GAA0</ASIN> <Title> 3 Pack of Premium Crystal Clear Screen Protectors for Apple iPad </Title> </SimilarProduct> /*..........*/
      
      





つまり XML応答には、同様のデバイスのセットが含まれています。 そのため、 RetrieveItemDetails(string itemID)を使用して、必要なすべてのデバイスとその類似製品をデータベースから取得するというアイデアが生まれました(再帰メソッドを作成します)。 おそらくお気づきのように、ASIN = B003D8GAA0の下では、まったく必要のないスクリーンプロテクターが非表示になります(それに応じて、そのような要素をフィルター処理します)。

同様のデバイスを検索する
 private void GetAllSimilarItemDetails(string asin) { try { ItemLookupResponse lookupResponse = RetrieveItemDetails(asin); if (!devicesCollection.ContainsKey(asin)) { devicesCollection.Add(asin, lookupResponse); } else { return; } foreach (var item in lookupResponse.Items) { foreach (var internalItem in item.Item) { bool isContainNeededNode = false; if (internalItem.ItemAttributes.Title.ToLower().Contains("device_title")) { foreach (var node in internalItem.BrowseNodes.BrowseNode) { if (node.Name == "Tablets" || node.Name == "Electronics") { isContainNeededNode = true; } } if (isContainNeededNode) { foreach (var similarItem in internalItem.SimilarProducts) { GetAllSimilarItemDetails(similarItem.ASIN); } } else { break; } } } } } catch (Exception ex) { throw ex; } }
      
      









アラート



警告として、メールとツイッターが選択されました。 タイマーが設定され、一定の間隔でデバイスの価格がチェックされ、最後のチェックまたは石鹸の最小セットから価格の差が小さい場合、手紙が飛び去り、Twitterの特定のアカウントがメッセージを送信しました( Twitterizerを介して)。



視点で



希望と時間が許せば、指定されたパラメーターによって必要な購入を監視するWindowsサービスでこのすべてを書き換えるというアイデアがあります。 そして、ユーザーに必要な情報を提供するために、特定のタグとパラメーターで言及されるレスポンシブtweetbotを書きます。



結果



そして今、最も重要なことについて、デバイスが購入され、彼の妻に提示されました。 誰もが幸せです!



参照資料






All Articles