登录后点击研究生健康系统即可完成打卡
// ==UserScript== // @name UESTC一键健康打卡报体温 // @namespace http://tampermonkey.net/ // @version 0.4 // @description 登录后点击研究生健康系统即可完成打卡 // @author Ravenclaw // @match http*://eportal.uestc.edu.cn/jkdkapp/* // @grant none // ==/UserScript== /* 0.3: 修复健康打卡wid 0.4: 学校改成https了,更新一下 */ function get_today() { let d = new Date(); let y = String(d.getFullYear()) let m = String(d.getMonth()+1); if (m.length == 1) m = '0' + m; let day = String(d.getDate()); if (day.length == 1) day = '0' + day; return `${y}-${m}-${day}`; } function uuid() { return '求实求真xxxxxxxx4xxxyxxxxxxxxxxx大气大为'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } function encode_params(params) { if (params.length == 0) return ''; let fields = []; for (let k in params) { fields.push(`${k}=${params[k]}`); } return encodeURI(fields.join('&')); } function request_post(url, data, headers={}) { return new Promise(function(resolve, reject) { let xhr = new XMLHttpRequest() xhr.open('POST', url); for (let key in headers) { xhr.setRequestHeader(key, headers[key]) } xhr.onerror = function() { reject(xhr.response); } xhr.onload = function() { if (xhr.status == 200) { resolve(xhr.responseText) } else { reject(xhr.response); } } xhr.send(data); }) } function request_get(url, headers={}) { return new Promise(function(resolve, reject) { let xhr = new XMLHttpRequest() xhr.open('GET', url) for (let key in headers) { xhr.setRequestHeader(key, headers[key]) } xhr.onerror = function() { reject(xhr.response); } xhr.onload = function() { if (xhr.status === 200) { resolve(xhr.response); } else { reject(xhr.response); } } xhr.send(); }) } // 获取上次健康打卡数据,其中有用户信息 function get_last_checkin_info(stu_id) { // TODO, cache the user info to avoid redundant requests return new Promise(function(resolve, reject) { // 通过访问上一次健康打卡页面获取用户信息 let url = '//eportal.uestc.edu.cn/jkdkapp/sys/lwReportEpidemicStu/modules/dailyReport/getMyDailyReportDatas.do' let data = { 'USER_ID':stu_id, 'pageSize':1, 'pageNumber':1 } let header = { 'Content-Type':'application/x-www-form-urlencoded' } request_post(url, encode_params(data), header) .then(function(resp) { let info = JSON.parse(resp) console.log('got user info') resolve(info['datas']['getMyDailyReportDatas']['rows']['0']) }) .catch(function(err) { reject(err) }) }); } function temp_checkin(time, stu_info) { let url = '//eportal.uestc.edu.cn/jkdkapp/sys/lwReportEpidemicStu/modules/tempReport/T_REPORT_TEMPERATURE_YJS_SAVE.do' let temp_form = { 'WID': '', 'CZZ': '', 'CZZXM': '', 'CZRQ': '', 'USER_ID': stu_info['USER_ID'], 'USER_NAME': stu_info['USER_NAME'], 'DEPT_CODE': stu_info['DEPT_CODE'], 'DEPT_NAME': stu_info['DEPT_NAME'], 'NEED_DATE': get_today(), 'DAY_TIME': time, 'TEMPERATURE': 36.5 } let header = {'Content-Type':'application/x-www-form-urlencoded'} request_post(url, encode_params(temp_form), header) .then(function(resp) { console.log(`temp ${time} success`); }) .catch(function(err) { console.log(`temp ${time} failed!!!`); }) } function temp_checkin_all(stu_id) { get_last_checkin_info(stu_id) .then(function(info) { for (let i = 1 ; i <= 3 ; i++) { temp_checkin(i, info) } }) .catch(function(err) { console.log('error getting user info for ' + stu_id) console.log(err) }) } function health_checkin(stu_id) { let url = '//eportal.uestc.edu.cn/jkdkapp/sys/lwReportEpidemicStu/modules/dailyReport/T_REPORT_EPIDEMIC_CHECKIN_YJS_SAVE.do' get_last_checkin_info(stu_id) .then(function(info) { info['NEED_CHECKIN_DATE'] = get_today() info['NEED_DATE'] = get_today() info['CZRQ'] = get_today(); info['REMARK'] = ''; info['WID'] = uuid(); let header = {'Content-Type':'application/x-www-form-urlencoded'} request_post(url, encode_params(info), header) .then(function(resp) { console.log(resp) console.log('success checkin') }) .catch(function(err) { console.log(err) console.log('failed to checkin') }) }) .catch(function(err) { console.log('error getting user info for ' + stu_id) console.log(err) }) } // 检测是否已经打过卡了 function health_checkin_safe(stu_id) { get_last_checkin_info(stu_id) .then(function(info) { let entry = info.datas.getMyDailyReportDatas.rows[0]; if (entry['NEED_DATE'] == get_today()) { // 打过卡了 console.log('already checked in. abort') } else { // 没打卡 health_checkin(stu_id); } }) .catch(function(err) { console.log('failed to checkin') }) } function get_stu_id() { return new Promise(function(resolve, reject){ request_get('//eportal.uestc.edu.cn/jsonp/userDesktopInfo.json') .then(function(resp){ let stu_info = JSON.parse(resp); console.log('user name: ' + stu_info.userName); resolve(stu_info.userId) }).catch(function(err){ reject(err); }); }); } // TODO avoid re-checkin (function() { 'use strict'; // 通过比较上次执行的日期,判断是否执行签到操作 const lastCheckKey = 'uestc_last_checkin'; let lastCheckin = localStorage.getItem(lastCheckKey) let today = get_today(); if (lastCheckin == null || lastCheckin < today) { console.log('checkin') get_stu_id().then((stu_id) => { health_checkin(stu_id); temp_checkin_all(stu_id); localStorage.setItem(lastCheckKey, today); }) } else { console.log('checked in. do nothing') } })();