OpenCLI 1688 适配器实战指南:用已登录浏览器把 1688.com 变成可编程 CLI
2026/9/19 2:09:46 网站建设 项目流程

OpenCLI 1688 适配器实战指南:用已登录浏览器把 1688.com 变成可编程 CLI

【免费下载链接】OpenCLIMake Any Website into CLI & Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI

1688 是国内重要的 B2B 货源平台,而 OpenCLI 的1688浏览器适配器让你可以直接复用 Chrome 中已登录的 1688 会话,把商品搜索、详情读取、图文素材提取与批量下载、供应商店铺信息采集全部封装成一行命令,供 AI Agent 与脚本调用。读完本文,你将掌握search / item / assets / download / store五个子命令的完整用法、输出字段含义、底层实现原理与常见故障的排查方法。

适配器概览:定位与边界

1688 适配器属于 OpenCLI 的🔐 Browser(浏览器)模式,域名限定为1688.com。它不是一个独立的爬虫服务,而是"借用"你本机 Chrome 的登录态来完成数据读取的只读适配器。其核心设计原则体现在源码中:

  • 所有子命令都通过cli()注册,声明strategy: Strategy.COOKIE,并依赖 Browser Bridge 扩展安装指南 建立的浏览器桥接通道,见 auth.js 与各命令文件。
  • 数据来源严格限定为公开页面可见内容:不发送询盘、不下单、不访问卖家后台,只提取商品页、搜索页、店铺页渲染出来的字段与素材。

五个子命令速查

命令说明
opencli 1688 search "<query>" --limit <n>搜索公开商品候选,返回价格、起批 MOQ、卖家链接与可见徽章
opencli 1688 item <url-or-offer-id>读取公开商品详情页:价格阶梯、MOQ、发货文案与卖家基础信息
opencli 1688 assets <url-or-offer-id>提取商品页可见的媒体素材(主图、SKU 图、详情图、视频)
opencli 1688 download <url-or-offer-id>批量下载商品页可见的媒体素材
opencli 1688 store <url-or-member-id>读取公开供应商/店铺页:公司信息、入驻年限、类目与可见服务信号

环境准备:前置条件与登录态校验

运行任何 1688 命令前需要满足:

  • Chrome 正在运行且已登录1688.com(浏览器命令复用你的 Chrome 登录会话,见 docs/guide/browser-bridge.md);
  • 已安装 Browser Bridge 扩展(可在仓库根目录extension/下以"加载已解压的扩展程序"方式载入,或用opencli doctor验证扩展与守护进程连通性)。

登录态校验并非只靠肉眼判断。在 auth.js 中,verify1688Identity会依次检查三个关键 Cookie:__cn_logon__=true表示已登录,unb作为用户 ID,lid解码后作为昵称;registerSiteAuthCommands还提供了 1688 专属的 auth 命令(loginUrl指向https://login.1688.com/member/signin.htm)。同时,shared.js 中的isCaptchaState/isLoginState会扫描页面标题与正文,识别滑块验证页(/_____tmd_____/punish标记、请拖动下方滑块完成验证等文案)和登录页(passportlogin.taobao.com等 URL 与请先登录等文案),一旦命中即抛出AuthRequiredError,提示先到共享 Chrome 完成登录/验证再重试。

搜索商品:search 子命令深入解析

基本用法

# 搜索商品 opencli 1688 search "桌面置物架 宿舍 收纳" --limit 10 # JSON 输出 opencli 1688 search "桌面置物架 宿舍 收纳" --limit 10 -f json

参数与约束

参数说明
query(位置参数,必填)搜索关键词,非空校验见buildSearchUrl;URL 编码后拼接到https://s.1688.com/selloffer/offer_search.htm?charset=utf8&keywords=
--limit(整数,可选)结果数量上限,默认 20,上限 100(常量SEARCH_LIMIT_DEFAULT/SEARCH_LIMIT_MAX);非法值抛ArgumentError

结果结构化与去重

normalizeSearchCandidate(search.js)把页面候选归一化为结构化行,关键点:

  • 标识符提取:从规范化后的商品 URL 提取offer_id,从卖家 URL 提取member_idshop_idshop_id即店铺子域名,如yinuoweierfushi);三者是后续流程推荐使用的稳定标识。
  • 价格解析parsePriceText支持¥$及"元",返回price_textprice_minprice_maxcurrency(含¥/判定为 CNY);normalizeInlineText会修正¥ 56 .00¥ 56.00这类排版噪音。
  • MOQ 解析extractMoqText支持N件/个/套/箱/包/双/台/把/只 起批≥NN~M 起批三种形态,同时输出moq_text原文与moq_value数值。
  • 徽章识别extractBadges从容器文本中匹配工厂徽章(源头工厂、深度验厂、实力工厂、工厂档案、加工专区、验厂报告、厂家直销、生产厂家、工厂直供)与服务徽章(延期必赔、品质保障、破损包赔、退货包运费、晚发必赔、7*24小时响应、48小时发货、72小时发货、后天达、包邮、闪电拿样),两组模式常量定义在 shared.js。
  • 销量与回头率extractSalesText识别已售/销量/售 300+套等文本;extractReturnRateText提取回头率52%

