_fix-apig-mapping.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /**
  2. * 修复 voc/* 和 ecom orchestrators 的 apigId
  3. * Vo3ROWEvDy (social) → 7HwdQZk55B (ecom)
  4. *
  5. * 方式:纯字符串替换,只改 tokenConfig 和 paymentParams 里那两处,避免破坏其他字段
  6. */
  7. const fs = require('fs');
  8. const path = require('path');
  9. const ROOT = path.resolve(__dirname, '..', '..');
  10. // 需要改成 7HwdQZk55B 的文件(endpoint 或 pipeline 主要调用 voc-ecom API)
  11. const ECOM_SKILLS = [
  12. // 12 direct-endpoint
  13. 'voc/asin-reverse-keywords',
  14. 'voc/asin-sales-volume',
  15. 'voc/category-products',
  16. 'voc/category-tree',
  17. 'voc/keyword-product-ranking',
  18. 'voc/keyword-search',
  19. 'voc/keyword-search-trend',
  20. 'voc/product-detail-query',
  21. 'voc/product-monitor',
  22. 'voc/product-reviews-query',
  23. 'voc/product-search',
  24. 'voc/similar-products',
  25. // 5 orchestrators (pipelines 调用 /api/ProductRequest /api/AsinSalesVolume 等 ecom API)
  26. 'competitor-analysis/competitor-bsr-tracking',
  27. 'competitor-analysis/competitor-discovery',
  28. 'competitor-analysis/competitor-pricing-analysis',
  29. 'competitor-analysis/competitor-product-comparison',
  30. 'review-analysis/review-batch-collection',
  31. 'review-analysis/review-keyword-cloud',
  32. 'synthesis/brand-profile',
  33. 'synthesis/category-landscape',
  34. 'synthesis/product-deep-analysis'
  35. ];
  36. const TARGET_APIG = '7HwdQZk55B';
  37. const OLD_APIG = 'Vo3ROWEvDy';
  38. let totalFiles = 0, totalReplacements = 0, errors = [];
  39. for (const skillDir of ECOM_SKILLS) {
  40. const fp = path.join(ROOT, skillDir, 'api-config.json');
  41. if (!fs.existsSync(fp)) {
  42. errors.push(`NOT FOUND: ${skillDir}`);
  43. continue;
  44. }
  45. const raw = fs.readFileSync(fp, 'utf-8');
  46. const cfg = JSON.parse(raw);
  47. let modified = false;
  48. let count = 0;
  49. // 1. tokenConfig.apigId
  50. if (cfg.tokenConfig?.apigId === OLD_APIG) {
  51. cfg.tokenConfig.apigId = TARGET_APIG;
  52. modified = true; count++;
  53. }
  54. // 2. tokenConfig.paymentUrlResolution.paymentParams.apigid
  55. if (cfg.tokenConfig?.paymentUrlResolution?.paymentParams?.apigid === OLD_APIG) {
  56. cfg.tokenConfig.paymentUrlResolution.paymentParams.apigid = TARGET_APIG;
  57. modified = true; count++;
  58. }
  59. // 3. 扫描 onMissing.qrCodeUrl (字符串包含 apigid=Vo3ROWEvDy)
  60. if (cfg.tokenConfig?.onMissing?.qrCodeUrl?.includes(`apigid=${OLD_APIG}`)) {
  61. cfg.tokenConfig.onMissing.qrCodeUrl = cfg.tokenConfig.onMissing.qrCodeUrl.replace(
  62. new RegExp(`apigid=${OLD_APIG}`, 'g'),
  63. `apigid=${TARGET_APIG}`
  64. );
  65. modified = true; count++;
  66. }
  67. // 4. steps / description 里的 URL 字符串
  68. const scanString = (obj, parent, key) => {
  69. if (typeof obj === 'string' && obj.includes(OLD_APIG) && obj.includes('apigid')) {
  70. parent[key] = obj.replace(new RegExp(`apigid=${OLD_APIG}`, 'g'), `apigid=${TARGET_APIG}`);
  71. count++; modified = true;
  72. } else if (typeof obj === 'object' && obj !== null) {
  73. for (const [k, v] of Object.entries(obj)) scanString(v, obj, k);
  74. }
  75. };
  76. // 仅扫 paymentUrlResolution.steps 之类的地方
  77. if (cfg.tokenConfig?.paymentUrlResolution?.steps) {
  78. cfg.tokenConfig.paymentUrlResolution.steps = cfg.tokenConfig.paymentUrlResolution.steps.map(s =>
  79. typeof s === 'string' ? s.replace(new RegExp(`apigid=${OLD_APIG}`, 'g'), `apigid=${TARGET_APIG}`) : s
  80. );
  81. }
  82. if (modified) {
  83. fs.writeFileSync(fp, JSON.stringify(cfg, null, 2) + '\n', 'utf-8');
  84. totalFiles++;
  85. totalReplacements += count;
  86. console.log(` [${count}] ${skillDir}/api-config.json`);
  87. }
  88. }
  89. console.log('');
  90. console.log(`Done: ${totalFiles} files modified, ${totalReplacements} replacements total`);
  91. if (errors.length) {
  92. console.log('\nErrors:');
  93. errors.forEach(e => console.log(' ', e));
  94. }