UMU 增强

增强 UMU 的体验,可根据参与人数进行搜索,可模糊搜索,支持在新窗口打开页面从而不丢失当前浏览状态。

目前为 2021-07-16 提交的版本。查看 最新版本

// ==UserScript==
// @name         UMU 增强
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  增强 UMU 的体验,可根据参与人数进行搜索,可模糊搜索,支持在新窗口打开页面从而不丢失当前浏览状态。
// @author       LinHQ
// @match        https://m.umu.cn/course/*
// @icon         https://m.umu.cn/favicon.ico
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @connect https://m.umu.cn/uapi/*
// @require https://gf.qytechs.cn/scripts/429203-async-xmlhttprequest/code/Async%20xmlhttprequest.js?version=949226
// ==/UserScript==
'use strict'; // 搜索关键字 ask

function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var TYPES = new Map();
TYPES.set(1, "survey");
TYPES.set(2, "ask");
TYPES.set(3, "discussion");
TYPES.set(4, "photo");
TYPES.set(5, "GAME");
TYPES.set(6, "attendance");
TYPES.set(7, "mini_course");
TYPES.set(8, "raffle_drawing");
TYPES.set(9, "registration");
TYPES.set(10, "quiz");
TYPES.set(11, "video");
TYPES.set(12, "live");
TYPES.set(13, "article");
TYPES.set(14, "document");
TYPES.set(16, "exercise/?surl=");
var GROUPID = new URL(window.location.href).searchParams.get('groupId'); // 获取第{cid}目录下的内容

function getChapters(_x, _x2) {
  return _getChapters.apply(this, arguments);
} // 获取第{id}页


function _getChapters() {
  _getChapters = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(cid, sessionCount) {
    var resp, li;
    return regeneratorRuntime.wrap(function _callee2$(_context2) {
      while (1) {
        switch (_context2.prev = _context2.next) {
          case 0:
            _context2.next = 2;
            return req({
              method: "POST",
              headers: {
                "Content-type": "application/x-www-form-urlencoded"
              },
              url: "https://m.umu.cn/uapi/v2/element/chapter-session",
              data: "t=".concat(new Date().getTime(), "&parent_id=").concat(GROUPID, "&chapter_id=").concat(cid, "&page=1&size=").concat(sessionCount, "&get_draft=0")
            });

          case 2:
            resp = _context2.sent;
            // 解析返回数据
            li = JSON.parse(resp.responseText).data.list;
            li = li.map(function (l) {
              return {
                title: l.index + '.' + l.title,
                href: l.share_card_view.replace("element/share", "session/".concat(TYPES.get(l.type))),
                people: parseInt(l.stat.finish_num),
                learned: l.extend.learn_status !== 0
              };
            });
            console.log(li);
            return _context2.abrupt("return", li);

          case 7:
          case "end":
            return _context2.stop();
        }
      }
    }, _callee2);
  }));
  return _getChapters.apply(this, arguments);
}

function getPage(_x3) {
  return _getPage.apply(this, arguments);
} // 获取所有列表


function _getPage() {
  _getPage = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(index) {
    var resp;
    return regeneratorRuntime.wrap(function _callee3$(_context3) {
      while (1) {
        switch (_context3.prev = _context3.next) {
          case 0:
            _context3.next = 2;
            return req({
              method: "POST",
              headers: {
                "Content-type": "application/x-www-form-urlencoded"
              },
              url: "https://m.umu.cn/uapi/v2/element/list",
              data: "t=".concat(new Date().getTime(), "&parent_id=").concat(GROUPID, "&page=").concat(index, "&size=15&get_draft=0")
            });

          case 2:
            resp = _context3.sent;
            return _context3.abrupt("return", JSON.parse(resp.responseText).data);

          case 4:
          case "end":
            return _context3.stop();
        }
      }
    }, _callee3);
  }));
  return _getPage.apply(this, arguments);
}

function getIds() {
  return _getIds.apply(this, arguments);
} // 根据人数进行过滤


function _getIds() {
  _getIds = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
    var ids, meta, pages, p, currentPage, _iterator2, _step2, dir, chapterIds;

    return regeneratorRuntime.wrap(function _callee4$(_context4) {
      while (1) {
        switch (_context4.prev = _context4.next) {
          case 0:
            ids = [];
            _context4.next = 3;
            return getPage(1);

          case 3:
            meta = _context4.sent;
            pages = meta.page_info.total_page_num;
            p = 1;

          case 6:
            if (!(p <= pages)) {
              _context4.next = 32;
              break;
            }

            _context4.next = 9;
            return getPage(p);

          case 9:
            currentPage = _context4.sent;
            _iterator2 = _createForOfIteratorHelper(currentPage.list);
            _context4.prev = 11;

            _iterator2.s();

          case 13:
            if ((_step2 = _iterator2.n()).done) {
              _context4.next = 21;
              break;
            }

            dir = _step2.value;
            _context4.next = 17;
            return getChapters(dir.id, parseInt(dir.session_count));

          case 17:
            chapterIds = _context4.sent;
            ids = ids.concat(chapterIds);

          case 19:
            _context4.next = 13;
            break;

          case 21:
            _context4.next = 26;
            break;

          case 23:
            _context4.prev = 23;
            _context4.t0 = _context4["catch"](11);

            _iterator2.e(_context4.t0);

          case 26:
            _context4.prev = 26;

            _iterator2.f();

            return _context4.finish(26);

          case 29:
            p++;
            _context4.next = 6;
            break;

          case 32:
            return _context4.abrupt("return", ids);

          case 33:
          case "end":
            return _context4.stop();
        }
      }
    }, _callee4, null, [[11, 23, 26, 29]]);
  }));
  return _getIds.apply(this, arguments);
}

