/** * 分享页「更多推荐」AI 接口请求(HTTPS 页在 iOS 微信内不能直连 HTTP:9100,须走同源 alienStore 网关)。 * URL 可用 lifeAiBase 覆盖,例如 lifeAiBase=https://test.ailien.shop/alienStore */ (function (global) { 'use strict'; var API_LIFE_AI_HTTP = 'http://183.252.196.135:9100'; function isPageHttps() { return (location.protocol || '').toLowerCase() === 'https:'; } function isIosWxBrowser() { var ua = navigator.userAgent || ''; return /iphone|ipad|ipod/i.test(ua) && /micromessenger/i.test(ua); } function readQueryParam(name) { var params = new URLSearchParams(location.search || ''); var v = params.get(name); if (v != null) return String(v); var hash = location.hash || ''; var qi = hash.indexOf('?'); if (qi >= 0) { var hp = new URLSearchParams(hash.slice(qi + 1)); var hv = hp.get(name); if (hv != null) return String(hv); } return ''; } /** * @param {string} [alienStoreBase] 页面内 API_BASE,如 https://test.ailien.shop/alienStore */ function resolveLifeAiApiBases(alienStoreBase) { var out = []; var seen = {}; function push(base) { base = String(base || '').trim().replace(/\/+$/, ''); if (!base || seen[base]) return; seen[base] = true; out.push(base); } var custom = readQueryParam('lifeAiBase').trim(); if (custom) push(custom); var host = (location.hostname || '').toLowerCase(); if (host === 'test.ailien.shop' || host === 'uat.ailien.shop') { push('https://' + host + '/alienStore'); } else if (alienStoreBase) { push(String(alienStoreBase).replace(/\/+$/, '')); } /* iOS+HTTPS 会拦截明文 fetch;Android 微信常仍可回落直连 IP */ if (!isPageHttps() || !isIosWxBrowser()) { push(API_LIFE_AI_HTTP); } return out; } function isLifeAiApiOk(res) { if (!res || typeof res !== 'object') return false; if (res.success === false) return false; var c = res.code; return c === 200 || c === '200' || Number(c) === 200; } function extractRecommendList(res) { if (!res || typeof res !== 'object') return []; if (!isLifeAiApiOk(res)) return []; var raw = res.data != null ? res.data : res.result; if (Array.isArray(raw)) return raw; if (raw && typeof raw === 'object') { var keys = [ 'list', 'records', 'rows', 'content', 'stores', 'storeList', 'storeVos', 'items' ]; for (var i = 0; i < keys.length; i++) { if (Array.isArray(raw[keys[i]])) return raw[keys[i]]; } } if (Array.isArray(res.list)) return res.list; if (Array.isArray(res.records)) return res.records; return []; } /** * 按顺序尝试多个 API 根地址,401/404/网络失败时换下一个。 */ function fetchLifeAiPostJson(alienStoreBase, apiPath, body) { var bases = resolveLifeAiApiBases(alienStoreBase); var idx = 0; function next(err) { if (idx >= bases.length) { return Promise.reject(err || new Error('lifeAi recommend failed')); } var url = bases[idx++] + apiPath; return fetch(url, { method: 'POST', mode: 'cors', credentials: 'omit', headers: { Accept: 'application/json', 'Content-Type': 'application/json;charset=UTF-8' }, body: JSON.stringify(body) }) .then(function (res) { if (!res.ok) { if (res.status === 401 || res.status === 403 || res.status === 404) { return next(new Error('HTTP ' + res.status)); } throw new Error('HTTP ' + res.status); } return res.json(); }) .then(function (json) { if (json && (json.code === 401 || json.code === '401')) { return next(new Error('code 401')); } return json; }) .catch(function (e) { return next(e); }); } return next(); } /** * @param {function(string): string} getParam 如 getMergedParam / mergedQ */ function getMergedRecommendUserLocation(getParam, defaults) { defaults = defaults || {}; var defLat = defaults.lat != null ? defaults.lat : 38.925747; var defLng = defaults.lng != null ? defaults.lng : 121.662531; var defCity = defaults.city || '大连市'; var gp = typeof getParam === 'function' ? getParam : function (n) { return readQueryParam(n); }; function pick() { var args = arguments; var i; for (i = 0; i < args.length; i++) { var v = String(gp(args[i]) || '').trim(); if (v) return v; } return ''; } var latRaw = pick('userLat', 'latitude', 'lat', 'weidu'); var lngRaw = pick('userLng', 'longitude', 'lon', 'lng', 'jingdu'); var cityRaw = pick('userCity', 'city'); return { userLat: latRaw !== '' && !isNaN(Number(latRaw)) ? Number(latRaw) : defLat, userLng: lngRaw !== '' && !isNaN(Number(lngRaw)) ? Number(lngRaw) : defLng, userCity: cityRaw !== '' ? cityRaw : defCity }; } global.LifeAiFetch = { API_LIFE_AI_HTTP: API_LIFE_AI_HTTP, isPageHttps: isPageHttps, isIosWxBrowser: isIosWxBrowser, resolveLifeAiApiBases: resolveLifeAiApiBases, isLifeAiApiOk: isLifeAiApiOk, extractRecommendList: extractRecommendList, fetchLifeAiPostJson: fetchLifeAiPostJson, getMergedRecommendUserLocation: getMergedRecommendUserLocation }; })(typeof window !== 'undefined' ? window : this);