#!/usr/bin/env node /** 尝试多种参数名解析抖音分享短链 */ 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(hostname, pathUrl) { return new Promise((resolve) => { const r = https.request({ hostname, path: pathUrl, method: 'GET', headers: { Authorization: `Bearer ${TOKEN}`, Accept: 'application/json' }, }, (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(30000, () => { r.destroy(); resolve({ status: 0, body: 'timeout' }); }); r.end(); }); } const shareUrl = 'https://v.douyin.com/BMklXPTyiUM/'; const shareCode = 'BMklXPTyiUM'; const tries = [ // fetch_share_info_by_share_code `/api/v1/douyin/app/v3/fetch_share_info_by_share_code?share_code=${shareCode}`, `/api/v1/douyin/app/v3/fetch_share_info_by_share_code?url=${encodeURIComponent(shareUrl)}`, `/api/v1/douyin/app/v3/fetch_share_info_by_share_code?share_url=${encodeURIComponent(shareUrl)}`, // fetch_one_video_by_share_url with variants `/api/v1/douyin/app/v3/fetch_one_video_by_share_url?url=${encodeURIComponent(shareUrl)}`, `/api/v1/douyin/app/v3/fetch_one_video_by_share_url?share_url=${encodeURIComponent(shareUrl)}`, `/api/v1/douyin/app/v3/fetch_one_video_by_share_url?aweme_id=${shareCode}`, // v1/v2 variations `/api/v1/douyin/app/v1/fetch_one_video_by_share_url?url=${encodeURIComponent(shareUrl)}`, `/api/v1/douyin/web/fetch_one_video_by_share_url?url=${encodeURIComponent(shareUrl)}`, // web variants `/api/v1/douyin/web/fetch_share_info_by_share_code?share_code=${shareCode}`, `/api/v1/douyin/web/fetch_share_info_by_share_code?url=${encodeURIComponent(shareUrl)}`, // alternative common names `/api/v1/douyin/app/v3/fetch_video_info_by_share_url?url=${encodeURIComponent(shareUrl)}`, `/api/v1/douyin/app/v3/fetch_share_video?share_url=${encodeURIComponent(shareUrl)}`, ]; (async () => { for (const p of tries) { const r = await req('api.tikhub.io', p); let brief; try { const j = JSON.parse(r.body); if (j.code === 200) { const d = j.data || {}; const keys = Object.keys(d).slice(0, 8).join(','); brief = `OK keys=[${keys}]`; if (d.aweme_detail?.aweme_id) brief += ` aweme_id=${d.aweme_detail.aweme_id}`; else if (d.aweme_info?.aweme_id) brief += ` aweme_id=${d.aweme_info.aweme_id}`; else if (d.aweme_id) brief += ` aweme_id=${d.aweme_id}`; } else if (j.detail?.message_zh) { brief = `ERR(${j.detail.code}) ${j.detail.message_zh.slice(0, 60)}`; } else if (j.message_zh) { brief = `ERR ${j.message_zh.slice(0, 60)}`; } else { brief = r.body.slice(0, 100); } } catch (e) { brief = `PARSE ${e.message} body=${r.body.slice(0, 80)}`; } const flag = brief.startsWith('OK') ? '✅' : (r.status === 200 ? '⚠' : '✗'); console.log(`${flag} [${r.status}] ${p.slice(0, 90)}`); console.log(` → ${brief}`); await new Promise((r) => setTimeout(r, 500)); } })();