您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自用,仅供学习交流
// ==UserScript== // @name 四川轻化工大学辅助签到 // @namespace http://tampermonkey.net/ // @version 1.3 // @description 自用,仅供学习交流 // @author litclus // @match https://qfhy.suse.edu.cn/* // @require https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js // @icon https://qfhy.suse.edu.cn/edu/admin/logo.svg // @license MIT // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // ==/UserScript== const GM_request = (params) => { return new Promise((resolve, reject) => { GM_xmlhttpRequest(Object.assign({}, params, { onload: e=>{ if(e.status != 200){ reject() return } try { resolve(JSON.parse(e.response)) }catch(err) { reject(err) } }, onerror: reject })) }) } (function() { 'use strict'; let data = [] // 需要新增或者自定义 就添加location_all和campus_all这里的参数就可以了 const location_all = { 宜宾: [[104.659500, 104.683000],[28.795200, 28.816000]], // 李白河: [[104.659500, 104.683000],[28.795200, 28.816000]] } const campus_all = { 宜宾: "四川省宜宾市翠屏区白沙湾街道芭茅田四川轻化工大学宜宾校区", // 李白河: "四川省宜宾市翠屏区白沙湾街道芭茅田四川轻化工大学宜宾校区" } let userSelect = GM_getValue("user-select") || "宜宾" const observerTitle = new MutationObserver(function(mutations) { const element = document.querySelector(".listArea") if (element) { observerTitle.disconnect() const div = document.createElement("div") Object.assign(div.style, { display: "flex", justifyContent: "center", alignItems: "center", marginTop: "12px" }) const span = document.createElement("span") span.innerText = "欢迎使用辅助签到" Object.assign(span.style, { fontSize: "24px", fontWeight: "bold", color: "red" }) const select = document.createElement("select") select.onclick = e => { userSelect = e.target.value GM_setValue("user-select", e.target.value) } Object.assign(select.style, { margin: "0 12px", fontSize: "14px" }) for (const key in campus_all) { const option = document.createElement("option") option.innerText = key option.setAttribute("value", key) if(userSelect == key) option.setAttribute("selected", "") select.appendChild(option) } div.appendChild(span) div.appendChild(select) element.prepend(div) } }) observerTitle.observe(document.body, { childList: true, subtree: true }) function getRandomCoordinate(campus) { // 经度范围 const minLon = location_all[campus][0][0] const maxLon = location_all[campus][0][1] // 纬度范围 const minLat = location_all[campus][1][0] const maxLat = location_all[campus][1][1] // 生成6位小数精度的随机经度 const randomLon = (Math.random() * (maxLon - minLon) + minLon).toFixed(6) // 生成6位小数精度的随机纬度 const randomLat = (Math.random() * (maxLat - minLat) + minLat).toFixed(6) return [parseFloat(randomLon), parseFloat(randomLat)] } const observerItem = new MutationObserver(async function(mutations) { const elements = document.querySelectorAll(".renwuItem") if(elements.length) { observerItem.disconnect() try { data = (await GM_request({ url: "https://qfhy.suse.edu.cn/xg/qddk/qdrw/api/myList.rst?status=1", method: "GET" }))?.result?.data ?? [] console.table(data) }catch(err){ if(confirm("获取签到任务列表失败,请尝试刷新当前页面")){ window.location.reload() } } elements.forEach((item, index)=>{ const div = document.createElement("div") Object.assign(div.style, { display: "flex", justifyContent: "center", alignItems: "center", paddingBottom: "12px" }) const inner_div = document.createElement("div") if(/晚签/g.test(data[index].rwmc) && /定位/g.test(data[index].qdlx)) { const button = document.createElement("button") button.innerText = "辅助签到" button.onclick = e => { e.stopPropagation() if(dayjs().isBefore(dayjs(`${data[index].needTime}T${data[index].qdkssj}`))){ alert("当前时间早于你选中的签到任务规定时间") return } if(!confirm("即将进行签到任务")) return const params = { id: data[index].id, qdzt: 1, qdsj: dayjs().format("YYYY-MM-DD HH:mm:ss"), isOuted: 0, isLated: 0, dkddPhoto: "", txxx: "", qdddjtdz: campus_all[userSelect], location: JSON.stringify({ point: getRandomCoordinate(userSelect), address: campus_all[userSelect] }) } GM_request({ url: "https://qfhy.suse.edu.cn/xg/qddk/qdrw/api/checkSignLocationWithPhonto.rst", method: "POST", headers: { "Content-Type": "application/json" }, data: JSON.stringify(params) }).then(res=>{ if(res?.result?.data) { alert("签到成功!") window.location.reload() }else { alert("签到失败!") } }).catch(()=>{ alert("签到失败!") }) } inner_div.appendChild(button) } div.appendChild(inner_div) item.appendChild(div) }) } }) observerItem.observe(document.body, { childList: true, subtree: true }) // Your code here... })();