使用 Merchant API 審查產品

產品評論是顧客購物體驗的重要一環。這些評分和評論有助於顧客研究產品與決定消費,正面的產品評論可吸引更多符合條件的顧客瀏覽賣家的產品頁面。來源包括賣家、評論集結網站、評論網站和 Google 使用者。

本頁說明如何使用 Merchant API 管理產品評論。

必要條件

Google 需要你提供特定資訊。你必須具備以下條件:

  • Google Merchant Center 中有效的產品評論動態饋給。
  • 帳戶必須加入產品評分計畫。你可以使用計畫子 API 以程式輔助方式檢查資格,也可以透過 Merchant Center 檢查。如不符合資格,請進一步瞭解如何加入產品評分計畫
  • 如要使用 Merchant API 檢查產品,請在 Shopping API 支援表單的「問題/疑問為何?」下方提交許可清單要求。

建立資料來源

使用 datasource.create 方法建立產品評論動態饋給。如果現有商家或產品評論動態饋給可用,請使用 accounts.dataSources.list 擷取 accounts.dataSources.name。在每個評論的本機資料庫中,儲存您建立或擷取的資料來源名稱。要求的格式如下:

POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources

範例

以下範例顯示一般要求和回應:

要求

POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
  "displayName": "My API Data Source",
  "primaryProductDataSource": {}
}

回應

{
  "name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
  "dataSourceId": "{DATASOURCE_ID}",
  "displayName": "My API Data Source",
  "primaryProductDataSource": {},
  "input": "API"
}

詳情請參閱「建立產品評論資料來源」。

建立產品評論

你可以使用 accounts.productreviews.insert 方法建立或更新產品評論。accounts.productreviews.insert 方法會將 productreview 資源和資料來源名稱做為輸入內容。如果成功,系統會傳回新的或更新的 productreview。如要建立產品評論,你必須擁有 datasource.name

要求形式:

POST https://merchantapi.googleapis.com/reviews/v1alpha/{parent=accounts/{ACCOUNT_ID}/}productReviews:insert

以下範例要求說明如何建立產品評論。

POST https://merchantapi.googleapis.com/reviews/v1alpha/accounts/{ACCOUNT_ID}/productReviews:insert?dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}

  productReviewId = 'my_product_review'
  productReviewAttributes {
    aggregatorName = 'aggregator_name'
    subclientName = 'subclient_name'
    publisherName = 'publisher_name'
    publisherFavicon = 'https://www.google.com/favicon.ico'
    reviewerId = 'reviewer_id'
    reviewerIsAnonymous = false
    reviewerUsername = 'reviewer_username'
    reviewLanguage = 'en'
    reviewCountry = 'US'
    reviewTime = '2024-04-01T00:00:00Z'
    title = 'Incredible product'
    content = 'This is an incredible product.'
    pros = ['pro1', 'pro2']
    cons = ['con1', 'con2']
    reviewLink = {
      type = 'SINGLETON'
      link = 'https://www.google.com'
    }
    reviewerImageLinks = ['https://www.google.com/reviewer.png']
    minRating = 1
    maxRating = 10
    rating = 8.5
    productNames = ['product_name']
    productLinks = ['https://www.google.com/product']
    asins = ['asin1', 'asin2']
    gtins = ['gtin1', 'gtin2']
    mpns = ['mpn1', 'mpn2']
    skus = ['sku1', 'sku2']
    brands = ['brand1', 'brand2']
    isSpam = false
    collectionMethod = 'POST_FULFILLMENT'
    transactionId = 'transaction_id'
  }

建立產品評論後,評論可能需要幾分鐘才會發布。

以下是可非同步插入多則產品評論的範例:

Java

import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.protobuf.Timestamp;
import com.google.shopping.merchant.reviews.v1alpha.InsertProductReviewRequest;
import com.google.shopping.merchant.reviews.v1alpha.ProductReview;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewAttributes;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewAttributes.ReviewLink;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewAttributes.ReviewLink.Type;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceClient;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceSettings;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to insert multiple product reviews asynchronously. */
public class InsertProductReviewsAsyncSample {

