// ==UserScript== // @name 超星学习通扫码登录 // @namespace https://github.com/qcxs/chaoxing // @version 1.0 beta // @description 让浏览器为其他设备扫码登录,需当前浏览器已登录账号。菜单触发授权,自动补全确认页 URL,也可手动输入其他登录 URL // @author 青春向上 // @match *://*.chaoxing.com/* // @run-at document-idle // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // ==/UserScript== (function () { 'use strict'; // 只在顶层页面运行,iframe 不运行,避免重复弹出 if (window.self !== window.top) { return; } var FAKE_UA = 'Mozilla/5.0 (Linux; Android 11; ABR-AL00 Build/HUAWEIABR-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/88.0.4324.93 Mobile Safari/537.36 (schild:3b9718671596b4bbca76d8715046a55f) (device:ABR-AL00) Language/zh_CN_#Hans com.chaoxing.mobileinhouse/ChaoXingStudy_3_5.2.4.1_android_phone_893_97 (@Azeroth)_f7a007ab1d9e48b2aca72d8ae08c9388'; var MAX_RETRIES = 3; var RETRY_DELAY = 1000; function doAuth(uuid, enc) { var attemptCount = 0; function send() { attemptCount++; GM_xmlhttpRequest({ method: 'POST', url: 'https://passport2.chaoxing.com/authlogin', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'User-Agent': FAKE_UA, 'X-Requested-With': 'XMLHttpRequest' }, data: 'enc=' + encodeURIComponent(enc) + '&uuid=' + encodeURIComponent(uuid), withCredentials: true, onload: function (resp) { try { var json = JSON.parse(resp.responseText); if (json.status === true) { return; } } catch (e) {} retry(); }, onerror: function () { retry(); }, ontimeout: function () { retry(); } }); } function retry() { if (attemptCount < MAX_RETRIES) { setTimeout(send, RETRY_DELAY); } } send(); alert('已尝试进行登录,若未成功,请检查网络连接、当前浏览器是否已登录账号。'); } function startAuthFromUrl(authUrl) { try { var urlObj = new URL(authUrl); var params = urlObj.searchParams; var uuid = params.get('uuid'); var enc = params.get('enc'); if (uuid && enc) { doAuth(uuid, enc); } } catch (e) {} } GM_registerMenuCommand('学习通扫码授权', function () { var currentUrl = window.location.href; var defaultUrl = ''; if (currentUrl.indexOf('/toauthlogin') !== -1) { defaultUrl = currentUrl; } var input = prompt('请输入登录确认 URL:', defaultUrl); if (input && input.trim()) { startAuthFromUrl(input.trim()); } }); })();