| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 |
- /**
- * 增强版生肖工具 - 接入天行数据API
- */
- import TIANAPI_CONFIG, { validateConfig } from '@/config/api-config.js'
- import zodiacUtil from './zodiac.js'
- /**
- * 从天行数据API获取生肖运势
- * @param {String} zodiac - 生肖名称
- * @returns {Promise<Object>} 运势数据
- */
- 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<Object>} 配对结果
- */
- 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
- }
|