| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #!/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); });
|