×

乐天 Rakuten 商品详情接口:时区与币种归一化实战方案

Ace Ace 发表于2026-08-31 15:24:19 浏览3 评论0

抢沙发发表评论

前言

很多网上乐天接口示例只做简单请求打印原始 JSON,忽略跨境业务最头疼的两个问题:日本 JST 时区转换、日元价格字段异构。直接拿原始返回数据存入国内 ERP,会出现时间差 9 小时、多规格价格错位等隐性 bug。本文基于乐天官方 IchibaItem 详情接口,封装一套带业务层归一化的调用代码,把原始接口输出转为可直接入库的标准化结构体,适合对日选品、商品同步业务场景博客园。

前置准备

在乐天开发者后台创建应用,获取applicationId,开通 Ichiba 商品读取权限。接口采用 GET 请求,商品唯一标识 itemCode 格式为店铺ID:商品ID,单独传入商品 ID 会返回 404。接口存在 QPS 限制,免费开发者需要做好限流处理,避免触发 429 超限错误博客园。

依赖库:requests,执行pip install requests安装。

点击获取key和secret

python

import requests
import time
from datetime import datetime, timedelta

class RakutenItemDetailClient:
    def __init__(self, app_id):
        self.app_id = app_id
        self.base_url = "https://app.rakuten.co.jp/services/api/IchibaItem/Item/20170426"
        self.session = requests.Session()

    def get_normalized_detail(self, item_code):
        params = {
            "applicationId": self.app_id,
            "itemCode": item_code,
            "format": "json",
            "formatVersion": 2
        }
        try:
            resp = self.session.get(self.base_url, params=params, timeout=10)
            if resp.status_code == 429:
                time.sleep(3)
                resp = self.session.get(self.base_url, params=params, timeout=10)
            resp.raise_for_status()
            raw = resp.json().get("Item", {})
        except requests.exceptions.RequestException as e:
            return {"error": str(e), "success": False}

        # 时区转换:JST(+9)转UTC+8北京时间
        jst_str = raw.get("updateTime", "")
        try:
            jst_dt = datetime.fromisoformat(jst_str)
            cn_dt = jst_dt - timedelta(hours=1)
            update_cn = cn_dt.strftime("%Y-%m-%d %H:%M:%S")
        except Exception:
            update_cn = None

        result = {
            "success": True,
            "item_code": item_code,
            "item_name": raw.get("itemName",""),
            "shop_name": raw.get("shopName",""),
            "price_jpy": raw.get("itemPrice",0),
            "item_url": raw.get("itemUrl",""),
            "image_urls": raw.get("mediumImageUrls",[]),
            "review_avg": raw.get("reviewAverage",0),
            "review_count": raw.get("reviewCount",0),
            "update_time_cn": update_cn,
            "availability": raw.get("availability",0)
        }
        return result

if __name__ == "__main__":
    client = RakutenItemDetailClient(app_id="你的applicationId")
    res = client.get_normalized_detail(item_code="shopxxxx:itemxxxx")
    print(res)

代码核心逻辑解析

1. 会话复用:使用Session保持 http 连接,批量拉取详情时降低网络开销;捕获 429 限流后延时重试,保护开发者配额。
2. 时区归一化:接口返回时间为日本 JST 时区,代码自动换算为国内常用东八区时间,解决直接存库时间错位问题。
3. 字段裁剪:过滤接口返回大量无用扩展字段,只保留选品、ERP 同步需要的核心字段。
4. 异常隔离:网络超时、JSON 解析失败全部封装进 error 字段,业务代码不需要写多层 try‑except。

对接踩坑总结

1.itemCode 格式严格是shopId:itemId,缺少店铺 ID 参数直接返回未找到商品,这是高频错误点博客园。
2.formatVersion 必须设置为 2,V1 版本 JSON 嵌套层级混乱,解析容易出错。
3.availability 字段代表现货状态,等于 1 代表在售,0 代表下架,业务同步要做状态过滤。
4. 免费版接口有日调用上限,批量同步建议控制单线程间隔,不要并发轰炸接口。

群贤毕至

访客