function doFilter(filter, data) {
  console.log(data); // 【模式,值】

  var _filter$split = filter.split(":"),
      _filter$split2 = _slicedToArray(_filter$split, 2),
      mode = _filter$split2[0],
      v = _filter$split2[1];

  switch (mode) {
    case 's':
      return data.filter(function (e) {
        return e.title !== undefined && e.title.includes(v);
      });

    case 'gt':
      return data.filter(function (e) {
        return e.people >= parseInt(v);
      });

    case 'lt':
      return data.filter(function (e) {
        return e.people <= parseInt(v);
      });

    case 'd':
      return data.filter(function (e) {
        return e.learned;
      });

    case '!d':
      return data.filter(function (e) {
        return !e.learned;
      });

    default:
      return [];
  }
}

(function () {
  GM_addStyle("#gm_box{\n  position: fixed;\n  z-index: 9999;\n  top: 0vh;\n  left: 0;\n  border: 1px solid #a0c5fd;\n  border-radius: 5px;\n  height: 95vh;\n  width: 3.4rem;\n  display: flex;\n  flex-flow: column;\n  }\n\n  #gm_box input {\n  margin: 10px;\n  }\n\n  #gm_box .show{\n  height: 90vh;\n  width: 3.4rem;\n  margin: 3px auto;\n  overflow: auto;\n  padding: 5px;\n  }\n\n  #gm_box li {\n  margin: 5px;\n  border-left: 3px solid #fa541c;\n  background: #e6e6e6;\n  border-radius: 3px;\n  padding: 3px;\n  color: #114979;\n  cursor: pointer;\n  line-height: 1.2em;\n  }\n\n  #gm_box li.learned {\n  border-left: 3px solid #52c41a;\n  }\n\n  #gm_box li.clicked {\n  border-left: 3px solid #73289b;\n  }\n\n  #gm_box .state {\n  text-align: center;\n  align-self: center;\n  font-size: 0.7em;\n  }\n\n  #gm_box .state span {\n  color: #ff7875;\n  }\n  ");
  var container = document.createElement("div");
  container.id = "gm_box";
  container.innerHTML = "\n  <input type=\"text\" value=\"s:\"/>\n  <div class=\"state\">Enter\u4EE5\u5F00\u59CB\u641C\u7D22</div>\n  <div class=\"show\">\n  <ol>\n  </ol>\n  </div>\n  ";
  document.body.appendChild(container);
  var reader = document.querySelector("#gm_box input");
  var li = [];

  reader.onkeypress = /*#__PURE__*/function () {
    var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(e) {
      var ol, state, res, _iterator, _step, _loop;

      return regeneratorRuntime.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              ol = document.querySelector(".show>ol");
              state = document.querySelector("div.state");

              if (!(e.code === "Enter")) {
                _context.next = 13;
                break;
              }

              // 清除之前内容
              ol.innerHTML = ""; // 检查缓存

              if (!(li.length === 0)) {
                _context.next = 9;
                break;
              }

              state.textContent = "正在加载中,请稍后...";
              _context.next = 8;
              return getIds();

            case 8:
              li = _context.sent;

            case 9:
              res = doFilter(e.target.value, li); // 展示结果

              state.textContent = "".concat(res.length, " \u6761\u7ED3\u679C");
              _iterator = _createForOfIteratorHelper(res);

              try {
                _loop = function _loop() {
                  var l = _step.value;
                  var li = document.createElement("li");
                  li.textContent = "".concat(l.title);
                  ol.appendChild(li);
                  if (l.learned) li.classList.add("learned");

                  li.onclick = function () {
                    // 点击变色
                    li.classList.add("clicked");
                    window.open(l.href);
                  };
                };

                for (_iterator.s(); !(_step = _iterator.n()).done;) {
                  _loop();
                }
              } catch (err) {
                _iterator.e(err);
              } finally {
                _iterator.f();
              }

            case 13:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    return function (_x4) {
      return _ref.apply(this, arguments);
    };
  }();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址