probe-dy-resolve.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/env node
  2. const https = require('https');
  3. function resolveOne(url) {
  4. return new Promise((r) => {
  5. const u = new URL(url);
  6. const req = https.request({
  7. hostname: u.hostname, path: u.pathname + u.search, method: 'GET',
  8. headers: {
  9. 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1',
  10. Accept: 'text/html,*/*',
  11. },
  12. }, (res) => {
  13. console.log(url, ' status=', res.statusCode, ' loc=', res.headers.location || '(no redirect)');
  14. const chunks = [];
  15. res.on('data', (c) => chunks.push(c));
  16. res.on('end', () => {
  17. const body = Buffer.concat(chunks).toString('utf-8');
  18. const m1 = (res.headers.location || '').match(/\/(?:share\/video|video)\/(\d+)/);
  19. const m2 = body.match(/video\/(\d{15,})/) || body.match(/"aweme_id"\s*:\s*"(\d+)"/) || body.match(/itemId=(\d+)/);
  20. console.log(' from loc:', m1 ? m1[1] : '-', '| from body:', m2 ? m2[1] : '-', '| body len:', body.length);
  21. r();
  22. });
  23. });
  24. req.on('error', (e) => { console.log(e.message); r(); });
  25. req.setTimeout(15000, () => { req.destroy(); r(); });
  26. req.end();
  27. });
  28. }
  29. (async () => {
  30. for (const u of [
  31. 'https://v.douyin.com/BMklXPTyiUM/',
  32. 'https://v.douyin.com/1eV76OP0FNM/',
  33. 'https://v.douyin.com/C3mMbhRYKHw/',
  34. ]) {
  35. await resolveOne(u);
  36. }
  37. })();