syncLepaoAccountFromToken.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /**
  2. * 用 JKES token 拉取 getMyInfo 并更新 lepao_account(哪吒乐跑 / JKES 唯一数据源)
  3. */
  4. const db = require('../DataBase/db.js')
  5. const { jkesRequest } = require('./request.js')
  6. const DEFAULT_AVATAR =
  7. 'https://lepao-cloud.xxoo365.top/view.php/25aa126dc406974ff3579a99a2c6501a.png'
  8. const LOGIN_EXPIRED_MSG = '乐跑账号登录失效,请重新使用乐跑登录器进行登录'
  9. async function markLoginExpiredByToken(token) {
  10. const tokenClean = String(token ?? '').trim()
  11. if (!tokenClean) return
  12. await db.query('UPDATE lepao_account SET state = 0 WHERE token = ?', [tokenClean])
  13. }
  14. /**
  15. * @param {string} token
  16. * @param {{ userAgent?: string, deviceModel?: string }} [device]
  17. * @returns {Promise<
  18. * | { ok: false, msg: string, jkesRes?: object }
  19. * | {
  20. * ok: true
  21. * student_num: string
  22. * findRows: object[]
  23. * profile: {
  24. * name: string
  25. * academy_name: string
  26. * grade_id: any
  27. * class_id: any
  28. * sex: number
  29. * user_avatar: string
  30. * }
  31. * }
  32. * >}
  33. */
  34. async function syncLepaoAccountFromToken(token, device = {}) {
  35. let jkesRes
  36. try {
  37. jkesRes = await jkesRequest('/sys/user/getMyInfo', {}, token)
  38. } catch (error) {
  39. if (error?.loginExpired) {
  40. await markLoginExpiredByToken(token)
  41. return {
  42. ok: false,
  43. msg: LOGIN_EXPIRED_MSG
  44. }
  45. }
  46. throw error
  47. }
  48. if (!jkesRes || jkesRes.code !== 0 || !jkesRes.data || !jkesRes.data.info) {
  49. return {
  50. ok: false,
  51. msg: jkesRes?.message || '获取用户信息失败,请稍后重试或联系客服',
  52. jkesRes
  53. }
  54. }
  55. const {
  56. code,
  57. realName,
  58. identifyCode,
  59. mobileNumber,
  60. gender,
  61. gradeYear,
  62. collegeCode,
  63. classCode,
  64. homeAddr
  65. } = jkesRes.data.info
  66. const sex = gender?.label === '男' ? 1 : 2
  67. const name = realName
  68. const academy_name = collegeCode?.name ?? ''
  69. const grade_id = gradeYear
  70. const class_id = classCode?.className ?? ''
  71. const student_num = code
  72. const user_avatar = DEFAULT_AVATAR
  73. const findSql = `
  74. SELECT
  75. a.email, a.create_user, a.auto_run, a.auto_day, a.notice_type, e.bot_umo
  76. FROM
  77. lepao_account a
  78. LEFT JOIN
  79. lepao_extra e
  80. ON
  81. a.student_num = e.student_num
  82. WHERE
  83. a.student_num = ? AND a.create_user IS NOT NULL
  84. `
  85. const findRows = await db.query(findSql, [student_num])
  86. if (!findRows) {
  87. return { ok: false, msg: '无法获取用户数据,请重试' }
  88. }
  89. if (findRows.length === 0) {
  90. return {
  91. ok: false,
  92. msg: '该乐跑账号尚未在哪吒乐跑中添加,请先前往 https://jkes.xxoo365.top/ 添加你的账户'
  93. }
  94. }
  95. const time = Date.now()
  96. const ua = device.userAgent
  97. const dm = device.deviceModel
  98. let updateSql =
  99. 'UPDATE lepao_account SET token = ?, name = ?, grade_id = ?, class_id = ?, sex = ?, academy_name = ?, update_time = ?, user_avatar = ?, identifyCode = ?, mobileNumber = ?, homeAddr = ?, state = 1'
  100. const params = [
  101. token,
  102. name,
  103. grade_id,
  104. class_id,
  105. sex,
  106. academy_name,
  107. time,
  108. user_avatar,
  109. identifyCode,
  110. mobileNumber,
  111. homeAddr
  112. ]
  113. if (ua != null && ua !== '') {
  114. updateSql += ', userAgent = ?'
  115. params.push(ua)
  116. }
  117. if (dm != null && dm !== '') {
  118. updateSql += ', deviceModel = ?'
  119. params.push(dm)
  120. }
  121. updateSql += ' WHERE student_num = ?'
  122. params.push(student_num)
  123. const updateRows = await db.query(updateSql, params)
  124. if (!updateRows || updateRows.affectedRows < 1) {
  125. return { ok: false, msg: '更新账号信息失败,请重试' }
  126. }
  127. return {
  128. ok: true,
  129. student_num,
  130. findRows,
  131. profile: {
  132. name,
  133. academy_name,
  134. grade_id,
  135. class_id,
  136. sex,
  137. user_avatar
  138. }
  139. }
  140. }
  141. module.exports = {
  142. syncLepaoAccountFromToken,
  143. DEFAULT_AVATAR
  144. }