probe-douyin-share2.js 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/env node
  2. /** 尝试多种参数名解析抖音分享短链 */
  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(
  8. path.join(os.homedir(), '.openclaw', 'skills', 'xiaohongshu-search-notes', 'api-config.json'),
  9. 'utf-8'
  10. )).endpoint.headers.Authorization.replace(/^Bearer\s+/, '');
  11. function req(hostname, pathUrl) {
  12. return new Promise((resolve) => {
  13. const r = https.request({
  14. hostname, path: pathUrl, method: 'GET',
  15. headers: { Authorization: `Bearer ${TOKEN}`, Accept: 'application/json' },
  16. }, (res) => {
  17. const chunks = [];
  18. res.on('data', (c) => chunks.push(c));
  19. res.on('end', () => resolve({ status: res.statusCode, body: Buffer.concat(chunks).toString('utf-8') }));
  20. });
  21. r.on('error', (e) => resolve({ status: 0, body: e.message }));
  22. r.setTimeout(30000, () => { r.destroy(); resolve({ status: 0, body: 'timeout' }); });
  23. r.end();
  24. });
  25. }
  26. const shareUrl = 'https://v.douyin.com/BMklXPTyiUM/';
  27. const shareCode = 'BMklXPTyiUM';
  28. const tries = [
  29. // fetch_share_info_by_share_code
  30. `/api/v1/douyin/app/v3/fetch_share_info_by_share_code?share_code=${shareCode}`,
  31. `/api/v1/douyin/app/v3/fetch_share_info_by_share_code?url=${encodeURIComponent(shareUrl)}`,
  32. `/api/v1/douyin/app/v3/fetch_share_info_by_share_code?share_url=${encodeURIComponent(shareUrl)}`,
  33. // fetch_one_video_by_share_url with variants
  34. `/api/v1/douyin/app/v3/fetch_one_video_by_share_url?url=${encodeURIComponent(shareUrl)}`,
  35. `/api/v1/douyin/app/v3/fetch_one_video_by_share_url?share_url=${encodeURIComponent(shareUrl)}`,
  36. `/api/v1/douyin/app/v3/fetch_one_video_by_share_url?aweme_id=${shareCode}`,
  37. // v1/v2 variations
  38. `/api/v1/douyin/app/v1/fetch_one_video_by_share_url?url=${encodeURIComponent(shareUrl)}`,
  39. `/api/v1/douyin/web/fetch_one_video_by_share_url?url=${encodeURIComponent(shareUrl)}`,
  40. // web variants
  41. `/api/v1/douyin/web/fetch_share_info_by_share_code?share_code=${shareCode}`,
  42. `/api/v1/douyin/web/fetch_share_info_by_share_code?url=${encodeURIComponent(shareUrl)}`,
  43. // alternative common names
  44. `/api/v1/douyin/app/v3/fetch_video_info_by_share_url?url=${encodeURIComponent(shareUrl)}`,
  45. `/api/v1/douyin/app/v3/fetch_share_video?share_url=${encodeURIComponent(shareUrl)}`,
  46. ];
  47. (async () => {
  48. for (const p of tries) {
  49. const r = await req('api.tikhub.io', p);
  50. let brief;
  51. try {
  52. const j = JSON.parse(r.body);
  53. if (j.code === 200) {
  54. const d = j.data || {};
  55. const keys = Object.keys(d).slice(0, 8).join(',');
  56. brief = `OK keys=[${keys}]`;
  57. if (d.aweme_detail?.aweme_id) brief += ` aweme_id=${d.aweme_detail.aweme_id}`;
  58. else if (d.aweme_info?.aweme_id) brief += ` aweme_id=${d.aweme_info.aweme_id}`;
  59. else if (d.aweme_id) brief += ` aweme_id=${d.aweme_id}`;
  60. } else if (j.detail?.message_zh) {
  61. brief = `ERR(${j.detail.code}) ${j.detail.message_zh.slice(0, 60)}`;
  62. } else if (j.message_zh) {
  63. brief = `ERR ${j.message_zh.slice(0, 60)}`;
  64. } else {
  65. brief = r.body.slice(0, 100);
  66. }
  67. } catch (e) {
  68. brief = `PARSE ${e.message} body=${r.body.slice(0, 80)}`;
  69. }
  70. const flag = brief.startsWith('OK') ? '✅' : (r.status === 200 ? '⚠' : '✗');
  71. console.log(`${flag} [${r.status}] ${p.slice(0, 90)}`);
  72. console.log(` → ${brief}`);
  73. await new Promise((r) => setTimeout(r, 500));
  74. }
  75. })();