假洋货鉴别(药品 / 保健品)
⚠️ Windows / WorkBuddy 环境须知(先读)
本变体面向 Windows 上的 WorkBuddy(CodeBuddy Code)。开始前先确认两件事:
1) 确认 Python 命令名
python --version # 首选
py -3 --version # 若上一条失败,用 Windows Python 启动器
本文档中的命令一律写成 python。若你的环境只有 py -3,自行替换即可——
四个脚本都只用标准库,任何 Python 3.8+ 都能跑。
2) 路径分隔符
脚本路径用 ${CODEBUDDY_SKILL_DIR} 占位符,由 WorkBuddy 自动替换为该 skill 的绝对路径,
不要手写成 scripts/x.py 这种相对路径——那取决于当前工作目录,会找不到文件。
3) 抓取命令
文档里的 curl 命令在 Windows 10 1803+ 自带 curl.exe,可直接用。
若在 PowerShell 里执行,注意引号规则与 bash 不同;建议在 WorkBuddy 的 Bash 中执行。
4) 缓存目录
lnhpd_search.py 默认把约 140 MB 的加拿大数据库缓存到用户主目录下的 .cache/lnhpd。
Windows 上即 %USERPROFILE%\.cache\lnhpd。若该位置不可写,加参数指定:
python ${CODEBUDDY_SKILL_DIR}/scripts/lnhpd_search.py --brand "LOEON" --cache-dir "%TEMP%\lnhpd"
对"某国进口"的药品/保健品做可验证的产地与身份核查,输出带证据分级的鉴定报告。
何时使用
- 用户发来商品链接/包装照片/品牌名,问"是不是假洋货""是不是真进口""这牌子靠谱吗"
- 需要核实某"XX国品牌"的产地、监管资质、宣称国本土是否真有卖
- 需要复核别人给的"鉴别结论"或软文里的"实证"
不适用:纯临床用药指导、疗效评价。本技能只做身份与合规核查,不做医疗建议。
核心原则(先读;违反会直接导致错误结论)
- 三层分开验。 不要笼统问"是不是假的":
- 身份层:品牌控制主体在不在它宣称的国家?
- 实质层:在该国是否取得合法资质、按当地标准生产?
- 存在层:在该国本土是否真有渠道、消费者、口碑?
- 四级判定(不要只答"是/否"):
级别 含义 A 真洋品牌 本土主体 + 本土资质 + 本土在售 + 本土口碑 B 合法授权贴牌 境外主体真实持有并授权,本国确有销售(规模小) C 伪造洋身份(假洋货) 境外空壳/贸易壳承载品牌,本土几无市场,叙事虚构,主攻中国 D 三无假货 任何国家/地区监管资质都没有 ⚠️ C ≠ D。一个产品完全可能"该国注册号真实存在"却仍是假洋货。大多数争议案落在 C。
- 搜不到 ≠ 不存在。 被反爬拦截(403/人机验证/JS 壳页)的渠道必须标注"未获证据",不得计入否定证据。
- 区分"推论"与"证实"。 没有实物标签时只能说"推论";拿到实物标签才能写"证实"。
- 举证责任在卖方。 你不需要证明"它不是",只需指出其宣称未被证实,或与其自身注册信息矛盾。
- 不要复述网上的"鉴别标准"。 这类"X国品牌鉴别攻略"往往本身就是软文(例:声称"支持本地医保积分抵扣"——加拿大用 PC Optimum 等商业积分,根本没有"医保积分"概念)。一切声称必须自己复核。
- 只用
${CODEBUDDY_SKILL_DIR}/references/endpoints.md里列出的源,且单源只试一次。 那份文件里的端点都实测过并标注了可用性;临场另找站点(药品库、商标聚合站、企业黄页)绝大多数上了反爬,试了也是白试。反例(真实发生):为查德国保健品去查
gelbe-liste.de——那是德国药品库(Arzneimittel),对膳食补充剂本就没什么收录,也不在推荐列表里,结果超时被 SIGTERM 杀掉,白耗一轮。 正确做法:官方库 → 官方 API → 搜索引擎摘要 → 第三方聚合(标注置信度)。每个源的退路都写在 endpoints.md 里。 - SIGTERM ≠ 未获证据。 被本地超时杀掉是任务未完成,不是"某源查无结果"。前者写「本轮未完成,需延长超时重试」,后者才写「未获证据」——两者措辞绝不能混。
工作流
第 0 步:抽取硬信息
从链接/图片抽取:品牌、品名、宣称、成分与剂量、注册号、条码、公司署名、认证徽标。
🔴 输入是淘宝/天猫/京东链接时,先做这件事: 商品页需要登录态,抓不到是正常的——纯 HTTP 只拿到 ~1.7 KB 的 JS 壳页,无头浏览器也会被 重定向到
login.taobao.com。但短链本身可解析(e.tb.cn页内嵌var url='…',能取到商品 ID 与标价)。python ${CODEBUDDY_SKILL_DIR}/scripts/taobao_share.py '【淘宝】https://e.tb.cn/xxxx CZ321 「商品标题…」'你不需要商品页。 按此阶梯取证:① 让用户发商品页截图/包装实拍图(最强)→ ② 用标题+商品 ID 直接开始核查 → ③ 交叉检索同款在其他平台 → ④ 第三方聚合站(标注强度)。
❌ 绝不可把「商品页抓不到」写成「品牌查不到」——前者是访问限制,后者才是核查结论。以"链接被拦截"收尾 = 流程用错了。
反向图片搜索(必做):
- 用 Google Lens / TinEye 搜包装图
- 同一包装图出现在 3 个以上不相关品牌 → 共用模板,典型贴牌
- 只有渲染图、无实拍图 → 可能无真实产品
图片取字要点(小字必须裁剪放大,直接看原图会看错):
python - <<'PY'
from PIL import Image, ImageEnhance, ImageOps
im = Image.open("label.jpg").convert("RGB")
c = im.crop((L,T,R,B)) # 先按预览图比例换算真实像素
w,h = c.size
c = c.resize((w*8, h*8), Image.LANCZOS) # 放大 4~14 倍
c = ImageEnhance.Contrast(ImageOps.autocontrast(c)).enhance(1.8)
c.save("zoom.png")
PY
然后用 read_image zoom.png。
🔴 最优先的一问:包装上有没有该国的注册号? 见
${CODEBUDDY_SKILL_DIR}/references/jurisdictions.md。 若宣称"德国制造"却通篇无一个德文字 → 这产品不是给德国人买的(欧盟 1169/2011 第 15 条要求用销售国语言)。这是极高价值信号。
第 1 步:确定"宣称国",切换对应打法
各国监管结构完全不同,打法必须换(详见 ${CODEBUDDY_SKILL_DIR}/references/jurisdictions.md):
| 宣称国 | 有无产品级公开注册库 | 主攻方向 |
|---|---|---|
| 加拿大 | ✅ NPN / LNHPD | 直接查 NPN,一击命中 |
| 澳大利亚 | ✅ AUST L / ARTG | 查 ARTG 编号 |
| 中国 | ✅ 蓝帽子 | 查注册/备案 + GACC 进口备案 |
| 美国 | ❌ DSHEA 无上市前审批 | 公司注册 + FDA 警告信 + USPTO 商标状态 |
| 德国/欧盟 | ❌ 补充剂按食品管理 | 工商登记"经营范围" + 零售实测 + 健康宣称合规 |
| 英国/香港 | ❌ | Companies House / 公司注册处 + SIC 代码 |
| 日本 | ⚠️ FFC 备案(仅机能性表示食品) | CAA 备案 + 公司登记 + 渠道实测 |
| 韩国 | ✅ MFDS 健康功能食品备案 | 备案编号 + 渠道实测 |
| 新西兰 | ❌ 无需审批 | Companies Register + 渠道实测 |
第 2 步:查主体(最容易被跳过、也最致命)
关键动作:查宣称国工商登记的「经营范围 / Nature of business / Gegenstand」。
一个"保健品品牌"背后的公司,其法定经营范围是不是生产保健品? 实战命中:某"德国"叶酸标注的"生产企业",德国登记经营范围是"食品、尤其各类饮料的进出口"——一家葡萄酒贸易商。一家贸易商不可能是胶囊的生产企业。
同时看:
- 成立日期 vs 宣称历史(例:官网称"1989 年创立、过去 21 年",而许可主体 2020 年才成立 → 叙事自相矛盾)
- 空壳地址特征:英国 Croydon/Brighton Road 批量注册地址、中国"集群注册"、SIC 99999 = Dormant(休眠公司)、年报逾期
- 董事/股东姓名:是否为宣称国本地人
- 商标状态:是否 DEAD / 放弃 / 驳回(例:某品牌的 USPTO 申请 2021 年已放弃)
第 3 步:查宣称国本土渠道
逐个实测,区分"有商品页"与"可下单":
- 主流电商(Amazon 各国站、Walmart、Shop Apotheke、DocMorris…)
- 线下连锁(Rossmann、dm、Shoppers…)
- 行业协会/展会名录(如加拿大 CHFA)
- 注意:同一家店的不同域名(如
apotheke-am-theater.de与internet-apotheke-freiburg.de)可能是同一家,不要重复计数
判读口径:"有 PZN / 有条目但显示不可订购、且缺该国强制标示"≈ 为留下本国痕迹而铺的条目,不是正常在售。
第 4 步:标签法证
见 ${CODEBUDDY_SKILL_DIR}/references/label-forensics.md。必查六项:
- 注册号是否印在包装上(加拿大 NHP 标签必须印 NPN)
- 语言:是否使用销售国语言
- %NRV 算术:
${CODEBUDDY_SKILL_DIR}/scripts/nrv_check.py一键核对——标签引用了法规却算错是贴牌套模板的铁证 - 剂量 vs 安全上限(UL):
${CODEBUDDY_SKILL_DIR}/scripts/nrv_check.py --ul核对(实战:某产品维生素 B6 日剂量 50 mg,而 EFSA 2023 年已将 UL 下调至 12 mg/日 → 超 4 倍且无警示)⚠️ 务必区分「UL」与「建议上限 / 指导水平」。维生素 B12、K、生物素、泛酸、B1、B2、钾在 IOM/EFSA 均没有 UL;网上常见的 1000 µg 维生素 K、900 µg 生物素、100 mg B1 等是英国 EVM 指导水平 / 欧盟建议上限,不是 UL。把它们当 UL 会把正常的复合 B 族、生物素产品误判为"超标"(假阳性)。脚本已分开输出:真 UL 在
UL表,非 UL 参考值在SOFT_LIMITS表。 - 宣称合法性:有没有疾病治疗宣称(欧盟 1924/2006 禁止;中国同样禁止)
- 机械翻译痕迹:"Add Betaine"(=添加甜菜碱)、"unchewed" 这类中式英语
- 伪造认证章:国旗配色圆章、枫叶圆标、"Gold Award"——注意区分付费送评奖项(如 Monde Selection,企业付费申报、"原产国"自报不核验)
标签剂量 vs 官方注册剂量也要对:实战中某产品标签标叶酸 2000 µg,而该国许可仅 1000 µg(且已超该国成人 UL)。
第 5 步:反证与营销侧
- 中文软文的投放时间与渠道(是否集中投放、是否标注"广告")
- 是否投放了"这品牌不是假洋货"的自辩话术——这类话术本身是最强的反向信号
- 消费者投诉(注意:投诉链接常在数月后失效,失效不等于没有)
- 宣称国语言的论坛/Reddit 是否有真实消费者讨论
GMP 证书核查:
- 要求卖方提供 GMP 证书编号
- 向发证机构核实(Health Canada / EudraGMDP / FDA)
- 注意 "GMP compliant" ≠ "GMP certified",前者是自我声明
第 6 步:出报告
严格按文末 「输出契约」 的骨架输出:固定章节、固定顺序、固定标题、固定表格列,标题中不留占位符。
发出前逐条跑一遍契约里的输出自检;不通过就重排,不要将就发出。
⚠️ 格式一致性是硬要求。同一个 skill 每次输出结构不同,会直接削弱报告的可信度—— 阅读者无法快速定位"定性"和"证据边界"在哪。不要因为内容少就省略章节,无内容写「无」。
脚本
| 脚本 | 用途 |
|---|---|
${CODEBUDDY_SKILL_DIR}/scripts/lnhpd_search.py |
加拿大 LNHPD 全量检索:按品牌/公司/NPN 查许可、持证人、许可日期、市场状态(Not Marketed)、成分剂量 |
${CODEBUDDY_SKILL_DIR}/scripts/nrv_check.py |
核对标签 %NRV 算术(EU/US),并比对 EFSA 安全上限 UL |
${CODEBUDDY_SKILL_DIR}/scripts/ean_check.py |
校验条码校验位 + 解读 GS1 国家前缀(识别 200–299 非零售号段) |
${CODEBUDDY_SKILL_DIR}/scripts/taobao_share.py |
解析淘宝/天猫/京东分享文本 → 商品 ID / 标题 / 标价 + 取证阶梯提示(CN 商品页需登录态时必用) |
运行示例:
python ${CODEBUDDY_SKILL_DIR}/scripts/taobao_share.py '【淘宝】https://e.tb.cn/xxxx CZ321 「商品标题…」'
python ${CODEBUDDY_SKILL_DIR}/scripts/lnhpd_search.py --brand "LOEON"
python ${CODEBUDDY_SKILL_DIR}/scripts/lnhpd_search.py --company "Bethune Health Develops Limited"
python ${CODEBUDDY_SKILL_DIR}/scripts/lnhpd_search.py --npn 80145377 --detail # 抓详情页,含 Market status
python ${CODEBUDDY_SKILL_DIR}/scripts/nrv_check.py --label folate=1000ug --label b6=50mg --label b12=500ug --ul
python ${CODEBUDDY_SKILL_DIR}/scripts/ean_check.py 4262366230132
红旗清单
命中 ≥3 条基本可定 C 类;命中 ≥6 条则相当确凿:
- 品牌商标持有人是与宣称国无关的空壳(名称含"Switzerland"却注册在英国等)
- 负责主体的工商登记经营范围不是生产(贸易/咨询/进出口/展会)
- 宣称国本土主流渠道查无在售,或仅有"不可订购"的孤条目
- 成立日期与宣称历史矛盾
- 官网自述的公司名在宣称国官方库中查无此主体
- 包装缺该国语言、缺强制标示
- 无该国注册号,或注册号与标签剂量不符
- %NRV 算错(尤其"引用了法规却算错")
- 剂量超出该国安全上限(UL)且无警示
- 带违法疾病宣称
- 机械翻译的中式外文
- 伪造认证章/使用付费送评奖项冒充权威认证
- 商标已放弃/驳回/失效
- 有集中的中文软文投放,或自辩式"鉴别攻略"
- 宣称日本/韩国进口却无 FFC/MFDS 备案(日本 FFC 或韩国 MFDS 健康功能食品编号)
- GMP 证书无法核实或证书编号不存在
- 反向图片搜索发现同一包装图出现在多个不相关品牌
输出契约(骨架固定,小节按案情自定)
🔴 固定不变:H1 形态、元信息三行、五个大章及其标题与顺序、「三、结论」内部四段。 可按案情调整:第二章
2.x的小节名与数量(编号必须连续)。 禁止:改大章标题、调大章顺序、省略第四/五章、在标题里留未替换的占位符。 某章无内容时写 「无」,不要删掉那一章。
骨架
# 「<品牌> <产品>」鉴别报告
核查对象:<链接 / 图片文件名 / 品牌名>
核查日期:<YYYY-MM-DD>
核查方式:<方法1 + 方法2 + …>
## 一、鉴别思路与取证路径
宣称国:<国家(判断依据)>
关键问题:<本次要回答的核心问题,一句话>
## 二、取证结果
### 2.1 <小节名>
| 项目 | 结果 |
|---|---|
| … | … |
**关键发现:**
- <要点>
### 2.2 <小节名>
<同上:表格 + 关键发现>
(2.1 … 2.n,数量按案情定,编号连续,不跳号)
## 三、结论
**定性:<A / B / C / D 之一>(<类别名>)**
**它"真"的部分**
- ✅ <逐条,避免误伤>
**它"假"的部分**
- ⚠️ <逐条;若倾向 B 类,可写"存疑的部分">
**一句话概括**
<一句话>
⚠️ 不要把「定性」提到头部。结论统一在「三、结论」给出,头部只放对象/日期/方式三行。
定性必须落到单一类别
「定性」一行只允许下面三种写法:
| 写法 | 用于 | 示例 |
|---|---|---|
| 单一类别 | 证据清楚、无争议 | **定性:C(伪造洋身份)** |
| 相邻两类之间 | 证据同时支持两个相邻类别 | **定性:B/C 之间** |
| 倾向 X + 缺口 | 有倾向,但关键证据缺失 | **定性:倾向 B,需补充证据** |
禁止:
- ❌ 含糊限定词:
接近 C 类、存疑、可能是、疑似、偏向 - ❌ 跨越非相邻类别(如
A/D 之间)——这说明证据链断裂,应写成倾向 X,需补充证据 - ❌ 只写类别名不写字母,或只写字母不写类别名
选哪种写法:
- 证据能支撑某个类别 → 直接写该类别的字母
- 确实卡在两个相邻类别之间 → 写
X/Y 之间,并在下方"它'真'的部分"与"它'假'的部分"里分别说明各支持哪一边 - 关键证据没拿到(渠道被拦、实物缺失)→ 写
倾向 X,需补充证据,并在「五、证据边界与不确定性」里写清缺什么证据、补到就能定案
用
X/Y 之间或倾向 X时,必须在「五、证据边界」里点明决定性的那一项证据是什么。 否则这个限定就变成了逃避下判断。
第二章小节的常见形态(按案情取舍)
| 小节 | 何时用 |
|---|---|
| 主体核查 | 公司注册、成立时间、注册地、董监高署名 |
| 商标核查 | 商标库查询(内容少时可与主体核查合并) |
| 宣称国监管核查 | 该国有产品级注册库时(加拿大 NPN、澳洲 AUST L、中国蓝帽子) |
| 标签法证 | 拿到包装图时(语言、%NRV、剂量、违法宣称、机翻痕迹) |
| <国家>本土渠道实测 | 主流电商 / 连锁实测;标题写「美国本土渠道实测」这种 |
| 中文营销侧 | 百度百科、软文投放、值得买专区、价格对比(如同类品牌溢价倍数) |
| 产品成分与安全 | 成分清单 + 是否超 UL + 有无 GMP/NSF/USP 等第三方认证 |
⚠️ 「中文营销侧」和「产品成分」最容易被漏掉,但它们是判定"主攻中国市场的贴牌品牌"的关键证据——每案都要考虑是否需要。
渠道实测的判读口径:只有"有售"不够,要同时看痕迹深浅——评论数、论坛/Reddit 讨论、第三方评测、行业认可。"上架了但没人讨论"本身就是重要发现。
表格规范
2.x内默认用两列表:| 项目 | 结果 |- 需要多列时才扩展(如渠道实测用
渠道 | 结果),但同一表内列数一致 - 状态标记统一用
✅/⚠️/❌/🔴
骨架续(固定不变)
## 四、安全提示
- <剂量是否超 UL、禁忌人群、认证缺失、是否需医生指导;无则写「无」>
## 五、证据边界与不确定性
- <被拦截未取证的渠道;哪些是推论;哪些未能直连核实>
输出自检(发出前逐条对)
- H1 形如
# 「<品牌> <产品>」鉴别报告 - 元信息三行齐全:核查对象 / 核查日期 / 核查方式
- 五个大章全部存在,标题与顺序逐字未改
- 第二章
2.x编号连续无跳号,每个小节都有表格或要点 - 「三、结论」四段齐全:定性 / 真的部分 / 假的部分 / 一句话概括
- 「定性」是单一类别(
C/B/C 之间/倾向 B,需补充证据三者之一),没有"接近""存疑""疑似"这类含糊词;用后两种写法时已在「五、证据边界」点明决定性证据 - 「四、安全提示」「五、证据边界与不确定性」未被省略(无内容也要写「无」)
- 无未替换的
<…>残留 - 已考虑过「中文营销侧」「产品成分」两节,该有则有
⚠️ 自检不通过就重排,不要将就发出。格式一致本身就是可信度的一部分。
参考资料
${CODEBUDDY_SKILL_DIR}/references/jurisdictions.md— 各国核查路径与数据库字段含义${CODEBUDDY_SKILL_DIR}/references/endpoints.md— 可直接复制的命令与端点(含踩坑记录)${CODEBUDDY_SKILL_DIR}/references/label-forensics.md— 标签法证清单 + NRV/UL 对照表