完整的 1688→Ozon 跨境上货流程:从1688抓取商品数据和图片,OCR+翻译图片中文为俄语,生成Rich-Контент富文本详情,再通过Ozon API绕过Web前端直接上架。
这是用户经过验证的、针对 Ozon 跨境电商的上架全流程操作指南。必须严格按照此流程执行,不要启动 Web UI,直接使用命令行和 Python 脚本调用 API。
/v3/product/import(如为了更新图片)会覆盖所有属性为提交时传入的值/v1/product/attributes/update 补回所有属性{"content": [...], "version": 0.3}imgLink, text: {content: null}, title: {content: null}text: {content: null}description-category/tree API) 和对应的属性(type_id)进行填报,严禁自行捏造分类或直接代填空字典。~/ozon_pipeline/ali_translate_image.py),自动去水印+翻译中文为俄语,效果最好。备选方案:豆包图生图、NanoBanana(余额有限)。先用 OCR 预过滤(Tesseract),有中文的图片(含 [\u4e00-\u9fff])必须翻译。不包含中文的图片直接复制,跳过翻译以节省 API 额度。如果 OCR 漏判了带有艺术字的中文字符图片,必须强制调用接口翻译。/v1/media/upload 或 base64 上传经常报错 404,必须将所有翻译后的图片提前上传到公共免费图床生成公开外链,再通过 API 绑定。litterbox.catbox.moe, uguu.se, 或 imgur.com 作为富文本图片的图床!这些图床在俄罗斯被墙(或拦截了 Ozon 抓取),会导致 API 成功但俄罗斯买家前台看到的是破损图片/显示出错!freeimage.host 或等效方案),但真实 API key / upload token 必须从本地私有配置读取,绝不能写进 skill、仓库、日志或截图。最终售价 = (采购成本 + 运费 10 CNY) / 0.8 / 0.7原价 (old_price) = 最终售价 * 2/v2/product/unarchive 或 /v1/product/unarchive 将其解封。注意必须传 product_id。/v1/product/attributes/update 更新进 Ozon。
~/ozon_pipeline/products/{offer_id} 的目录释放空间。raImage 组件!如果你仅使用 raImage 插入图片,Ozon 后端会报错或默默清空商品详情导致显示空白。raShowcase 嵌套组件,外层必须包含 content 数组和 version: 0.3:{
"content": [
{
"widgetName": "raShowcase",
"type": "roll",
"blocks": [
{
"imgLink": "",
"img": {
"src": "图片URL1",
"srcMobile": "图片URL1",
"widthMobile": 800,
"heightMobile": 800
},
"text": {"content": null},
"title": {"content": null}
}
],
"text": {"content": null}
}
],
"version": 0.3
}
[{widgetName:...}] 数组而不包裹在 {content:[...], version:0.3} 里,Ozon 会报 invalid_rich_content_json 并静默清空!dictionary_value_id 而非手写文本。"Нет бренда" 的具体 ID 必须通过 /v1/description-category/attribute/values/search 在运行时动态查询,不要在公开 skill 中硬编码。# 开头,仅包含字母和数字,2个以上单词用下划线 _ 连接。每个标签最大 30 字符,最多 30 个标签。product_data.json 返回缓存 JSON 而不是 HTML ({"raw_api": {...}}),请在 Python 里从 data['raw_api'] 解析商品信息(如 title 和 price_text)。offerdetails.1688.com 或 detailUrl 包含 desc 或 icoss 的外接动态 JSON/JS 接口(例如 itemcdn.tmall.com/1688offer/)。提取出真正的动态描述请求文件,通过 requests.get 拉取后获得带有真实图片 URL 的内容,然后正则提取 https://cbu01.alicdn.com/img/ibank/... 即可获得真正的详情长图序列。遇到抓不到详情时,绝对不能毫无排查就直接宣称“只有主图”。requests 或无头浏览器完全被 1688 的“验证码拦截”或“安全验证”页面阻断,导致无法获取详情图,必须指示用户在本地终端运行带界面 (headed) 的 Playwright 脚本(如 fetch_1688_playwright.py)。脚本应包含循环检测逻辑(while "验证码" in title or "登录" in title:),弹出真实浏览器让用户手动拖动滑块或扫码,验证通过后程序自动接管抓取。绝不能轻易放弃抓取详情图。chi_sim) 经常对特殊的彩色边框艺术字、手写体、变体字(尤其是卡通玩具类产品)漏判,导致判断为“无中文”而跳过翻译。如果产品图包含大量解说或用户坚持指出图中有字,绝对不要相信 Tesseract 的 False 判断,直接将提取到的原图过一遍 apipudding [官逆C]Nano banana 2 强行翻译。[\u4e00-\u9fff])。如果发现残留中文:
apipudding.com 直连网关 (Model: [官逆C]Nano banana 2,注意有前缀 [官逆C])。代码中的 translate_image_nano_banana(img_path, output_path) 仅接受 2 个参数,提示词已硬编码在函数内。Ozon 强制要求主图比例为 3:4!如果 1688 抓取的是 1:1 主图,在调用 API 翻译前,必须先用 Python 图像库(Pillow/CV2)上下填充背景/留白将其改造为 3:4 比例(即 高度 = 宽度 * 4/3),再发给大模型翻译。提示词:「把图片中的中文翻译成俄语。保持3:4比例」。详情图则保持原图(长图)自带比例不变。s.trust_env = False)。POST https://api-seller.ozon.ru/v1/description-category/tree。error_attribute_values_out_of_range 错误。必须调用 POST /v1/description-category/attribute/values/search,传参 "value": "Нет бренда" 动态查出当前有效的 dictionary_value_id。/v1/product/pictures/import 或在 /v3/product/import 创建时直接传入 images 数组。/v1/product/unarchive 解封产品。{"product_id": [这里是 Ozon 返回的数字型 Product ID]}。绝对不能使用 {"offer_id": [...]},否则会报 400 (invalid RestoreItemsRequest.ItemIds) 错误。/v1/description-category/attribute):切勿凭经验猜测属性 ID(如把 4194 当作 Комплектация 纯文本提交可能会报错 invalid URL)。必须校验该类目下属性的 type 是否为 String。Rich-контент JSON ID 为 11254,Аннотация (长描述) ID 为 4191。/v1/product/attributes/update payload 关键坑点:attributes 数组里的字段名必须是 id,不是 attribute_id。最小可用 body 形如:
{
"items": [
{
"offer_id": "589236742340",
"attributes": [
{"id": 9048, "complex_id": 0, "values": [{"value": "Карусель с голосовым управлением №1"}]},
{"id": 11254, "complex_id": 0, "values": [{"value": "{\"content\":[...],\"version\":0.3}"}]}
]
}
]
}
/v1/product/attributes/update 成功后返回的是 task_id,后续同样使用 POST /v1/product/import/info 轮询任务状态,直到 status=imported 且 errors=[]。POST /v4/product/info/attributes 验证属性是否真正写入,推荐 body:
{
"filter": {"offer_id": ["589236742340"], "visibility": "ALL"},
"last_id": "",
"limit": 100,
"sort_dir": "ASC"
}
返回结果中的 attributes 列表可直接检查 9048 / 4191 / 11254 / 23171 等是否生效。POST https://api-seller.ozon.ru/v1/product/attributes/update 将富文本推送至服务器。检查无报错即告全部完成。/v2/product/info。当商品在后台显示“不可出售” (Not for sale / Не продается) 时,必须使用 POST /v3/product/info/list 接口进行查询。Payload 格式为 {"offer_id": ["your_id"]}。注意:千万不要同时传 offer_id 和 product_id,否则会报错 400。status 下出现 declined 且错误信息提示“儿童商品类别禁止出现烟草制品图像 (В категории Детские товары запрещено изображение табачной продукции)”,说明产品详情图中含有疑似抽烟的元素被 AI 误判。若遇此情况,建议直接在后台删除或将产品归档处理。