#!/usr/bin/env node /** * 405 说明端点存在但不接 POST → 回退 GET + cookie 测试 result_v2 系列 */ const fs = require('fs'); const path = require('path'); const os = require('os'); const https = require('https'); const TIKHUB_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+/, ''); const COOKIE = fs.readFileSync(path.resolve('data/douyin-cookie.txt'), 'utf-8').trim(); function get(apiPath, params) { const qs = Object.entries(params) .filter(([, v]) => v !== undefined && v !== null && v !== '') .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) .join('&'); return new Promise((resolve) => { const opts = { hostname: 'api.tikhub.io', path: `${apiPath}?${qs}`, method: 'GET', headers: { Authorization: `Bearer ${TIKHUB_TOKEN}`, Accept: 'application/json' }, }; const req = https.request(opts, (res) => { const chunks = []; res.on('data', (c) => chunks.push(c)); res.on('end', () => { const body = Buffer.concat(chunks).toString('utf-8'); try { resolve({ status: res.statusCode, json: JSON.parse(body) }); } catch (e) { resolve({ status: res.statusCode, text: body.slice(0, 200) }); } }); }); req.on('error', (e) => resolve({ status: 0, error: e.message })); req.setTimeout(30000, () => { req.destroy(); resolve({ status: 0, error: 'timeout' }); }); req.end(); }); } const paths = [ '/api/v1/douyin/app/v3/fetch_video_search_result_v2', '/api/v1/douyin/app/v3/fetch_user_search_result_v2', '/api/v1/douyin/web/fetch_video_search_result_v2', '/api/v1/douyin/web/fetch_user_search_result_v2', ]; (async () => { const results = []; for (const p of paths) { const r = await get(p, { keyword: '康恩贝', cursor: 0, sort_type: 0, publish_time: 0, count: 10, cookie: COOKIE, }); const topCode = r.json?.code; const topMsg = (r.json?.message_zh || r.json?.message || '').slice(0, 60); const d = r.json?.data; let innerStr = ''; if (d) { if (typeof d === 'string') innerStr = d.slice(0, 80); else if (Array.isArray(d)) innerStr = `arr[${d.length}]`; else { const inner = d.data; if (typeof inner === 'string') innerStr = 'str: ' + inner.slice(0, 80); else if (Array.isArray(inner)) innerStr = `arr[${inner.length}] first keys=${inner[0] ? Object.keys(inner[0]).slice(0, 5).join(',') : ''}`; else innerStr = 'obj keys=' + Object.keys(d).slice(0, 6).join(',') + (inner ? '; inner obj keys=' + Object.keys(inner).slice(0, 6).join(',') : ''); } } console.log(`[${r.status}] ${p}`); console.log(` top code=${topCode} msg="${topMsg}"`); console.log(` inner: ${innerStr}`); results.push({ path: p, status: r.status, code: topCode, msg: topMsg, inner: innerStr }); await new Promise((res) => setTimeout(res, 800)); } fs.writeFileSync('data/dy-search-get-v2.json', JSON.stringify(results, null, 2), 'utf-8'); // 额外:把 video_search_result_v2 的完整响应 dump 出来 const detail = await get('/api/v1/douyin/app/v3/fetch_video_search_result_v2', { keyword: '康恩贝', cursor: 0, sort_type: 0, publish_time: 0, count: 10, cookie: COOKIE, }); fs.writeFileSync('data/dy-search-get-v2-sample.json', JSON.stringify(detail.json, null, 2).slice(0, 20000), 'utf-8'); })();