const axios = require('axios') const db = require('./plugin/DataBase/db') const API_URL = 'http://222.178.152.79:100/api_v1/getSportRecord' // ===== 账号组成 ===== let part1 = '23' let part2 = 995 // 第二部分 let part3 = 1 // 第三部分 let part4 = 1 // 第四部分 // ===== 最大范围(可自行调整)===== const MAX_P3 = 20 const MAX_P4 = 90 // ===== 南泉校区 ===== const nq = [106.594871,29.421079] // ===== 双桥校区 ===== const sq = [105.778790,29.512079] /** * 计算两点经纬度之间的距离(单位:米) * @param {[number, number]} p1 [经度, 纬度] * @param {[number, number]} p2 [经度, 纬度] * @returns {number} 距离(米,浮点数) */ function calcDistance(p1, p2) { const [lng1, lat1] = p1 const [lng2, lat2] = p2 console.log(`计算距离,点1: (${lat1}, ${lng1}),点2: (${lat2}, ${lng2})`) const toRad = d => d * Math.PI / 180 const R = 6378137 // 地球半径(米,WGS84) const φ1 = toRad(lat1) const φ2 = toRad(lat2) const Δφ = toRad(lat2 - lat1) const Δλ = toRad(lng2 - lng1) const a = Math.sin(Δφ / 2) ** 2 + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) ** 2 const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) return R * c } // ===== 工具函数 ===== const pad2 = n => String(n).padStart(2, '0') function genAccount() { return `${part1}${part2}${pad2(part3)}${pad2(part4)}` } function parsePathLine(pathLine) { return pathLine.split(';').map(p => { const [lat, lng] = p.split(',').map(Number); return [lng, lat]; }); } // ===== 进位逻辑 ===== // 无数据:第三部分进位,必要时第二部分进位 function advanceOnNoData() { part3++ if (part3 > MAX_P3) { part3 = 1 part2++ console.log('>>> 第三部分耗尽,第二部分进位为:', part2) } part4 = 1 } // 有数据:第四部分进位 function advanceOnHasData() { part4++ if (part4 > MAX_P4) { part4 = 1 part3++ if (part3 > MAX_P3) { part3 = 1 part2++ console.log('>>> 第四、三部分耗尽,第二部分进位为:', part2) } } } // ===== 单次请求 ===== async function fetchOnce() { const account = genAccount() console.log('\n请求 account:', account) const res = await axios.post( API_URL, `account=${account}&startdate=2020-01-01&enddate=2025-12-31`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ) const data = res.data // ❌ 无数据 if (!data || !data.data || data.data.length === 0) { console.log('无 data,执行进位') advanceOnNoData() return } // ✅ 有数据 for (let index = 0; index < data.data.length; index++) { const item = data.data[index] if (item.status !== 1) continue const coords = parsePathLine(item.pathLine) const pathLineJson = JSON.stringify(coords) const sq_distance = calcDistance(sq, coords[0]) const nq_distance = calcDistance(nq, coords[0]) console.log(`双桥校区距离起点: ${sq_distance.toFixed(2)} 米,南泉校区距离起点: ${nq_distance.toFixed(2)} 米`) const run_zone_name = sq_distance < nq_distance ? '重庆工程学院双桥校区' : '重庆工程学院南泉校区' const sql = ` INSERT INTO path_data (distance, time, calorie, speed, data, run_zone_name) VALUES (?, ?, ?, ?, ?, ?) ` await db.query(sql, [ item.distance, item.duration, item.calorie, item.distribution, pathLineJson, run_zone_name ]) console.log( `已保存到数据库。距离:${item.distance} 米,时长:${item.duration} 秒,路径点:${coords.length} 个` ) } advanceOnHasData() } // ===== 主循环 ===== (async function start() { while (true) { try { await fetchOnce() } catch (e) { console.error('请求异常:', e.message) } // 控制请求频率 await new Promise(r => setTimeout(r, 200)) } })()