IC.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. const axios = require('axios');
  2. const db = require('../../plugin/DataBase/db')
  3. const config = require('../../config.json')
  4. class IC {
  5. constructor() {
  6. this.headers = {
  7. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  8. 'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8'
  9. }
  10. }
  11. async getCookie(username, password) {
  12. return new Promise(async (resolve, reject) => {
  13. try {
  14. let sql = `SELECT ic_cookie FROM jw_account WHERE username = ? AND state = 1`
  15. let r = await db.query(sql, [username])
  16. if (!r || r.length !== 1)
  17. reject(new Error('获取统一身份认证账号失败!'))
  18. if (!r[0].ic_cookie) {
  19. let cookie = await this.resetCookie(username, password)
  20. resolve(cookie)
  21. }
  22. else
  23. resolve(r[0].ic_cookie);
  24. } catch (error) {
  25. reject(error)
  26. }
  27. });
  28. }
  29. async resetCookie(username, password) {
  30. return new Promise(async (resolve, reject) => {
  31. const url = config.url2 + '/login'
  32. try {
  33. const res = await axios.post(url, { username, password })
  34. if (!res || res.data.code !== 0 || !res.data.ic_cookie) {
  35. if (res.data && res.data.code === 401) {
  36. let sql = 'UPDATE jw_account SET state = 2 WHERE username = ?'
  37. await db.query(sql, [username])
  38. return reject(new Error('用户名或密码错误,请核对后再试!'))
  39. }
  40. if (res.data && res.data.code === 400) {
  41. try {
  42. return await this.resetCookie(username, password)
  43. } catch (error) {
  44. reject(error)
  45. }
  46. }
  47. return reject(new Error(res.data.msg || '更新登录令牌失败!'))
  48. }
  49. const cookie = res.data.ic_cookie
  50. let sql = 'UPDATE jw_account SET ic_cookie = ? WHERE username = ?'
  51. let r = await db.query(sql, [cookie, username])
  52. if (!r || r.affectedRows !== 1)
  53. reject(new Error('更新登录令牌失败!数据库错误'))
  54. resolve(cookie);
  55. } catch (error) {
  56. reject(error)
  57. }
  58. })
  59. }
  60. async getMyOrder(cookie, data) {
  61. return new Promise(async (resolve, reject) => {
  62. const { beginDate, endDate, page, pageNum } = data
  63. try {
  64. const url = `https://ic.ctbu.edu.cn/ic-web/reserve/resvInfo?beginDate=${beginDate}&endDate=${endDate}&needStatus=150&page=${page}&pageNum=${pageNum}&orderKey=gmt_create&orderModel=desc`
  65. const res = await axios.get(url, {
  66. headers: {
  67. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  68. 'Cookie': cookie,
  69. 'Accept-Language': 'zh-CN,zh;q=0.9'
  70. }
  71. })
  72. if (!res || res.data.code !== 0) {
  73. if (res.data.code === 300)
  74. return resolve(res.data)
  75. reject(new Error(`获取信息失败!${res.data.message || ''}`))
  76. }
  77. resolve(res.data);
  78. } catch (error) {
  79. reject(error)
  80. }
  81. });
  82. }
  83. async orderSeat(cookie, data) {
  84. return new Promise(async (resolve, reject) => {
  85. try {
  86. const user = await this.getUserInfo(cookie)
  87. if (user.code === 300)
  88. return resolve(user)
  89. if (!user.accNo || !user.token)
  90. return reject(new Error('获取用户信息失败!'))
  91. const accNo = user.accNo
  92. const captcha = await this.getCaptcha(cookie)
  93. data = { ...data, captcha, resvMember: [accNo], appAccNo: accNo, sysKind: 8, memberKind: 1, testName: '', resvProperty: 0, memo: '' }
  94. const url = `https://ic.ctbu.edu.cn/ic-web/reserve`
  95. const res = await axios.post(url, data, {
  96. headers: {
  97. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  98. 'Cookie': cookie,
  99. 'Token': user.token,
  100. 'Accept-Language': 'zh-CN,zh;q=0.9'
  101. }
  102. });
  103. if (!res || res.data.code !== 0) {
  104. if (res.data.code === 300)
  105. return resolve(res.data)
  106. if (res.data.message === '请求参数错误')
  107. return reject(new Error(`预约失败!请检查预约时间是否符合规定`))
  108. if (res.data.message === '验证码错误') {
  109. return resolve(await this.orderSeat(cookie, data));
  110. }
  111. reject(new Error(`预约失败!${res.data.message || ''}`))
  112. }
  113. resolve(res.data);
  114. } catch (error) {
  115. reject(error)
  116. }
  117. });
  118. }
  119. async deleteSeat(cookie, uuid) {
  120. return new Promise(async (resolve, reject) => {
  121. const url = 'https://ic.ctbu.edu.cn/ic-web/reserve/delete'
  122. try {
  123. const res = await axios.post(url, { uuid }, {
  124. headers: {
  125. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  126. 'Cookie': cookie,
  127. 'Accept-Language': 'zh-CN,zh;q=0.9'
  128. }
  129. });
  130. if (!res || res.data.code !== 0) {
  131. if (res.data.code === 300)
  132. return resolve(res.data)
  133. return reject(new Error(`取消预约失败!${res.data.message || ''}`))
  134. }
  135. resolve(res.data);
  136. } catch (error) {
  137. reject(error)
  138. }
  139. });
  140. }
  141. async getCaptcha(cookie) {
  142. return new Promise(async (resolve, reject) => {
  143. const url = `https://ic.ctbu.edu.cn/ic-web/captcha?id=${new Date().getTime()}`
  144. try {
  145. const res = await axios.get(url, {
  146. headers: {
  147. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  148. 'Cookie': cookie,
  149. 'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8'
  150. },
  151. responseType: 'arraybuffer'
  152. })
  153. if (!res)
  154. return reject(new Error(`获取验证码失败!`))
  155. const buffer = Buffer.from(res.data);
  156. const base64Image = buffer.toString('base64');
  157. const authUrl = config.url2 + '/recognize'
  158. const authRes = await axios.post(authUrl, { image: base64Image })
  159. if (!authRes || authRes.data.code !== 0)
  160. return reject(new Error(`获取验证码失败!${authRes.msg || ''}`))
  161. const authcode = authRes.data.captcha
  162. resolve(authcode);
  163. } catch (error) {
  164. reject(error)
  165. }
  166. });
  167. }
  168. async getUserInfo(cookie) {
  169. return new Promise(async (resolve, reject) => {
  170. const url = 'https://ic.ctbu.edu.cn/ic-web/auth/userInfo';
  171. try {
  172. const res = await axios.get(url, {
  173. headers: {
  174. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  175. 'Cookie': cookie,
  176. 'Accept-Language': 'zh-CN,zh;q=0.9'
  177. }
  178. });
  179. if (!res || res.data.code !== 0 || !res.data.data) {
  180. if (res.data.code === 300)
  181. return resolve(res.data)
  182. return reject(new Error(`获取用户信息失败!${res.data.message || ''}`))
  183. }
  184. resolve(res.data.data);
  185. } catch (error) {
  186. reject(error)
  187. }
  188. });
  189. }
  190. async getSeatMenu(cookie) {
  191. return new Promise(async (resolve, reject) => {
  192. const url = 'https://ic.ctbu.edu.cn/ic-web/seatMenu';
  193. try {
  194. const res = await axios.get(url, {
  195. headers: {
  196. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  197. 'Cookie': cookie,
  198. 'Accept-Language': 'zh-CN,zh;q=0.9'
  199. }
  200. });
  201. if (!res || res.data.code !== 0 || !res.data.data) {
  202. if (res.data.code === 300)
  203. return resolve(res.data)
  204. return reject(new Error(`获取座位信息失败!${res.data.message || ''}`))
  205. }
  206. resolve(res.data.data);
  207. } catch (error) {
  208. reject(error)
  209. }
  210. });
  211. }
  212. async getOpenScope(cookie, roomId) {
  213. return new Promise(async (resolve, reject) => {
  214. const url = `https://ic.ctbu.edu.cn/ic-web/seatRoom/openScope?roomId=${roomId}`;
  215. try {
  216. const res = await axios.get(url, {
  217. headers: {
  218. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  219. 'Cookie': cookie,
  220. 'Accept-Language': 'zh-CN,zh;q=0.9'
  221. }
  222. });
  223. if (!res || res.data.code !== 0 || !res.data.data) {
  224. return reject(new Error(`获取开放时间失败!${res.data.message || ''}`))
  225. }
  226. resolve(res.data.data);
  227. } catch (error) {
  228. reject(error)
  229. }
  230. });
  231. }
  232. async getSeatInfo(cookie, roomId, date) {
  233. return new Promise(async (resolve, reject) => {
  234. const url = `https://ic.ctbu.edu.cn/ic-web/reserve?roomIds=${roomId}&resvDates=${date}&sysKind=8`;
  235. try {
  236. const res = await axios.get(url, {
  237. headers: {
  238. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  239. 'Cookie': cookie,
  240. 'Accept-Language': 'zh-CN,zh;q=0.9'
  241. }
  242. });
  243. if (!res || res.data.code !== 0 || !res.data) {
  244. if (res.data.code === 300)
  245. return resolve(res.data)
  246. return reject(new Error(`获取座位详情失败!${res.data.message || ''}`))
  247. }
  248. resolve(res.data.data);
  249. } catch (error) {
  250. reject(error)
  251. }
  252. });
  253. }
  254. }
  255. const ic = new IC();
  256. module.exports.IC = ic