文件预览

get_catalog_item.py

查看 Amazon Store Catalog 技能包中的文件内容。

文件内容

scripts/get_catalog_item.py

#!/usr/bin/env python3
"""
Amazon Store — getCatalogItem (SP-API Catalog Items v2022-04-01 默认)
======================================================================

GET `catalog/{version}/items/{asin}`。默认 **2022-04-01**。

官方参考: https://developer-docs.amazon.com/sp-api/reference/getcatalogitem
"""

from __future__ import annotations

import json
import sys
from urllib.parse import quote

from _spapi_catalog_common import (
    CATALOG_ITEMS_V2020,
    CATALOG_ITEMS_V2022,
    catalog_items_path,
    developer_proxy_get,
    encode_path_segment,
    ensure_auth_skill_available,
    get_store_tokens,
    load_cli_params,
    merge_success_json,
    norm_marketplace_ids,
    require_seller_region,
    resolve_catalog_items_version,
    str_list,
)


def _build_query(params: dict) -> str:
    mids = norm_marketplace_ids(params, max_count=1)
    if not mids:
        print("Missing marketplaceIds (or marketplaceId).", file=sys.stderr)
        sys.exit(1)

    parts: list[str] = [f"marketplaceIds={quote(mids[0], safe='')}"]
    for inc in str_list(params.get("includedData"), "includedData"):
        parts.append(f"includedData={quote(inc, safe='')}")
    if params.get("locale"):
        parts.append(f"locale={quote(str(params['locale']).strip(), safe='')}")
    return "&".join(parts)


def main() -> None:
    params = load_cli_params()
    if not params:
        print(
            "Usage: get_catalog_item.py '<JSON>'\n"
            "Required: sellerId, region, asin, marketplaceIds\n"
            f"Optional: includedData, locale, catalogItemsVersion ({CATALOG_ITEMS_V2022}|{CATALOG_ITEMS_V2020})",
            file=sys.stderr,
        )
        sys.exit(1)

    if not params.get("skipDepCheck"):
        ensure_auth_skill_available("get_catalog_item.py")

    if "asin" not in params:
        print("Missing required field: asin", file=sys.stderr)
        sys.exit(1)

    seller_id, region = require_seller_region(params)
    version = resolve_catalog_items_version(params)
    asin = encode_path_segment(params["asin"])
    path = f"{catalog_items_path(version)}/{asin}"
    qs = _build_query(params)

    tokens = get_store_tokens(seller_id, region)
    if "error" in tokens or "accessToken" not in tokens:
        print(json.dumps(tokens, indent=2, ensure_ascii=False))
        sys.exit(1)

    proxy = developer_proxy_get(region, path, tokens["accessToken"], query_string=qs)
    out: dict = {
        "developerProxy": proxy,
        "resolvedPath": path,
        "queryString": qs,
        "catalogItemsVersion": version,
    }
    merge_success_json(out, proxy, "catalogItem")
    print(json.dumps(out, indent=2, ensure_ascii=False))


if __name__ == "__main__":
    main()