#!/usr/bin/env node /** * 只跑抖音板块 · 把结果合并到已有 data/jiangzhong-*-voc.json * 用法:node scripts/tools/collect-douyin-only.js [liver|probiotic|monkey|all] */ const fs = require('fs'); const path = require('path'); const { collectDouyinForProduct, loadCookie, COOKIE_PATH } = require('./collect-douyin'); // ⚠ douyin_share_urls 按「官方号 + 品牌竞品号 + 垂类博主号」三卡顺序填写 // 填空的项会被 normalizeAccountSpecs 过滤掉 const PRODUCTS = [ { id: 'liver', name: '江中肝纯片', keywords_cn: ['肝纯片', '江中肝纯片', '护肝片'], douyin_share_url: 'https://v.douyin.com/BMklXPTyiUM/', // 向下兼容 douyin_share_urls: [ { share_url: 'https://v.douyin.com/BMklXPTyiUM/', role: '官方号', label: '江中(现绑)' }, // { share_url: '___待填___', role: '品牌竞品', label: '葵花护肝片 / 葵花药业' }, // { share_url: '___待填___', role: '垂类博主', label: '肝病科医生 / 护肝博主' }, ], }, { id: 'probiotic', name: '儿童乳酸菌素片', keywords_cn: ['儿童乳酸菌素片', '江中乳酸菌', '儿童肠胃调理'], douyin_share_url: 'https://v.douyin.com/1eV76OP0FNM/', douyin_share_urls: [ { share_url: 'https://v.douyin.com/1eV76OP0FNM/', role: '官方号', label: '江中食疗(现绑)' }, // { share_url: '___待填___', role: '品牌竞品', label: '妈咪爱 / 亿活 / 合生元' }, // { share_url: '___待填___', role: '垂类博主', label: '儿科医生 / 育儿达人' }, ], }, { id: 'monkey', name: '江中猴菇饮', keywords_cn: ['猴菇饮', '江中猴菇饮', '养胃饮品'], douyin_share_url: 'https://v.douyin.com/C3mMbhRYKHw/', douyin_share_urls: [ { share_url: 'https://v.douyin.com/C3mMbhRYKHw/', role: '官方号', label: '江中制药(现绑)' }, // { share_url: '___待填___', role: '品牌竞品', label: '康恩贝 / 太阳神 / 三九' }, // { share_url: '___待填___', role: '垂类博主', label: '胃肠科医生 / 养胃博主' }, ], }, ]; async function main() { const target = process.argv[2] || 'all'; const picks = target === 'all' ? PRODUCTS : PRODUCTS.filter((p) => p.id === target); if (!picks.length) { console.error(`❌ 未知 product: ${target}`); process.exit(1); } const cookie = loadCookie(); if (!cookie) { console.error(`❌ ${COOKIE_PATH} 未找到`); process.exit(1); } console.log(`🍪 cookie loaded: ${cookie.length} chars`); for (const p of picks) { const jsonPath = path.resolve(__dirname, '..', '..', 'data', `jiangzhong-${p.id}-voc.json`); if (!fs.existsSync(jsonPath)) { console.error(`❌ ${jsonPath} 不存在,请先跑全量采集`); continue; } console.log(`\n━━━━ [${p.id}] ${p.name} ━━━━`); const t0 = Date.now(); const dy = await collectDouyinForProduct(p, cookie); const elapsed = ((Date.now() - t0) / 1000).toFixed(1); const data = JSON.parse(fs.readFileSync(jsonPath, 'utf-8')); data.douyin = dy; data._meta = data._meta || {}; data._meta.douyin_updated_at = new Date().toISOString(); fs.writeFileSync(jsonPath, JSON.stringify(data, null, 2)); console.log(`✅ [${p.id}] 完成 (${elapsed}s) → video=${dy.video ? 'YES' : 'NO'} comments=${dy.comments.length} posts=${dy.user_posts.length} searches=${Object.keys(dy.searches).length}`); } } main().catch((e) => { console.error(e); process.exit(1); });