去重策略buildDedupeKey按"offer_id优先、item_url兜底"生成键;collectSearchRows会沿搜索结果页下一页链接翻页采集(最多 12 页,MAX_SEARCH_PAGES),跨页去重后截断到limit。对应行为有 search.test.js 的单元测试佐证(含移动端detail.m.1688.com/page/index.html?offerId=链接的 offer id 提取用例)。

默认输出列rank, offer_id, title, item_url, price_text, moq_text, seller_name, member_id, location,可用-f json拿到完整字段(含shop_idseller_urlbadgessales_textreturn_rate_textsource_urlfetched_atstrategy)。

读取商品详情:item 子命令

基本用法

# 按 offer id 读取 opencli 1688 item 841141931191 -f json # 按 URL 读取 opencli 1688 item https://detail.1688.com/offer/841141931191.html -f json

buildDetailUrl会从输入中提取 offer id(支持纯数字、/offer/{id}.html?offerId=三种形态)并规范化为https://detail.1688.com/offer/{id}.html;无法解析时抛出带示例提示的ArgumentError

页面数据来源

readItemPayload通过page.evaluate读取window.context.result.global.globalData.model中的offerTitleModeltradeModelsellerModel,以及window.context.result.data.gallery.fieldsshippingServices.fields,同时抓取页面innerText作为兜底。若解析不出offerId,会报错1688 item page did not expose product context——这正是文档 Troubleshooting 第一条对应的问题。

输出字段(normalizeItemPayload)