  private static String generateRandomString() {
    String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    Random random = new Random();
    StringBuilder sb = new StringBuilder(8);
    for (int i = 0; i < 8; i++) {
      sb.append(characters.charAt(random.nextInt(characters.length())));
    }
    return sb.toString();
  }

  // Returns a product review with a random ID.
  private static ProductReview createProductReview(String accountId) {
    // MAKE SURE YOU PASS AN ACTUAL PRODUCT REVIEW ID HERE.
    String productReviewId = generateRandomString();

    ProductReviewAttributes attributes =
        ProductReviewAttributes.newBuilder()
            .setTitle("Would not recommend!")
            .setContent("Not fantastic.")
            .setMinRating(1)
            .setMaxRating(5)
            .setRating(2)
            .setReviewTime(Timestamp.newBuilder().setSeconds(123456789).build())
            .addProductLinks("exampleproducturl.com")
            .setReviewLink(
                ReviewLink.newBuilder()
                    .setLink("examplereviewurl.com")
                    // The review page contains only this single review.
                    .setType(Type.SINGLETON)
                    .build())
            .addGtins("9780007350896")
            .addGtins("9780007350897")
            .build();

    return ProductReview.newBuilder()
        .setProductReviewId(productReviewId)
        .setProductReviewAttributes(attributes)
        .build();
  }

  public static void asyncInsertProductReviews(String accountId, String dataSourceId)
      throws Exception {
    GoogleCredentials credential = new Authenticator().authenticate();

    ProductReviewsServiceSettings productReviewsServiceSettings =
        ProductReviewsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    try (ProductReviewsServiceClient productReviewsServiceClient =
        ProductReviewsServiceClient.create(productReviewsServiceSettings)) {

      // Arbitrarily creates five product reviews with random IDs.
      List<InsertProductReviewRequest> requests = new ArrayList<>();
      for (int i = 0; i < 5; i++) {
        InsertProductReviewRequest request =
            InsertProductReviewRequest.newBuilder()
                .setParent(String.format("accounts/%s", accountId))
                .setProductReview(createProductReview(accountId))
                // Must be a product reviews data source. In other words, a data source whose "type"
                // is ProductReviewDataSource.
                .setDataSource(String.format("accounts/%s/dataSources/%s", accountId, dataSourceId))
                .build();
        requests.add(request);
      }

      // Inserts the product reviews.
      List<ApiFuture<ProductReview>> futures =
          requests.stream()
              .map(
                  request ->
                      productReviewsServiceClient.insertProductReviewCallable().futureCall(request))
              .collect(Collectors.toList());

      // Creates callback to handle the responses when all are ready.
      ApiFuture<List<ProductReview>> responses = ApiFutures.allAsList(futures);
      ApiFutures.addCallback(
          responses,
          new ApiFutureCallback<List<ProductReview>>() {
            @Override
            public void onSuccess(List<ProductReview> results) {
              System.out.println("Inserted product reviews below:");
              System.out.println(results);
            }

            @Override
            public void onFailure(Throwable throwable) {
              System.out.println(throwable);
            }
          },
          MoreExecutors.directExecutor());
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    asyncInsertProductReviews(config.getAccountId().toString(), "YOUR_DATA_SOURCE_ID");
  }
}

擷取產品評論

如要查看產品評論,請使用 accounts.productreviews.get。這是唯讀。 您必須在名稱欄位中提供 accountId 和產品評論 ID。GET 方法會傳回對應的產品評論資源。

GET https://merchantapi.googleapis.com/reviews/v1alpha/{name=accounts/{ACCOUNT_ID}/productReviews/*}

以下是可供您用來擷取產品評論的範例:

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.reviews.v1alpha.GetProductReviewRequest;
import com.google.shopping.merchant.reviews.v1alpha.ProductReview;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceClient;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to get a product review. */
public class GetProductReviewSample {

