ecommerce-gateway.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // 创作者数据中转网关(voc-e-commerce)。用于抖音星图、小红书蒲公英(PGY)的创作者侧
  2. // 结构化数据接口(创作者搜索、画像、受众/粉丝分布、内容与评论关键词、笔记/视频绩效、
  3. // 报价与性价比等)。鉴权、计费、错误分类、重试逻辑全部复用社媒网关(voc-gateway)的
  4. // 共享实现,只是根地址不同;对外不暴露任何上游数据供应商名称。
  5. const {
  6. buildGatewayUrl,
  7. requestJson,
  8. classifyApiError,
  9. redactSecret,
  10. unwrapData
  11. } = require('./voc-gateway');
  12. const ECOMMERCE_GATEWAY_ROOT = 'https://server.fmode.cn/api/voc-e-commerce';
  13. function resolveEcommerceRoot(baseUrl) {
  14. return String(
  15. baseUrl ||
  16. process.env.VOC_ECOMMERCE_API_BASE_URL ||
  17. process.env.VOC_ECOMMERCE_GATEWAY_URL ||
  18. ECOMMERCE_GATEWAY_ROOT
  19. ).replace(/\/$/, '');
  20. }
  21. // 与 callSocialGateway 完全一致的「优先 newapi sk-、鉴权失败回退 sessionToken」逻辑,
  22. // 只是走 voc-e-commerce 根地址。402(余额不足)/403(无权限)不回退。
  23. async function callEcommerceGateway({ proxyPath, method = 'GET', query = {}, body, token, fallbackToken, baseUrl, retries = 3 } = {}) {
  24. const root = resolveEcommerceRoot(baseUrl);
  25. const url = buildGatewayUrl(root, proxyPath, query);
  26. const upper = String(method || 'GET').toUpperCase();
  27. const requestOptions = {
  28. method: upper,
  29. body: upper === 'GET' ? undefined : body,
  30. retries
  31. };
  32. try {
  33. return await requestJson(url, token, requestOptions);
  34. } catch (error) {
  35. const canFallback = fallbackToken && fallbackToken !== token && error && error.kind === 'auth';
  36. if (!canFallback) throw error;
  37. return requestJson(url, fallbackToken, requestOptions);
  38. }
  39. }
  40. module.exports = {
  41. ECOMMERCE_GATEWAY_ROOT,
  42. resolveEcommerceRoot,
  43. buildGatewayUrl,
  44. classifyApiError,
  45. redactSecret,
  46. unwrapData,
  47. requestJson,
  48. callEcommerceGateway
  49. };