├── build.gradle
└── src
└── main
└── java
├── AwsSignature4.java
├── JsonUtil.java
├── MyApp.java
└── PaApi5Wrapper.java
build.gradle
Gradle-Konfigurationsdatei. Da sich die JSON-Manipulationsbibliothek nicht in der Java-Standardbibliothek befindet, wird Jackson verwendet.
plugins {
id 'java'
id 'application'
}
repositories {
mavenCentral()
}
dependencies {
//Verwenden Sie Jackson
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1'
}
application {
mainClassName = 'MyApp'
}
sourceCompatibility = JavaVersion.VERSION_15
src/main/java/MyApp.java
import java.util.HashMap;
import java.util.Map;
/**
* PA-Eine Beispielklasse, die API v5 aufruft.
*/
public class MyApp {
public static void main(String[] args) throws Exception {
// PA-Rufen Sie API v5 auf
searchItems();
getItems();
}
private static final String ACCESS_KEY = "<YOUR-ACCESS-KEY-HERE>"; //Erhaltener Zugangsschlüssel
private static final String SECRET_KEY = "<YOUR-SECRET-KEY-HERE>"; //Erhaltener geheimer Schlüssel
private static final String TRACKING_ID = "<YOUR-PARTNER-TAG-HERE>"; //Tracking ID(Beispiel: XXXXX-22)
//Suche nach Produkten nach Stichwort
public static void searchItems() throws Exception {
String keywords = "Shakespeare";
//Anfrage Informationen
Map<String, Object> req = new HashMap<>() {
{
put("ItemCount", 3); //Anzahl der Suchergebnisse
put("PartnerTag", TRACKING_ID); //Geschäfts-ID oder Tracking-ID
put("PartnerType", "Associates"); //Partnertyp
put("Keywords", keywords); //Suchbegriff
put("SearchIndex", "All"); //Suchkategorie(All, AmazonVideo, Books, Hobbies,Musik etc. kann angegeben werden)
put("Resources", new String[]{ //Art des Werts, der in die Antwort aufgenommen werden soll
"ItemInfo.Title",
"ItemInfo.ByLineInfo",
"ItemInfo.ProductInfo",
"Images.Primary.Large",
"Images.Primary.Medium",
"Images.Primary.Small"
});
}
};
//Machen Sie Anforderungsinformationen zu einer JSON-Zeichenfolge
String reqJson = new JsonUtil().objectToJson(req);
System.out.println("=====Suche nach Produkten nach Stichwort:Anfrage=====");
System.out.println(reqJson);
// PA-Rufen Sie API v5 auf und erhalten Sie das Ergebnis als JSON-Zeichenfolge
PaApi5Wrapper api = new PaApi5Wrapper(ACCESS_KEY, SECRET_KEY);
String resJson = api.searchItems(reqJson);
System.out.println("=====Suche nach Produkten nach Stichwort:Antwort=====");
System.out.println(new JsonUtil().prettyPrint(resJson));
}
//Erhalten Sie Produktinformationen von ASIN
public static void getItems() throws Exception {
String[] asinList = new String[]{"4391641585", "B010EB1HR4", "B0125SPF90", "B07V52KSGT"};
//Anfrage Informationen
Map<String, Object> req = new HashMap<>() {
{
put("PartnerTag", TRACKING_ID); //Geschäfts-ID oder Tracking-ID
put("PartnerType", "Associates"); //Partnertyp
put("ItemIds", asinList); //Liste der ASIN
put("Resources", new String[]{ //Art des Werts, der in die Antwort aufgenommen werden soll
"ItemInfo.Title",
"ItemInfo.ByLineInfo"
});
}
};
//Machen Sie Anforderungsinformationen zu einer JSON-Zeichenfolge
String reqJson = new JsonUtil().objectToJson(req);
System.out.println("=====Erhalten Sie Produktinformationen von ASIN:Anfrage=====");
System.out.println(reqJson);
// PA-Rufen Sie API v5 auf und erhalten Sie das Ergebnis als JSON-Zeichenfolge
PaApi5Wrapper api = new PaApi5Wrapper(ACCESS_KEY, SECRET_KEY);
String resJson = api.getItems(reqJson);
System.out.println("=====Erhalten Sie Produktinformationen von ASIN:Antwort=====");
System.out.println(new JsonUtil().prettyPrint(resJson));
}
}
src/main/java/PaApi5Wrapper.java
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.Duration;
import java.util.Map;
/**
* PA-API v5-Wrapper-Klasse.
*/
public class PaApi5Wrapper {
private static final String HOST = "webservices.amazon.co.jp"; // Amazon.co.JP Web API Host
private static final String REGION = "us-west-2"; // Amazon.co.jp in uns-west-Geben Sie 2 an
private final String accessKey;
private final String secretKey;
/**
*Konstrukteur.
* @param accessKey Zugriffsschlüssel
* @param secretKey geheimer Schlüssel
*/
public PaApi5Wrapper(String accessKey, String secretKey) {
this.accessKey = accessKey;
this.secretKey = secretKey;
}
/**
*Suche nach Produkten nach Stichwort.
* @param reqJson Informationen anfordern JSON
* @Antwortinformationen zurückgeben JSON
* @throws InterruptedException
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws URISyntaxException
*/
public String searchItems(String reqJson) throws InterruptedException, IOException, NoSuchAlgorithmException, InvalidKeyException, URISyntaxException {
String path = "/paapi5/searchitems";
String target = "com.amazon.paapi5.v1.ProductAdvertisingAPIv1.SearchItems";
return callApi(reqJson, path, target);
}
/**
*Erhalten Sie Produktinformationen von ASIN.
* @param reqJson Informationen anfordern JSON
* @Antwortinformationen zurückgeben JSON
* @throws InterruptedException
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws URISyntaxException
*/
public String getItems(String reqJson) throws InterruptedException, IOException, NoSuchAlgorithmException, InvalidKeyException, URISyntaxException {
String path = "/paapi5/getitems";
String target = "com.amazon.paapi5.v1.ProductAdvertisingAPIv1.GetItems";
return callApi(reqJson, path, target);
}
/**
* PA-Rufen Sie API v5 auf.
* @param reqJson Informationen anfordern JSON
* @Parameterpfad API-Einstiegspunktpfad
* @param target Zieldienst und Datenoperationen anfordern
* @Antwortinformationen zurückgeben JSON
* @throws URISyntaxException
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws InterruptedException
*/
public String callApi(String reqJson, String path, String target) throws URISyntaxException, InvalidKeyException, NoSuchAlgorithmException, IOException, InterruptedException {
//Verwenden Sie die in Java 11 offiziell eingeführte HTTP-Client-API
//Erstellen Sie HTTP-Anforderungsinformationen
HttpRequest.Builder reqBuilder = HttpRequest.newBuilder()
.uri(new URI("https://" + HOST + path)) //URL für API-Aufruf
.POST(HttpRequest.BodyPublishers.ofString(reqJson)) //Legen Sie die API-Aufrufparameter fest
.timeout(Duration.ofSeconds(10));
//Abrufen von Header-Informationen mit Signaturinformationen
AwsSignature4 awsv4Auth = new AwsSignature4(accessKey, secretKey, path, REGION, HOST, target);
Map<String, String> signedHeaders = awsv4Auth.getHeaders(reqJson);
//Setzen Sie den Header in den Anforderungsinformationen
signedHeaders.remove("host"); //Host-Header wird nicht hinzugefügt(jdk.httpclient.allowRestrictedHeaders)
for (Map.Entry<String, String> entrySet : signedHeaders.entrySet()) {
reqBuilder.header(entrySet.getKey(), entrySet.getValue());
}
//Generieren Sie HTTP-Anforderungsinformationen
HttpRequest req = reqBuilder.build();
//Rufen Sie die API auf, um das Ergebnis zu erhalten
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
//Beurteilen Sie Erfolg / Misserfolg anhand des Statuscodes
if (res.statusCode() == 200) {
return res.body();
} else {
throw new RuntimeException(res.body());
}
}
}
src/main/java/AwsSignature4.java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.TimeZone;
import java.util.TreeMap;
/**
*AWS Signed Version 4(AWS Signature Version 4)
*/
public class AwsSignature4 {
private static final String SERVICE = "ProductAdvertisingAPI"; // PA-API
private static final String HMAC_ALGORITHM = "AWS4-HMAC-SHA256";
private static final String AWS_4_REQUEST = "aws4_request";
private final String awsAccessKey;
private final String awsSecretKey;
private final String path;
private final String region;
private final String host;
private final String target;
/**
*Konstrukteur.
* @param awsAccessKey Zugriffsschlüssel
* @param awsSecretKey Geheimer Schlüssel
* @Parameterpfad API-Einstiegspunktpfad
* @param region region
* @Einstiegspfad der param-Host-API
* @param target Zieldienst und Datenoperationen anfordern
*/
public AwsSignature4(
String awsAccessKey, String awsSecretKey,
String path, String region,
String host, String target) {
this.awsAccessKey = awsAccessKey;
this.awsSecretKey = awsSecretKey;
this.path = path;
this.region = region;
this.host = host;
this.target = target;
}
/**
*Gibt Header-Informationen zur Authentifizierung zurück.
* @param payload Anforderungsinformationen JSON
* @Header-Informationen für die Rückgabeauthentifizierung
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
*/
public Map<String, String> getHeaders(String payload) throws NoSuchAlgorithmException, InvalidKeyException {
//Basiskopf
TreeMap<String, String> headers = new TreeMap<>();
headers.put("host", host);
headers.put("content-type", "application/json; charset=utf-8");
headers.put("content-encoding", "amz-1.0");
headers.put("x-amz-target", target);
//Zeitstempel, der beim Erstellen einer Signatur verwendet wird
final Date date = new Date();
headers.put("x-amz-date", getXAmzDateString(date));
//Signierter Header(signed headers)
String signedHeaders = createSignedHeaders(headers);
//Regelmäßige Anfrage(canonical request)
String canonicalRequest = createCanonicalRequest(path, headers, signedHeaders, payload);
//Zeichenfolge(string to sign)
String stringToSign = createStringToSign(date, region, canonicalRequest);
//Unterschrift(signature)
String signature = calculateSignature(awsSecretKey, date, region, stringToSign);
//Autorisierungsheaderwert
String authorization = buildAuthorizationString(awsAccessKey, region, signature, signedHeaders, date);
headers.put("Authorization", authorization);
return headers;
}
//Signierter Header(signed headers)
private static String createSignedHeaders(TreeMap<String, String> headers) {
StringBuilder signedHeaderBuilder = new StringBuilder();
for (String key : headers.keySet()) {
signedHeaderBuilder.append(key).append(";");
}
return signedHeaderBuilder.substring(0, signedHeaderBuilder.length() - 1);
}
//Regelmäßige Anfrage(canonical request)
private static String createCanonicalRequest(String path, TreeMap<String, String> headers, String signedHeaders, String payload) throws NoSuchAlgorithmException {
StringBuilder canonicalRequest = new StringBuilder();
canonicalRequest.append("POST").append("\n");
canonicalRequest.append(path).append("\n").append("\n");
for (String key : headers.keySet()) {
canonicalRequest.append(key).append(":").append(headers.get(key)).append("\n");
}
canonicalRequest.append("\n");
canonicalRequest.append(signedHeaders).append("\n");
canonicalRequest.append(sha256(payload));
return canonicalRequest.toString();
}
//Zeichenfolge(string to sign)
private static String createStringToSign(Date current, String region, String canonicalRequest) throws NoSuchAlgorithmException {
return HMAC_ALGORITHM + "\n"
+ getXAmzDateString(current) + "\n"
+ getYMDString(current) + "/" + region + "/" + SERVICE + "/" + AWS_4_REQUEST + "\n"
+ sha256(canonicalRequest);
}
//Unterschrift(signature)
private static String calculateSignature(String awsSecretKey, Date current, String region, String stringToSign) throws InvalidKeyException, NoSuchAlgorithmException {
final String currentDate = getYMDString(current);
byte[] signatureKey = getSigningKey(awsSecretKey, currentDate, region);
byte[] signature = hmacSha256(signatureKey, stringToSign);
return bytesToHex(signature);
}
//Signierschlüssel(signing key)
private static byte[] getSigningKey(String key, String date, String region) throws InvalidKeyException, NoSuchAlgorithmException {
//Das Ergebnis jeder Hash-Funktion ist die Eingabe der nächsten Hash-Funktion
byte[] kSecret = ("AWS4" + key).getBytes(StandardCharsets.UTF_8);
byte[] kDate = hmacSha256(kSecret, date);
byte[] kRegion = hmacSha256(kDate, region);
byte[] kService = hmacSha256(kRegion, SERVICE);
byte[] kSigning = hmacSha256(kService, AWS_4_REQUEST);
return kSigning;
}
//Autorisierungsheaderwert
private static String buildAuthorizationString(String awsAccessKey, String region, String signature, String signedHeaders, Date current) {
return HMAC_ALGORITHM + " "
+ "Credential=" + awsAccessKey + "/" + getYMDString(current) + "/" + region + "/" + SERVICE + "/" + AWS_4_REQUEST + ","
+ "SignedHeaders=" + signedHeaders + ","
+ "Signature=" + signature;
}
//Hash-Funktion SHA-256
private static String sha256(String data) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(data.getBytes(StandardCharsets.UTF_8));
byte[] digest = messageDigest.digest();
return String.format("%064x", new java.math.BigInteger(1, digest));
}
// HMAC-SHA256 Funktion
private static byte[] hmacSha256(byte[] key, String data) throws NoSuchAlgorithmException, InvalidKeyException {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(key, "HmacSHA256"));
return mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
}
//Konvertieren Sie Binärwerte in eine hexadezimale Darstellung
private static String bytesToHex(byte[] data) {
final char[] hexCode = "0123456789ABCDEF".toCharArray();
StringBuilder r = new StringBuilder(data.length * 2);
for (byte b : data) {
r.append(hexCode[(b >> 4) & 0xF]);
r.append(hexCode[(b & 0xF)]);
}
return r.toString().toLowerCase();
}
// x-amz-Datums- und Zeitzeichenfolge für den Datumsheader(JJJJMMTT in UTC'T'HHMMSS'Z'ISO 8601-Format)
private static String getXAmzDateString(Date date) {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); // ISO 8601
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.format(date);
}
//Datumszeichenfolge JJJJMMTT-Format
private static String getYMDString(Date date) {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.format(date);
}
}
src/main/java/JsonUtil.java
//Verwenden Sie die externe Bibliothek Jackson
import com.fasterxml.jackson.core.json.JsonWriteFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;
/**
*JSON-Operationsklasse.
*/
public class JsonUtil {
/**
*Generieren Sie eine JSON-Zeichenfolge aus dem Objekt.
* @param obj Objekt
* @JSON-String zurückgeben
* @throws IOException
*/
public String objectToJson(Map<String, Object> obj) throws IOException {
StringWriter out = new StringWriter();
ObjectMapper mapper = new ObjectMapper();
//Unicode-Escape mit Ausnahme von ASCII-Zeichen
mapper.configure(JsonWriteFeature.ESCAPE_NON_ASCII.mappedFeature(), true);
mapper.writerWithDefaultPrettyPrinter().writeValue(out, obj);
return out.toString();
}
/**
*Erleichtern Sie das Lesen von JSON.
* @param json JSON-Zeichenfolge
* @Rückgabe der einfach zu lesenden JSON-Zeichenfolge
* @throws IOException
*/
public String prettyPrint(String json) throws IOException {
StringWriter out = new StringWriter();
ObjectMapper mapper = new ObjectMapper();
mapper.writerWithDefaultPrettyPrinter().writeValue(out, mapper.readValue(json, Map.class));
return out.toString();
}
}
Ausführungsumgebung: macOS Catalina + Java 15 (AdoptOpenJDK 15) + Gradle 6.6.1
$ gradle run
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :run
=====Suche nach Produkten nach Stichwort:Anfrage=====
{
"PartnerType" : "Associates",
"PartnerTag" : "XXXXX-22",
"Keywords" : "\u30B7\u30A7\u30A4\u30AF\u30B9\u30D4\u30A2",
"SearchIndex" : "All",
"ItemCount" : 3,
"Resources" : [ "ItemInfo.Title", "ItemInfo.ByLineInfo", "ItemInfo.ProductInfo", "ItemInfo.ProductInfo", "Images.Primary.Large", "Images.Primary.Medium", "Images.Primary.Small" ]
}
=====Suche nach Produkten nach Stichwort:Antwort=====
{
"SearchResult" : {
"Items" : [ {
"ASIN" : "B06ZZH149Y",
"DetailPageURL" : "https://www.amazon.co.jp/dp/B06ZZH149Y?tag=XXXXX-22&linkCode=osi&th=1&psc=1",
"Images" : {
"Primary" : {
"Large" : {
"Height" : 500,
"URL" : "https://m.media-amazon.com/images/I/41Ms+C0NwNL.jpg ",
"Width" : 311
},
"Medium" : {
"Height" : 160,
"URL" : "https://m.media-amazon.com/images/I/41Ms+C0NwNL._SL160_.jpg ",
"Width" : 100
},
"Small" : {
"Height" : 75,
"URL" : "https://m.media-amazon.com/images/I/41Ms+C0NwNL._SL75_.jpg ",
"Width" : 47
}
}
},
"ItemInfo" : {
"ByLineInfo" : {
"Contributors" : [ {
"Locale" : "ja_JP",
"Name" : "Shoichiro Kawai",
"Role" : "Geschrieben von",
"RoleType" : "author"
} ],
"Manufacturer" : {
"DisplayValue" : "Shodensha",
"Label" : "Manufacturer",
"Locale" : "ja_JP"
}
},
"ProductInfo" : {
"IsAdultProduct" : {
"DisplayValue" : false,
"Label" : "IsAdultProduct",
"Locale" : "en_US"
},
"ReleaseDate" : {
"DisplayValue" : "2017-04-21T00:00:00.000Z",
"Label" : "ReleaseDate",
"Locale" : "en_US"
}
},
"Title" : {
"DisplayValue" : "Alle Shakespeare-Werke sind in der Inhaltsangabe zu lesen(Shodensha neues Buch)",
"Label" : "Title",
"Locale" : "ja_JP"
}
}
}, {
"ASIN" : "B015BY1Q6Q",
"DetailPageURL" : "https://www.amazon.co.jp/dp/B015BY1Q6Q?tag=XXXXX-22&linkCode=osi&th=1&psc=1",
"Images" : {
"Primary" : {
"Large" : {
"Height" : 500,
"URL" : "https://m.media-amazon.com/images/I/516XD+o35gL.jpg ",
"Width" : 375
},
"Medium" : {
"Height" : 160,
"URL" : "https://m.media-amazon.com/images/I/516XD+o35gL._SL160_.jpg ",
"Width" : 120
},
"Small" : {
"Height" : 75,
"URL" : "https://m.media-amazon.com/images/I/516XD+o35gL._SL75_.jpg ",
"Width" : 56
}
}
},
"ItemInfo" : {
"ByLineInfo" : {
"Contributors" : [ {
"Locale" : "ja_JP",
"Name" : "Mel Gibson",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Glen Close",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Alan Bates",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Paul Scofield",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Franco Zephyrelli",
"Role" : "unter der Regie von",
"RoleType" : "director"
}, {
"Locale" : "ja_JP",
"Name" : "Christopher Devore",
"Role" : "Writer",
"RoleType" : "writer"
} ]
},
"ProductInfo" : {
"IsAdultProduct" : {
"DisplayValue" : false,
"Label" : "IsAdultProduct",
"Locale" : "en_US"
},
"ReleaseDate" : {
"DisplayValue" : "2015-09-16T00:00:00.000Z",
"Label" : "ReleaseDate",
"Locale" : "en_US"
}
},
"Title" : {
"DisplayValue" : "Weiler(Untertitelversion)",
"Label" : "Title",
"Locale" : "ja_JP"
}
}
}, {
"ASIN" : "B07WPXRT5W",
"DetailPageURL" : "https://www.amazon.co.jp/dp/B07WPXRT5W?tag=XXXXX-22&linkCode=osi&th=1&psc=1",
"Images" : {
"Primary" : {
"Large" : {
"Height" : 375,
"URL" : "https://m.media-amazon.com/images/I/51CnJBKwu5L.jpg ",
"Width" : 500
},
"Medium" : {
"Height" : 120,
"URL" : "https://m.media-amazon.com/images/I/51CnJBKwu5L._SL160_.jpg ",
"Width" : 160
},
"Small" : {
"Height" : 56,
"URL" : "https://m.media-amazon.com/images/I/51CnJBKwu5L._SL75_.jpg ",
"Width" : 75
}
}
},
"ItemInfo" : {
"ByLineInfo" : {
"Contributors" : [ {
"Locale" : "ja_JP",
"Name" : "Mark Benton",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Joe Joiner",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Amber Aga",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Richard Signy",
"Role" : "unter der Regie von",
"RoleType" : "director"
}, {
"Locale" : "ja_JP",
"Name" : "Ian Barber",
"Role" : "unter der Regie von",
"RoleType" : "director"
}, {
"Locale" : "ja_JP",
"Name" : "Will Trotter",
"Role" : "Produzieren",
"RoleType" : "producer"
} ]
},
"ProductInfo" : {
"IsAdultProduct" : {
"DisplayValue" : false,
"Label" : "IsAdultProduct",
"Locale" : "en_US"
}
},
"Title" : {
"DisplayValue" : "Episode 1",
"Label" : "Title",
"Locale" : "ja_JP"
}
}
} ],
"SearchURL" : "https://www.amazon.co.jp/s?k=%E3%82%B7%E3%82%A7%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%94%E3%82%A2&rh=p_n_availability%3A-1&tag=XXXXX-22&linkCode=osi",
"TotalResultCount" : 146
}
}
=====Erhalten Sie Produktinformationen von ASIN:Anfrage=====
{
"PartnerType" : "Associates",
"PartnerTag" : "XXXXX-22",
"Resources" : [ "ItemInfo.Title", "ItemInfo.ByLineInfo" ],
"ItemIds" : [ "4391641585", "B010EB1HR4", "B0125SPF90", "B07V52KSGT" ]
}
=====Erhalten Sie Produktinformationen von ASIN:Antwort=====
{
"ItemsResult" : {
"Items" : [ {
"ASIN" : "4391641585",
"DetailPageURL" : "https://www.amazon.co.jp/dp/4391641585?tag=XXXXX-22&linkCode=ogi&th=1&psc=1",
"ItemInfo" : {
"ByLineInfo" : {
"Contributors" : [ {
"Locale" : "ja_JP",
"Name" : "So X.",
"Role" : "Aufsicht",
"RoleType" : "consultant_editor"
}, {
"Locale" : "ja_JP",
"Name" : "Hausfrau und Lifestyle-Unternehmen",
"Role" : "Bearbeiten",
"RoleType" : "editor"
} ],
"Manufacturer" : {
"DisplayValue" : "Hausfrau und Lifestyle-Unternehmen",
"Label" : "Manufacturer",
"Locale" : "ja_JP"
}
},
"Title" : {
"DisplayValue" : "Sumikko Gurashi Test Offizieller Leitfaden Sumikko Gurashi Enzyklopädie(Lebensreihe)",
"Label" : "Title",
"Locale" : "ja_JP"
}
}
}, {
"ASIN" : "B010EB1HR4",
"DetailPageURL" : "https://www.amazon.co.jp/dp/B010EB1HR4?tag=XXXXX-22&linkCode=ogi&th=1&psc=1",
"ItemInfo" : {
"ByLineInfo" : {
"Brand" : {
"DisplayValue" : "Hostess Entertainmen",
"Label" : "Brand",
"Locale" : "ja_JP"
},
"Contributors" : [ {
"Locale" : "ja_JP",
"Name" : "Halloween",
"Role" : "Künstler",
"RoleType" : "artist"
} ],
"Manufacturer" : {
"DisplayValue" : "Hostess",
"Label" : "Manufacturer",
"Locale" : "ja_JP"
}
},
"Title" : {
"DisplayValue" : "Guardian Shinden Kapitel 2<Erweiterte Ausgabe>(Remaster)",
"Label" : "Title",
"Locale" : "ja_JP"
}
}
}, {
"ASIN" : "B0125SPF90",
"DetailPageURL" : "https://www.amazon.co.jp/dp/B0125SPF90?tag=XXXXX-22&linkCode=ogi&th=1&psc=1",
"ItemInfo" : {
"ByLineInfo" : {
"Brand" : {
"DisplayValue" : "Rubine Japan(RUBIE'S JAPAN)",
"Label" : "Brand",
"Locale" : "ja_JP"
},
"Manufacturer" : {
"DisplayValue" : "Rubine Japan(RUBIE'S JAPAN)",
"Label" : "Manufacturer",
"Locale" : "ja_JP"
}
},
"Title" : {
"DisplayValue" : "Halloween Schaukelkürbis Wohnaccessoire H 130cm",
"Label" : "Title",
"Locale" : "ja_JP"
}
}
}, {
"ASIN" : "B07V52KSGT",
"DetailPageURL" : "https://www.amazon.co.jp/dp/B07V52KSGT?tag=XXXXX-22&linkCode=ogi&th=1&psc=1",
"ItemInfo" : {
"ByLineInfo" : {
"Contributors" : [ {
"Locale" : "ja_JP",
"Name" : "Lian Reese",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Jamie Lee Curtis",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Will Patton",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Judy Greer",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Virginia Gardner",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Jefferson Hall",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Andy Mattichuck",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Nick Castle",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "James Jude Courtney",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "Hulk Birginer",
"Role" : "Aussehen",
"RoleType" : "actor"
}, {
"Locale" : "ja_JP",
"Name" : "David Gordon Green",
"Role" : "unter der Regie von",
"RoleType" : "director"
}, {
"Locale" : "ja_JP",
"Name" : "David Gordon Green",
"Role" : "Writer",
"RoleType" : "writer"
}, {
"Locale" : "ja_JP",
"Name" : "Danny McBride",
"Role" : "Writer",
"RoleType" : "writer"
}, {
"Locale" : "ja_JP",
"Name" : "Jeff Floodley",
"Role" : "Writer",
"RoleType" : "writer"
}, {
"Locale" : "ja_JP",
"Name" : "Marek Acad",
"Role" : "Produzieren",
"RoleType" : "producer"
}, {
"Locale" : "ja_JP",
"Name" : "Jason Bram",
"Role" : "Produzieren",
"RoleType" : "producer"
}, {
"Locale" : "ja_JP",
"Name" : "Rechnungsblock",
"Role" : "Produzieren",
"RoleType" : "producer"
} ]
},
"Title" : {
"DisplayValue" : "Halloween(Untertitelversion)",
"Label" : "Title",
"Locale" : "ja_JP"
}
}
} ]
}
}
BUILD SUCCESSFUL in 13s
2 actionable tasks: 2 executed
Recommended Posts