  public static void getProductReview(String accountId, String productReviewId) throws Exception {
    GoogleCredentials credential = new Authenticator().authenticate();

    ProductReviewsServiceSettings productReviewsServiceSettings =
        ProductReviewsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    try (ProductReviewsServiceClient productReviewsServiceClient =
        ProductReviewsServiceClient.create(productReviewsServiceSettings)) {

      GetProductReviewRequest request =
          GetProductReviewRequest.newBuilder()
              .setName(String.format("accounts/%s/productReviews/%s", accountId, productReviewId))
              .build();

      System.out.println("Sending get product review request:");
      ProductReview response = productReviewsServiceClient.getProductReview(request);
      System.out.println("Product review retrieved successfully:");
      System.out.println(response.getName());
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    String productReviewId = "YOUR_PRODUCT_REVIEW_ID";
    getProductReview(config.getAccountId().toString(), productReviewId);
  }
}

列出產品評論

您可以使用 productreviews.list 方法查看所有建立的產品評論。

GET https://merchantapi.googleapis.com/reviews/v1alpha/{parent=accounts/{ACCOUNT_ID}}/productReviews

以下是範例,可用於列出產品的所有評論:

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.reviews.v1alpha.ListProductReviewsRequest;
import com.google.shopping.merchant.reviews.v1alpha.ProductReview;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceClient;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceClient.ListProductReviewsPagedResponse;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to list all the product reviews in a given account. */
public class ListProductReviewsSample {

  public static void listProductReviews(String accountId) throws Exception {
    GoogleCredentials credential = new Authenticator().authenticate();

    ProductReviewsServiceSettings productReviewsServiceSettings =
        ProductReviewsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    try (ProductReviewsServiceClient productReviewsServiceClient =
        ProductReviewsServiceClient.create(productReviewsServiceSettings)) {

      ListProductReviewsRequest request =
          ListProductReviewsRequest.newBuilder()
              .setParent(String.format("accounts/%s", accountId))
              .build();

      System.out.println("Sending list product reviews request:");
      ListProductReviewsPagedResponse response =
          productReviewsServiceClient.listProductReviews(request);

      int count = 0;

      // Iterates over all rows in all pages and prints all product reviews.
      for (ProductReview element : response.iterateAll()) {
        System.out.println(element);
        count++;
      }
      System.out.print("The following count of elements were returned: ");
      System.out.println(count);
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    listProductReviews(config.getAccountId().toString());
  }
}

刪除產品評論

如要刪除產品評論,請使用 accounts.productreviews.delete。與 GET 方法類似,這個方法需要建立期間傳回的產品評論名稱欄位。

DELETE https://merchantapi.googleapis.com/reviews/v1alpha/{name=accounts/{ACCOUNT_ID}/productReviews/*}

以下是刪除產品評論的範例:

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.reviews.v1alpha.DeleteProductReviewRequest;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceClient;
import com.google.shopping.merchant.reviews.v1alpha.ProductReviewsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to delete a product review. */
public class DeleteProductReviewSample {

  public static void deleteProductReview(String accountId, String productReviewId)
      throws Exception {
    GoogleCredentials credential = new Authenticator().authenticate();

    ProductReviewsServiceSettings productReviewsServiceSettings =
        ProductReviewsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    try (ProductReviewsServiceClient productReviewsServiceClient =
        ProductReviewsServiceClient.create(productReviewsServiceSettings)) {

      DeleteProductReviewRequest request =
          DeleteProductReviewRequest.newBuilder()
              .setName(String.format("accounts/%s/productReviews/%s", accountId, productReviewId))
              .build();

      System.out.println("Sending delete product review request:");
      productReviewsServiceClient.deleteProductReview(request);
      System.out.println("Product review deleted successfully");
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    String productReviewId = "YOUR_PRODUCT_REVIEW_ID";
    deleteProductReview(config.getAccountId().toString(), productReviewId);
  }
}

產品評論狀態

產品評論資源包含的狀態與其他 API 類似,是資源不可或缺的一部分,且遵循相同的問題和目的地結構。