#!/usr/bin/env node /** 探完整响应 + 评论 endpoint */ const fs = require('fs'); const path = require('path'); const os = require('os'); const https = require('https'); const TOKEN = JSON.parse(fs.readFileSync(path.join(os.homedir(), '.openclaw', 'skills', 'xiaohongshu-search-notes', 'api-config.json'), 'utf-8')).endpoint.headers.Authorization.replace(/^Bearer\s+/, ''); function req(opts) { return new Promise((resolve) => { const r = https.request(opts, (res) => { const chunks = []; res.on('data', (c) => chunks.push(c)); res.on('end', () => resolve({ status: res.statusCode, body: Buffer.concat(chunks).toString('utf-8') })); }); r.on('error', (e) => resolve({ status: 0, body: e.message })); r.setTimeout(45000, () => { r.destroy(); resolve({ status: 0, body: 'timeout' }); }); r.end(); }); } (async () => { // 1) 搜索完整响应 console.log('=== 1) 搜索完整响应 ==='); const r1 = await req({ hostname: 'server.fmode.cn', path: `/thapi/v1/douyin/app/v3/fetch_general_search_result?keyword=${encodeURIComponent('乳酸菌素片')}&offset=0&count=10`, method: 'GET', headers: { Authorization: `Bearer ${TOKEN}`, Accept: 'application/json' }, }); console.log(`status: ${r1.status}, len: ${r1.body.length}`); fs.writeFileSync('probe-douyin-search.json', r1.body); try { const j = JSON.parse(r1.body); console.log(`top keys: ${Object.keys(j).join(', ')}`); const inner = j.data?.data || j.data || {}; console.log(`data keys: ${Object.keys(j.data || {}).join(', ')}`); console.log(`data.data keys: ${Object.keys(inner).join(', ')}`); const arr = inner.data || inner.aweme_list || inner.item_list || inner.items || []; console.log(`results array len: ${arr.length}`); if (arr.length > 0) { const v0 = arr[0]; console.log(`item[0] keys: ${Object.keys(v0).slice(0, 20).join(', ')}...`); const info = v0.aweme_info || v0; console.log(`aweme_id: ${info.aweme_id}, desc: ${(info.desc || '').slice(0, 80)}`); console.log(`statistics: ${JSON.stringify(info.statistics || {}).slice(0, 200)}`); console.log(`author: ${info.author?.nickname} (uid=${info.author?.uid})`); } } catch (e) { console.log('parse err:', e.message); } // 2) 探评论 endpoint console.log('\n=== 2) 探评论 endpoint ==='); const tries = [ '/thapi/v1/douyin/app/v3/fetch_video_comments?aweme_id=7358400000000000000&cursor=0&count=20', '/thapi/v1/douyin/app/v1/fetch_video_comments?aweme_id=7358400000000000000&cursor=0&count=20', '/thapi/v1/douyin/web/fetch_video_comments?aweme_id=7358400000000000000&cursor=0&count=20', ]; for (const p of tries) { const r = await req({ hostname: 'server.fmode.cn', path: p, method: 'GET', headers: { Authorization: `Bearer ${TOKEN}`, Accept: 'application/json' }, }); console.log(`[${r.status}] ${p}`); console.log(` ${r.body.slice(0, 200).replace(/\n/g, ' ')}`); await new Promise((r) => setTimeout(r, 800)); } })();