tmp.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. const table = [...'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'];
  2. const s = [11, 10, 3, 8, 4, 6];
  3. const xor = 177451812;
  4. const add = 8728348608;
  5. const av2bv = (av) => {
  6. let num = NaN;
  7. if (Object.prototype.toString.call(av) === '[object Number]') {
  8. num = av;
  9. } else if (Object.prototype.toString.call(av) === '[object String]') {
  10. num = parseInt(av.replace(/[^0-9]/gu, ''));
  11. }
  12. ;
  13. if (isNaN(num) || num <= 0) {
  14. // 网页版直接输出这个结果了
  15. return '¿你在想桃子?';
  16. }
  17. ;
  18. num = (num ^ xor) + add;
  19. let result = [...'bv1 4 1 7 '];
  20. let i = 0;
  21. while (i < 6) {
  22. // 这里改写差点犯了运算符优先级的坑
  23. // 果然 Python 也不是特别熟练
  24. // 说起来 ** 按照传统语法应该写成 Math.pow(),但是我个人更喜欢 ** 一些
  25. result[s[i]] = table[Math.floor(num / 58 ** i) % 58];
  26. i += 1;
  27. }
  28. ;
  29. return result.join('');
  30. };
  31. const bv2av = (bv) => {
  32. let str = '';
  33. if (bv.length === 12) {
  34. str = bv;
  35. } else if (bv.length === 10) {
  36. str = `BV${bv}`;
  37. // 根据官方 API,BV 号开头的 BV1 其实可以省略
  38. // 不过单独省略个 B 又不行(
  39. } else if (bv.length === 9) {
  40. str = `BV1${bv}`;
  41. } else {
  42. return '¿你在想桃子?';
  43. }
  44. ;
  45. if (!str.match(/[Bb][Vv][fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{10}/gu)) {
  46. return '¿你在想桃子?';
  47. }
  48. ;
  49. let result = 0;
  50. let i = 0;
  51. while (i < 6) {
  52. result += table.indexOf(str[s[i]]) * 58 ** i;
  53. i += 1;
  54. }
  55. ;
  56. return `av${result - add ^ xor}`;
  57. };
  58. console.log(bv2av("BV16Y4y1w7Sb"));
  59. // https://video-direct-link.vercel.app/bili.mp4?aid=av644205043&bvid=BV16Y4y1w7Sb