Imports WebImageLib Imports WISAmazon.com.amazon.webservices Public Class AmazonDVD Inherits AmazonBase Sub New() searchIndex = "DVD" End Sub Public Overrides ReadOnly Property Name() As String Get Return "Amazon DVD" End Get End Property End Class Public Class AmazonBook Inherits AmazonBase Sub New() searchIndex = "Books" End Sub Public Overrides ReadOnly Property Name() As String Get Return "Amazon 和書" End Get End Property End Class Public MustInherit Class AmazonBase Implements IWebImage Dim ecs4 As New AWSECommerceService Dim search As New ItemSearch Dim searchRequest As New ItemSearchRequest Dim currentPageNum As Integer Dim hasNext As Boolean Protected searchIndex As String = "" Sub New() Reset() End Sub Function sendQueryToAmazon(ByVal pageNum As Integer, ByVal query As String, ByVal images As ArrayList) Dim searchResponse As ItemSearchResponse search.SubscriptionId = "14HA028HBEN2D7NVSVG2" search.AssociateTag = "" searchRequest.Keywords = query searchRequest.SearchIndex = searchIndex searchRequest.ResponseGroup = New String() {"ItemAttributes", "Images"} searchRequest.ItemPage = pageNum.ToString() search.Request = New ItemSearchRequest() {searchRequest} Try searchResponse = ecs4.ItemSearch(search) Catch ex As Exception Return -1 End Try ' エラー・チェック If (searchResponse Is Nothing) OrElse (searchResponse.Items Is Nothing) OrElse (searchResponse.Items(0) Is Nothing) Then Return -1 End If If Not searchResponse.Items(0).Request.Errors Is Nothing Then For Each err As ErrorsError In searchResponse.Items(0).Request.Errors Console.WriteLine("{0}: {1}", err.Code, err.Message) Next Return 0 End If Dim myItems As Items = searchResponse.Items(0) Dim results As Item() = myItems.Item If results Is Nothing Then Return 0 End If For Each myItem As Item In results Dim page As String = "" Dim small As String = "" Dim large As String = "" If Not myItem Is Nothing Then If Not myItem.DetailPageURL Is Nothing Then page = myItem.DetailPageURL End If If Not myItem.SmallImage Is Nothing Then small = myItem.SmallImage.URL End If ' 画像が見つからなかったらほかのサイズで代用 If Not myItem.MediumImage Is Nothing Then large = myItem.MediumImage.URL If small = "" Then small = large End If End If If Not myItem.LargeImage Is Nothing Then large = myItem.LargeImage.URL If small = "" Then small = large End If End If ' 画像がない場合には無視 If Not small = "" Then images.Add(New WebImage(small, large, page)) End If End If Next Return Int32.Parse(myItems.TotalPages) End Function Public ReadOnly Property CurrentPage() As Integer Implements WebImageLib.IWebImage.CurrentPage Get Return currentPageNum End Get End Property Public Function GetImages(ByVal query As String) As WebImageLib.WebImage() Implements WebImageLib.IWebImage.GetImages Dim images As New ArrayList If Not query = "" Then Dim totalPage As Integer = sendQueryToAmazon(currentPageNum, query, images) ' 失敗した場合は5回までリトライ Dim i As Integer Do While (i < 5) AndAlso (totalPage = -1) System.Threading.Thread.Sleep(1000) Console.WriteLine("retry : " & i) totalPage = sendQueryToAmazon(currentPageNum, query, images) i += 1 Loop If totalPage <= currentPageNum Then hasNext = False Else hasNext = True End If End If Return CType(images.ToArray(GetType(WebImage)), WebImage()) End Function Public Function MoveNext() As Boolean Implements WebImageLib.IWebImage.MoveNext If hasNext Then currentPageNum += 1 End If Return hasNext End Function Public MustOverride ReadOnly Property Name() As String Implements WebImageLib.IWebImage.Name Public Sub Reset() Implements WebImageLib.IWebImage.Reset hasNext = False currentPageNum = 1 End Sub End Class Public Class ECS4Test Shared Sub Main() Dim query As String = "スターウォーズ" Dim ecs4 As New AmazonDVD Do For Each wi As WebImage In ecs4.GetImages(query) Console.WriteLine(ecs4.CurrentPage) Console.WriteLine(wi.SmallImageURL) Console.WriteLine(wi.LargeImageURL) Console.WriteLine(wi.DetailPageURL) Next Loop Until ecs4.MoveNext() = False End Sub End Class