字段说明
offer_id/member_id/shop_id三个稳定标识符
title优先取offerTitle,其次去" - 阿里巴巴"后缀,再回退正文首行
item_url规范化的详情页 URL(buildDetailUrl
main_images主图列表(gallery.mainImage/offerImgList/wlImageInfos合并去重)
price_text/price_tiers/currency价格展示文本、价格阶梯normalizePriceTierscurrentPricesbeginAmount+price转成quantity_text/quantity_min/price_text/price)、币种 CNY
moq_text/moq_value起批数量,优先匹配N件 起批,回退trade.beginAmount + unit
seller_name/seller_url/shop_name卖家信息(winportUrl优先,memberId兜底)
origin_place产地(extractLocation依据 34 个省市自治区前缀与正则从正文定位)
delivery_days_text发货时效:优先shipping.deliveryLimitText/logisticsText,其次N小时/天内发货正文,再次服务项中的agreeDeliveryHours
customization_text/private_label_text定制(来样定制/来图定制/可定制…)与贴牌(贴牌/贴标/定制logo/OEM/ODM…)相关行
visible_attributes可见属性键值对(过滤sellPointModel
sales_text/stock_quantity销量文本(全网销量/已售)与库存数量
service_badges服务徽章(含protectionInfosbuyerProtectionModel合并去重)

默认输出列offer_id, title, price_text, moq_text, seller_name, origin_placenormalizeItemPayload的完整映射在 item.test.js 中有覆盖度很高的断言(价格阶梯、产地、发货时效、贴牌文案、可见属性等)。

提取媒体素材:assets 子命令

# 列出可下载的媒体素材 opencli 1688 assets 841141931191 -f json

assets是全适配器技术含量最高的子命令,其实现(assets.js)揭示了 1688 商品页的三个现实:

  1. 详情区在自定义元素v-detail-e的 shadow DOM 内懒渲染,普通 CSS 选择器无法穿透shadowRoot。脚本用queryAllDeep递归遍历所有 shadow root,并沿 host 链(inDetailContainer)判断元素是否归属详情容器(.de-description-detail#detailContentContainer.html-description.desc-lazyload-container)。
  2. 懒加载需要触发渲染readAssetsPayload会先page.autoScroll({ times: 6, delayMs: 500 })滚动到底部,再把详情容器scrollIntoView,随后用waitForDetailImages轮询(最多 10 次、间隔 0.5s)直到详情图片计数连续两次稳定,避免固定等待浪费耗时。
  3. 图片来源多样:主图(#dt-tab img等选择器)、SKU 图(背景图backgroundImage取 computed style)、视频(video[src]video source[src]及脚本内联的.mp4/.m3u8URL 正则),加上window.context页面状态中的gallery数据作为种子。

输出结构为:main_images/sku_images/detail_images/videos/other_images/raw_assets,并附main_countsku_countdetail_countvideo_count计数。默认输出列offer_id, title, main_count, sku_count, detail_count, video_count。文档的 Notes 提醒:assets/download以页面状态与渲染后的 DOM 为准,可能与 1688 官方扩展工作流暴露的每一个文件并非完全一致。

批量下载:download 子命令

# 批量下载页面可见的图片/视频 opencli 1688 download 841141931191 --output ./1688-downloads
# 自定义输出目录 opencli 1688 download https://detail.1688.com/offer/841141931191.html --output ./media

download内部复用extractAssetsForInput拿到素材清单,再由toDownloadItems(download.js)按类型与分组生成文件名:图片为{offerId}_{main|sku|detail|other}_{序号两位补零}{扩展名},视频为{offerId}_video_{序号}{.mp4};扩展名由 URL path 推断,缺省图片.jpg、视频.mp4。下载时把浏览器 Cookie 通过formatCookieHeaderbrowserCookies一并传入downloadMedia@jackwener/opencli/download/media-download),输出目录默认为./1688-downloads,且会按offerId建子目录,单文件超时 60 秒。默认输出列index, type, status, size

读取供应商店铺:store 子命令

基本用法

# 按店铺 URL 读取 opencli 1688 store https://shop52908bfw19166.1688.com/ -f json # 按 member id 读取 opencli 1688 store b2b-22154705262941f196 -f json

resolveStoreUrl(shared.js)支持三种输入形态:member id(b2b-xxx)、完整店铺 URL、纯子域名;统一解析后优先转成移动版店铺页https://winport.m.1688.com/page/index.html?memberId=,非 member id 的 URL 则规范化为主机名(过滤www/detail/s/winport/work/air/dj等通用主机)并剥离spmtracelogutm_*等跟踪参数——canonicalizeItemUrl/canonicalizeSellerUrl也遵循同样的 URL 净化逻辑。

数据拼装流程

store命令(store.js)实际是"三页聚合":

  1. 读取店铺主页bodyText与页内offerLinkscontactLinks
  2. 跳转.../page/contactinfo.html联系方式页,提取地址、电话、手机;
  3. 若拿到任一 offer id,则访问对应商品详情页,从sellerModel取得companyNamememberIdwinportUrl作为种子(readItemSeed),失败仅记录、不中断。

最终输出:member_idshop_idstore_name/company_namestore_urlcompany_urlbusiness_model_text(经营模式/生产加工/主营产品)、years_on_platform_text入驻N年)、locationstaff_size_text(员工人数/员工总数)、factory_badgesservice_badgesresponse_rate_text(响应率/回复率/响应速度)、return_rate_text(回头率)、top_categories(主营拆词)、phone_text/mobile_text默认输出列store_name, years_on_platform_text, location, return_rate_text。若三页均无可提取内容,抛出EmptyResultError提示先在 Chrome 打开店铺页重试。

常见问题排查

  • itemdid not expose product context:先确认当前打开的确实是detail.1688.com商品页;该命令对活动浏览器目标比search/store更敏感。
  • 浏览器目标过宽导致导航错乱:用OPENCLI_CDP_TARGET=detail.1688.com(或更具体的 1688 主机)重试,把 CDP 目标精确到 1688 站点/商品 tab。
  • 遇到滑块或验证页:回到 Chrome 手动刷新真实页面并完成滑块验证后重试;shared.js内置的验证/登录文案识别与buildCaptchaHint提示均围绕此场景设计。
  • 目标被导航或关闭gotoAndReadState会捕获Inspected target navigated or closed等错误并提示打开一个新的 1688 tab 重新指定OPENCLI_CDP_TARGET

使用建议与设计要点

  • 优先使用稳定标识:后续工作流尽量使用offer_idmember_idshop_id,避免 URL 中的spmtracelog等跟踪参数干扰去重与缓存(这些参数会被stripTrackingParams剥离)。
  • 只读边界:适配器只返回/下载公开页面可见的字段与媒体,不发送询盘、不下单、不接触卖家后台数据,适合货源调研、比价、素材归档、供应商尽调等场景。
  • 源码参考:命令实现见 clis/1688/(search.jsitem.jsassets.jsdownload.jsstore.js),公共解析与 URL 规范化集中在 clis/1688/shared.js,登录态校验在 clis/1688/auth.js;各命令均有对应的*.test.js单元测试(如 search.test.js、item.test.js、assets.test.js),可作为字段语义的权威参考。

【免费下载链接】OpenCLIMake Any Website into CLI & Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询