| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- const axios = require('axios');
- const db = require('../../plugin/DataBase/db')
- const config = require('../../config.json')
- class IC {
- constructor() {
- this.headers = {
- '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',
- 'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8'
- }
- }
- async getCookie(username, password) {
- return new Promise(async (resolve, reject) => {
- try {
- let sql = `SELECT ic_cookie FROM jw_account WHERE username = ? AND state = 1`
- let r = await db.query(sql, [username])
- if (!r || r.length !== 1)
- reject(new Error('获取统一身份认证账号失败!'))
- if (!r[0].ic_cookie) {
- let cookie = await this.resetCookie(username, password)
- resolve(cookie)
- }
- else
- resolve(r[0].ic_cookie);
- } catch (error) {
- reject(error)
- }
- });
- }
- async resetCookie(username, password) {
- return new Promise(async (resolve, reject) => {
- const url = config.url2 + '/login'
- try {
- const res = await axios.post(url, { username, password })
- if (!res || res.data.code !== 0 || !res.data.ic_cookie) {
- if (res.data && res.data.code === 401) {
- let sql = 'UPDATE jw_account SET state = 2 WHERE username = ?'
- await db.query(sql, [username])
- return reject(new Error('用户名或密码错误,请核对后再试!'))
- }
- if (res.data && res.data.code === 400) {
- try {
- return await this.resetCookie(username, password)
- } catch (error) {
- reject(error)
- }
- }
- return reject(new Error(res.data.msg || '更新登录令牌失败!'))
- }
- const cookie = res.data.ic_cookie
- let sql = 'UPDATE jw_account SET ic_cookie = ? WHERE username = ?'
- let r = await db.query(sql, [cookie, username])
- if (!r || r.affectedRows !== 1)
- reject(new Error('更新登录令牌失败!数据库错误'))
- resolve(cookie);
- } catch (error) {
- reject(error)
- }
- })
- }
- async getMyOrder(cookie, data) {
- return new Promise(async (resolve, reject) => {
- const { beginDate, endDate, page, pageNum } = data
- try {
- 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`
- const res = await axios.get(url, {
- headers: {
- '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',
- 'Cookie': cookie,
- 'Accept-Language': 'zh-CN,zh;q=0.9'
- }
- })
- if (!res || res.data.code !== 0) {
- if (res.data.code === 300)
- return resolve(res.data)
- reject(new Error(`获取信息失败!${res.data.message || ''}`))
- }
- resolve(res.data);
- } catch (error) {
- reject(error)
- }
- });
- }
- async orderSeat(cookie, data) {
- return new Promise(async (resolve, reject) => {
- try {
- const user = await this.getUserInfo(cookie)
- if (user.code === 300)
- return resolve(user)
- if (!user.accNo || !user.token)
- return reject(new Error('获取用户信息失败!'))
- const accNo = user.accNo
- const captcha = await this.getCaptcha(cookie)
- data = { ...data, captcha, resvMember: [accNo], appAccNo: accNo, sysKind: 8, memberKind: 1, testName: '', resvProperty: 0, memo: '' }
- const url = `https://ic.ctbu.edu.cn/ic-web/reserve`
- const res = await axios.post(url, data, {
- headers: {
- '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',
- 'Cookie': cookie,
- 'Token': user.token,
- 'Accept-Language': 'zh-CN,zh;q=0.9'
- }
- });
- if (!res || res.data.code !== 0) {
- if (res.data.code === 300)
- return resolve(res.data)
- if (res.data.message === '请求参数错误')
- return reject(new Error(`预约失败!请检查预约时间是否符合规定`))
- if (res.data.message === '验证码错误') {
- return resolve(await this.orderSeat(cookie, data));
- }
- reject(new Error(`预约失败!${res.data.message || ''}`))
- }
- resolve(res.data);
- } catch (error) {
- reject(error)
- }
- });
- }
- async deleteSeat(cookie, uuid) {
- return new Promise(async (resolve, reject) => {
- const url = 'https://ic.ctbu.edu.cn/ic-web/reserve/delete'
- try {
- const res = await axios.post(url, { uuid }, {
- headers: {
- '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',
- 'Cookie': cookie,
- 'Accept-Language': 'zh-CN,zh;q=0.9'
- }
- });
- if (!res || res.data.code !== 0) {
- if (res.data.code === 300)
- return resolve(res.data)
- return reject(new Error(`取消预约失败!${res.data.message || ''}`))
- }
- resolve(res.data);
- } catch (error) {
- reject(error)
- }
- });
- }
- async getCaptcha(cookie) {
- return new Promise(async (resolve, reject) => {
- const url = `https://ic.ctbu.edu.cn/ic-web/captcha?id=${new Date().getTime()}`
- try {
- const res = await axios.get(url, {
- headers: {
- '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',
- 'Cookie': cookie,
- 'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8'
- },
- responseType: 'arraybuffer'
- })
- if (!res)
- return reject(new Error(`获取验证码失败!`))
- const buffer = Buffer.from(res.data);
- const base64Image = buffer.toString('base64');
- const authUrl = config.url2 + '/recognize'
- const authRes = await axios.post(authUrl, { image: base64Image })
- if (!authRes || authRes.data.code !== 0)
- return reject(new Error(`获取验证码失败!${authRes.msg || ''}`))
- const authcode = authRes.data.captcha
- resolve(authcode);
- } catch (error) {
- reject(error)
- }
- });
- }
- async getUserInfo(cookie) {
- return new Promise(async (resolve, reject) => {
- const url = 'https://ic.ctbu.edu.cn/ic-web/auth/userInfo';
- try {
- const res = await axios.get(url, {
- headers: {
- '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',
- 'Cookie': cookie,
- 'Accept-Language': 'zh-CN,zh;q=0.9'
- }
- });
- if (!res || res.data.code !== 0 || !res.data.data) {
- if (res.data.code === 300)
- return resolve(res.data)
- return reject(new Error(`获取用户信息失败!${res.data.message || ''}`))
- }
- resolve(res.data.data);
- } catch (error) {
- reject(error)
- }
- });
- }
- async getSeatMenu(cookie) {
- return new Promise(async (resolve, reject) => {
- const url = 'https://ic.ctbu.edu.cn/ic-web/seatMenu';
- try {
- const res = await axios.get(url, {
- headers: {
- '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',
- 'Cookie': cookie,
- 'Accept-Language': 'zh-CN,zh;q=0.9'
- }
- });
- if (!res || res.data.code !== 0 || !res.data.data) {
- if (res.data.code === 300)
- return resolve(res.data)
- return reject(new Error(`获取座位信息失败!${res.data.message || ''}`))
- }
- resolve(res.data.data);
- } catch (error) {
- reject(error)
- }
- });
- }
- async getOpenScope(cookie, roomId) {
- return new Promise(async (resolve, reject) => {
- const url = `https://ic.ctbu.edu.cn/ic-web/seatRoom/openScope?roomId=${roomId}`;
- try {
- const res = await axios.get(url, {
- headers: {
- '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',
- 'Cookie': cookie,
- 'Accept-Language': 'zh-CN,zh;q=0.9'
- }
- });
- if (!res || res.data.code !== 0 || !res.data.data) {
- return reject(new Error(`获取开放时间失败!${res.data.message || ''}`))
- }
- resolve(res.data.data);
- } catch (error) {
- reject(error)
- }
- });
- }
- async getSeatInfo(cookie, roomId, date) {
- return new Promise(async (resolve, reject) => {
- const url = `https://ic.ctbu.edu.cn/ic-web/reserve?roomIds=${roomId}&resvDates=${date}&sysKind=8`;
- try {
- const res = await axios.get(url, {
- headers: {
- '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',
- 'Cookie': cookie,
- 'Accept-Language': 'zh-CN,zh;q=0.9'
- }
- });
- if (!res || res.data.code !== 0 || !res.data) {
- if (res.data.code === 300)
- return resolve(res.data)
- return reject(new Error(`获取座位详情失败!${res.data.message || ''}`))
- }
- resolve(res.data.data);
- } catch (error) {
- reject(error)
- }
- });
- }
- }
- const ic = new IC();
- module.exports.IC = ic
|