getPathData.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. const axios = require('axios')
  2. const db = require('./plugin/DataBase/db')
  3. const API_URL = 'http://222.178.152.79:100/api_v1/getSportRecord'
  4. // ===== 账号组成 =====
  5. let part1 = '23'
  6. let part2 = 993 // 第二部分
  7. let part3 = 1 // 第三部分
  8. let part4 = 1 // 第四部分
  9. // ===== 最大范围(可自行调整)=====
  10. const MAX_P3 = 20
  11. const MAX_P4 = 90
  12. // ===== 南泉校区 =====
  13. const nq = [106.594871,29.421079]
  14. // ===== 双桥校区 =====
  15. const sq = [105.778790,29.512079]
  16. /**
  17. * 计算两点经纬度之间的距离(单位:米)
  18. * @param {[number, number]} p1 [经度, 纬度]
  19. * @param {[number, number]} p2 [经度, 纬度]
  20. * @returns {number} 距离(米,浮点数)
  21. */
  22. function calcDistance(p1, p2) {
  23. const [lng1, lat1] = p1
  24. const [lng2, lat2] = p2
  25. console.log(`计算距离,点1: (${lat1}, ${lng1}),点2: (${lat2}, ${lng2})`)
  26. const toRad = d => d * Math.PI / 180
  27. const R = 6378137 // 地球半径(米,WGS84)
  28. const φ1 = toRad(lat1)
  29. const φ2 = toRad(lat2)
  30. const Δφ = toRad(lat2 - lat1)
  31. const Δλ = toRad(lng2 - lng1)
  32. const a =
  33. Math.sin(Δφ / 2) ** 2 +
  34. Math.cos(φ1) * Math.cos(φ2) *
  35. Math.sin(Δλ / 2) ** 2
  36. const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
  37. return R * c
  38. }
  39. // ===== 工具函数 =====
  40. const pad2 = n => String(n).padStart(2, '0')
  41. function genAccount() {
  42. return `${part1}${part2}${pad2(part3)}${pad2(part4)}`
  43. }
  44. function parsePathLine(pathLine) {
  45. return pathLine.split(';').map(p => {
  46. const [lat, lng] = p.split(',').map(Number);
  47. return [lng, lat];
  48. });
  49. }
  50. // ===== 进位逻辑 =====
  51. // 无数据:第三部分进位,必要时第二部分进位
  52. function advanceOnNoData() {
  53. part3++
  54. if (part3 > MAX_P3) {
  55. part3 = 1
  56. part2++
  57. console.log('>>> 第三部分耗尽,第二部分进位为:', part2)
  58. }
  59. part4 = 1
  60. }
  61. // 有数据:第四部分进位
  62. function advanceOnHasData() {
  63. part4++
  64. if (part4 > MAX_P4) {
  65. part4 = 1
  66. part3++
  67. if (part3 > MAX_P3) {
  68. part3 = 1
  69. part2++
  70. console.log('>>> 第四、三部分耗尽,第二部分进位为:', part2)
  71. }
  72. }
  73. }
  74. // ===== 单次请求 =====
  75. async function fetchOnce() {
  76. const account = genAccount()
  77. console.log('\n请求 account:', account)
  78. const res = await axios.post(
  79. API_URL,
  80. `account=${account}&startdate=2020-01-01&enddate=2025-12-31`,
  81. { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
  82. )
  83. const data = res.data
  84. // ❌ 无数据
  85. if (!data || !data.data || data.data.length === 0) {
  86. console.log('无 data,执行进位')
  87. advanceOnNoData()
  88. return
  89. }
  90. // ✅ 有数据
  91. for (let index = 0; index < data.data.length; index++) {
  92. const item = data.data[index]
  93. if (item.status !== 1) continue
  94. const coords = parsePathLine(item.pathLine)
  95. const pathLineJson = JSON.stringify(coords)
  96. const sq_distance = calcDistance(sq, coords[0])
  97. const nq_distance = calcDistance(nq, coords[0])
  98. console.log(`双桥校区距离起点: ${sq_distance.toFixed(2)} 米,南泉校区距离起点: ${nq_distance.toFixed(2)} 米`)
  99. const run_zone_name = sq_distance < nq_distance ? '重庆工程学院双桥校区' : '重庆工程学院南泉校区'
  100. const sql = `
  101. INSERT INTO path_data
  102. (distance, time, calorie, speed, data, run_zone_name)
  103. VALUES (?, ?, ?, ?, ?, ?)
  104. `
  105. await db.query(sql, [
  106. item.distance,
  107. item.duration,
  108. item.calorie,
  109. item.distribution,
  110. pathLineJson,
  111. run_zone_name
  112. ])
  113. console.log(
  114. `已保存到数据库。距离:${item.distance} 米,时长:${item.duration} 秒,路径点:${coords.length} 个`
  115. )
  116. }
  117. advanceOnHasData()
  118. }
  119. // ===== 主循环 =====
  120. (async function start() {
  121. while (true) {
  122. try {
  123. await fetchOnce()
  124. } catch (e) {
  125. console.error('请求异常:', e.message)
  126. }
  127. // 控制请求频率
  128. await new Promise(r => setTimeout(r, 200))
  129. }
  130. })()