probe-tikhub-douyin3.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/env node
  2. /** 探完整响应 + 评论 endpoint */
  3. const fs = require('fs');
  4. const path = require('path');
  5. const os = require('os');
  6. const https = require('https');
  7. 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+/, '');
  8. function req(opts) {
  9. return new Promise((resolve) => {
  10. const r = https.request(opts, (res) => {
  11. const chunks = [];
  12. res.on('data', (c) => chunks.push(c));
  13. res.on('end', () => resolve({ status: res.statusCode, body: Buffer.concat(chunks).toString('utf-8') }));
  14. });
  15. r.on('error', (e) => resolve({ status: 0, body: e.message }));
  16. r.setTimeout(45000, () => { r.destroy(); resolve({ status: 0, body: 'timeout' }); });
  17. r.end();
  18. });
  19. }
  20. (async () => {
  21. // 1) 搜索完整响应
  22. console.log('=== 1) 搜索完整响应 ===');
  23. const r1 = await req({
  24. hostname: 'server.fmode.cn',
  25. path: `/thapi/v1/douyin/app/v3/fetch_general_search_result?keyword=${encodeURIComponent('乳酸菌素片')}&offset=0&count=10`,
  26. method: 'GET',
  27. headers: { Authorization: `Bearer ${TOKEN}`, Accept: 'application/json' },
  28. });
  29. console.log(`status: ${r1.status}, len: ${r1.body.length}`);
  30. fs.writeFileSync('probe-douyin-search.json', r1.body);
  31. try {
  32. const j = JSON.parse(r1.body);
  33. console.log(`top keys: ${Object.keys(j).join(', ')}`);
  34. const inner = j.data?.data || j.data || {};
  35. console.log(`data keys: ${Object.keys(j.data || {}).join(', ')}`);
  36. console.log(`data.data keys: ${Object.keys(inner).join(', ')}`);
  37. const arr = inner.data || inner.aweme_list || inner.item_list || inner.items || [];
  38. console.log(`results array len: ${arr.length}`);
  39. if (arr.length > 0) {
  40. const v0 = arr[0];
  41. console.log(`item[0] keys: ${Object.keys(v0).slice(0, 20).join(', ')}...`);
  42. const info = v0.aweme_info || v0;
  43. console.log(`aweme_id: ${info.aweme_id}, desc: ${(info.desc || '').slice(0, 80)}`);
  44. console.log(`statistics: ${JSON.stringify(info.statistics || {}).slice(0, 200)}`);
  45. console.log(`author: ${info.author?.nickname} (uid=${info.author?.uid})`);
  46. }
  47. } catch (e) { console.log('parse err:', e.message); }
  48. // 2) 探评论 endpoint
  49. console.log('\n=== 2) 探评论 endpoint ===');
  50. const tries = [
  51. '/thapi/v1/douyin/app/v3/fetch_video_comments?aweme_id=7358400000000000000&cursor=0&count=20',
  52. '/thapi/v1/douyin/app/v1/fetch_video_comments?aweme_id=7358400000000000000&cursor=0&count=20',
  53. '/thapi/v1/douyin/web/fetch_video_comments?aweme_id=7358400000000000000&cursor=0&count=20',
  54. ];
  55. for (const p of tries) {
  56. const r = await req({
  57. hostname: 'server.fmode.cn',
  58. path: p,
  59. method: 'GET',
  60. headers: { Authorization: `Bearer ${TOKEN}`, Accept: 'application/json' },
  61. });
  62. console.log(`[${r.status}] ${p}`);
  63. console.log(` ${r.body.slice(0, 200).replace(/\n/g, ' ')}`);
  64. await new Promise((r) => setTimeout(r, 800));
  65. }
  66. })();