/** * 增强版生肖工具 - 接入天行数据API */ import TIANAPI_CONFIG, { validateConfig } from '@/config/api-config.js' import zodiacUtil from './zodiac.js' /** * 从天行数据API获取生肖运势 * @param {String} zodiac - 生肖名称 * @returns {Promise} 运势数据 */ export async function getZodiacFortuneFromAPI(zodiac) { // ⚠️ 注意:天行数据的 /zodiac/index 是生肖配对接口,不是运势接口 // 该接口需要 me 和 he 两个参数,用于查询生肖配对关系 // 目前天行数据可能没有单独的生肖运势接口,因此直接使用本地数据 console.log('ℹ️ 天行数据暂无生肖运势接口,使用本地数据') console.log('📝 说明: /zodiac/index 是生肖配对接口,不是运势接口') // 直接返回本地数据 return { ...zodiacUtil.getTodayFortune(zodiac), source: 'local_no_api', dataFrom: '本地数据(天行数据暂无运势接口)', updateTime: new Date().toLocaleString('zh-CN') } /* // 保留代码供参考:如果找到正确的运势API,可以恢复使用 // 验证配置 if (!validateConfig()) { console.log('API Key未配置,使用本地数据') return { ...zodiacUtil.getTodayFortune(zodiac), source: 'local_no_config', dataFrom: '本地数据(未配置API)' } } try { console.log('🔍 开始调用天行数据API...') console.log('请求生肖:', zodiac) // 调用天行数据API(使用Promise包装以捕获所有错误) const [error, response] = await uni.request({ url: `${TIANAPI_CONFIG.BASE_URL}${TIANAPI_CONFIG.ENDPOINTS.zodiacFortune}`, method: 'GET', data: { key: TIANAPI_CONFIG.API_KEY, name: zodiac }, timeout: 8000 // 8秒超时,给网络更多时间 }).then(res => [null, res]).catch(err => [err, null]) // 如果请求本身失败(网络错误等) if (error) { console.error('❌ 网络请求失败:', error) throw new Error(`网络错误: ${error.errMsg || error.message || '未知错误'}`) } console.log('📡 API响应状态码:', response.statusCode) console.log('📡 API响应数据:', response.data) // 检查HTTP响应状态 if (!response || response.statusCode !== 200) { console.error('❌ HTTP状态码异常:', response?.statusCode) throw new Error(`HTTP错误: ${response?.statusCode || '无响应'}`) } const data = response.data // 检查数据格式 if (!data || typeof data !== 'object') { console.error('❌ 响应数据格式错误:', data) throw new Error('响应数据格式不正确') } // 检查API业务状态码 if (data.code !== 200) { console.error('❌ API业务错误:', { code: data.code, msg: data.msg }) throw new Error(data.msg || `API错误(code: ${data.code})`) } // 检查result字段 const result = data.result if (!result) { console.error('❌ 缺少result数据') throw new Error('API返回数据不完整') } console.log('✅ API调用成功,数据:', result) // 天行数据返回格式转换为我们的格式 return { overall: result.summary || '平稳', love: parseFortune(result.love_txt), career: parseFortune(result.work_txt), wealth: parseFortune(result.money_txt), health: parseFortune(result.health_txt), tips: `幸运颜色:${result.color || '未知'},幸运数字:${result.number || '未知'}。${result.general_txt || ''}`, luckyColor: result.color || zodiacUtil.getZodiacInfo(zodiac).luckyColor, luckyNumber: result.number || zodiacUtil.getZodiacInfo(zodiac).luckyNumber, source: 'tianapi', dataFrom: '天行数据专业API', updateTime: new Date().toLocaleString('zh-CN') } } catch (error) { console.error('❌ 获取API数据失败,降级到本地数据') console.error('错误详情:', error) console.error('错误消息:', error.message || error.errMsg || '未知错误') // 显示友好提示(不打断用户) uni.showToast({ title: '使用本地数据', icon: 'none', duration: 1500 }) // 降级到本地数据 return { ...zodiacUtil.getTodayFortune(zodiac), source: 'local_fallback', dataFrom: '本地数据(API暂不可用)', updateTime: new Date().toLocaleString('zh-CN') } } */ } /** * 🆕 生肖配对查询(使用天行数据API) * @param {String} myZodiac - 我的生肖 * @param {String} targetZodiac - 对方生肖 * @returns {Promise} 配对结果 */ export async function getZodiacMatch(myZodiac, targetZodiac) { // 验证配置 if (!validateConfig()) { console.log('API Key未配置,无法使用配对功能') return null } try { console.log('🔍 开始调用生肖配对API...') console.log('我的生肖:', myZodiac, '对方生肖:', targetZodiac) console.log('请求URL:', `${TIANAPI_CONFIG.BASE_URL}${TIANAPI_CONFIG.ENDPOINTS.zodiacMatch}`) console.log('请求参数:', { key: TIANAPI_CONFIG.API_KEY ? TIANAPI_CONFIG.API_KEY.substring(0, 8) + '...' : '未配置', me: myZodiac, he: targetZodiac }) // 使用Promise包装uni.request以更好地处理错误 const response = await new Promise((resolve, reject) => { uni.request({ url: `${TIANAPI_CONFIG.BASE_URL}${TIANAPI_CONFIG.ENDPOINTS.zodiacMatch}`, method: 'GET', data: { key: TIANAPI_CONFIG.API_KEY, me: myZodiac, he: targetZodiac }, timeout: 10000, success: (res) => { console.log('🌐 网络请求成功,原始响应:', res) resolve(res) }, fail: (err) => { console.error('🌐 网络请求失败,错误信息:', err) reject(new Error(`网络请求失败: ${err.errMsg || err.message || '未知网络错误'}`)) } }) }) console.log('📡 配对API完整响应:', { statusCode: response.statusCode, data: response.data, header: response.header, cookies: response.cookies }) // 检查响应是否存在 if (!response) { console.error('❌ 响应对象为空') throw new Error('网络响应为空,可能是域名配置或网络问题') } // 检查HTTP状态码 if (response.statusCode !== 200) { console.error('❌ HTTP状态码错误:', response.statusCode) throw new Error(`HTTP错误: ${response.statusCode}`) } // 检查响应数据是否存在 if (!response.data) { console.error('❌ API响应数据为空') throw new Error('API响应数据为空') } // 检查API业务状态码 if (response.data.code !== 200) { console.error('❌ API业务错误:', { code: response.data.code, msg: response.data.msg || '未知错误' }) throw new Error(response.data.msg || `API错误(code: ${response.data.code})`) } // 检查result数据 const result = response.data.result if (!result) { console.error('❌ API返回结果为空') throw new Error('API返回结果为空') } console.log('✅ 配对查询成功,数据:', result) return { title: result.title || '配对分析', malePerspective: result.mcontent || '', // 男性视角 femalePerspective: result.fcontent || '', // 女性视角 malePerspective2: result.mcontent1 || '', // 男性视角2 femalePerspective2: result.fcontent1 || '', // 女性视角2 source: 'tianapi', updateTime: new Date().toLocaleString('zh-CN') } } catch (error) { console.error('❌ 生肖配对查询失败') console.error('错误类型:', error.name || 'Unknown') console.error('错误信息:', error.message || error.errMsg || '未知错误') console.error('完整错误:', error) // 友好的用户提示 uni.showToast({ title: '配对查询失败,使用本地数据', icon: 'none', duration: 2000 }) return null } } /** * 解析运势文本为分数 * 根据关键词判断分数 */ function parseFortune(text) { if (!text) return 75 // 正面关键词 const positiveWords = ['佳', '好', '旺', '顺', '吉', '高', '升', '涨', '强'] // 负面关键词 const negativeWords = ['差', '弱', '低', '降', '凶', '衰', '险', '忌'] let score = 75 // 基础分数 // 检查正面词 for (let word of positiveWords) { if (text.includes(word)) { score += 5 } } // 检查负面词 for (let word of negativeWords) { if (text.includes(word)) { score -= 5 } } // 限制分数范围 60-95 return Math.max(60, Math.min(95, score)) } /** * 统一的获取运势接口 * 优先使用API,失败则降级到本地 */ export async function getTodayFortune(zodiac) { return await getZodiacFortuneFromAPI(zodiac) } /** * 获取星座运势(如果需要) */ export async function getConstellationFortune(constellation) { if (!validateConfig()) { return null } try { const response = await uni.request({ url: `${TIANAPI_CONFIG.BASE_URL}${TIANAPI_CONFIG.ENDPOINTS.constellation}`, method: 'GET', data: { key: TIANAPI_CONFIG.API_KEY, astro: constellation }, timeout: 5000 }) if (response.statusCode === 200 && response.data.code === 200) { return response.data.result } } catch (error) { console.error('获取星座运势失败:', error) } return null } /** * 测试API连接 */ export async function testAPIConnection() { if (!validateConfig()) { return { success: false, message: '请先配置API Key' } } try { console.log('🧪 开始测试API连接...') const result = await getZodiacFortuneFromAPI('鼠') // 检查是否真的是API数据 if (result.source === 'tianapi') { return { success: true, message: 'API连接成功!', data: result } } else { return { success: false, message: 'API调用失败,已降级到本地数据', data: result } } } catch (error) { return { success: false, message: 'API连接失败:' + (error.message || error.errMsg || '未知错误'), error: error } } } /** * 🔧 网络连接诊断工具 */ export async function diagnoseNetwork() { console.log('🔧 开始网络诊断...') const diagnostics = { timestamp: new Date().toLocaleString('zh-CN'), environment: { platform: uni.getSystemInfoSync().platform, version: uni.getSystemInfoSync().version, SDKVersion: uni.getSystemInfoSync().SDKVersion }, tests: {} } // 测试1: 基础网络连接 try { console.log('📡 测试基础网络连接...') const testResponse = await new Promise((resolve, reject) => { uni.request({ url: 'https://www.baidu.com', method: 'GET', timeout: 5000, success: resolve, fail: reject }) }) diagnostics.tests.basicNetwork = { success: true, statusCode: testResponse.statusCode, message: '网络连接正常' } console.log('✅ 基础网络连接正常') } catch (error) { diagnostics.tests.basicNetwork = { success: false, error: error.errMsg || error.message, message: '基础网络连接失败' } console.error('❌ 基础网络连接失败:', error) } // 测试2: HTTPS协议测试 try { console.log('🔒 测试HTTPS协议支持...') const httpsResponse = await new Promise((resolve, reject) => { uni.request({ url: 'https://httpbin.org/get', method: 'GET', timeout: 8000, success: resolve, fail: reject }) }) diagnostics.tests.httpsSupport = { success: true, statusCode: httpsResponse.statusCode, message: 'HTTPS协议支持正常' } console.log('✅ HTTPS协议支持正常') } catch (error) { diagnostics.tests.httpsSupport = { success: false, error: error.errMsg || error.message, message: 'HTTPS协议测试失败' } console.error('❌ HTTPS协议测试失败:', error) } // 测试3: 天行数据域名连通性 try { console.log('🌐 测试天行数据域名连通性...') const tianApiResponse = await new Promise((resolve, reject) => { uni.request({ url: 'https://apis.tianapi.com', method: 'GET', timeout: 8000, success: resolve, fail: reject }) }) diagnostics.tests.tianApiDomain = { success: true, statusCode: tianApiResponse.statusCode, message: '天行数据域名可访问' } console.log('✅ 天行数据域名可访问') } catch (error) { diagnostics.tests.tianApiDomain = { success: false, error: error.errMsg || error.message, message: '天行数据域名无法访问' } console.error('❌ 天行数据域名无法访问:', error) } return diagnostics } /** * 详细的API诊断工具 */ export async function diagnoseAPI() { console.log('🔧 开始API诊断...') const diagnostics = { config: { hasApiKey: !!TIANAPI_CONFIG.API_KEY, apiKey: TIANAPI_CONFIG.API_KEY ? TIANAPI_CONFIG.API_KEY.substring(0, 8) + '...' : '未配置', baseUrl: TIANAPI_CONFIG.BASE_URL, endpoint: TIANAPI_CONFIG.ENDPOINTS.zodiac }, network: {}, apiResponse: {} } // 测试基础网络连接 try { console.log('📡 测试网络连接...') const testUrl = `${TIANAPI_CONFIG.BASE_URL}${TIANAPI_CONFIG.ENDPOINTS.zodiac}` diagnostics.network.testUrl = testUrl const response = await uni.request({ url: testUrl, method: 'GET', data: { key: TIANAPI_CONFIG.API_KEY, name: '鼠' }, timeout: 10000 }) diagnostics.network.success = true diagnostics.network.statusCode = response.statusCode diagnostics.apiResponse = response.data console.log('✅ 网络连接成功') console.log('响应:', response.data) } catch (error) { diagnostics.network.success = false diagnostics.network.error = error.errMsg || error.message console.error('❌ 网络连接失败:', error) } return diagnostics } export default { getTodayFortune, getZodiacFortuneFromAPI, getZodiacMatch, getConstellationFortune, testAPIConnection, diagnoseAPI, diagnoseNetwork }