| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #!/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');
- })();
|