zaixian100f.com_libjs

zaixian100f.com 在线100分 自动答题,12倍速播放视频, 因题库是加密原因,已对所加载过的题目进行了保存,已增加导出工具显示,待下次升级可自行导出。

Script này sẽ không được không được cài đặt trực tiếp. Nó là một thư viện cho các script khác để bao gồm các chỉ thị meta // @require https://update.greasyforks.org/scripts/511729/1460593/zaixian100fcom_libjs.js

// ==UserScript==
// @name        zaixian100f.com_libjs
// @namespace   www.miw.cn
// @description zaixian100f.com 在线100分 自动答题,12倍速播放视频, 因题库是加密原因,已对所加载过的题目进行了保存,已增加导出工具显示,待下次升级可自行导出。
// @match       *://*.zaixian100f.com/*
// @grant       GM.xmlHttpRequest
// @grant       GM.openInTab
// @grant       GM.listValues
// @grant       GM.notification
// @grant       GM.download
// @connect     *
// @version     1.3.5
// @author      [email protected]
// @license     MIT
// ==/UserScript==
const ans ={};
let myquestions = new Set(JSON.parse(localStorage.getItem('myquestions') || '[]'));
let mysaved=localStorage.getItem('mysaved') || '0';
let need_face_num = 0;
const _post = GM.xmlHttpRequest;
console.log(myquestions);

const answer = (x,v)=>{
  const o=x.parentNode.nextElementSibling.querySelectorAll(`[value=${v}]`);
  if(o.length) {
    o[0].click();
  }
}

const doit=()=>{
  document.querySelectorAll('[id^=questions_]').forEach(x=>{
      const id = x.id.substr(10);
      const an = ans[id];
      if(an){
        if(an!='true' && an!='false'){
          for(let v of an.split('')){
            answer(x,v);
          }
        } else {
          answer(x,an);
        }

      }
  });
};

const _cat = (url,data,fn,method="post")=>{
  _post({
      method: method,
      url: url,
      data: JSON.stringify(data),
      headers: { "Content-Type": "application/json;charset=utf-8" },
      onload: function(r) {
        fn & fn(r);
      }
  });
}

function post(url,data,fn,method='POST'){

  let b = {}
  if(method==='POST'){
    b = {"body": JSON.stringify(data)}
  }
  fetch(url, {
    "headers": {
      "content-type": "application/json;charset=utf-8",
    },
    ...b,
    "method": method,
    mode:'cors',
  }).then(res=>res.json()).then(json=>{
    console.log(json);
    if(fn) fn();
  });
}
window.post = post;
const getVideoParam=()=>{
  const video = document.querySelector('video#vjs_video_3_html5_api');
  if(video){
      const params = location.href.split('?')[1].split('&');
      const t = Math.floor(video.duration);
      const r = ("00" + (t % 60)).slice(-2);
      const m = Math.floor(t / 60) +':'+r;
      const p = {"now_minute":m,"need_face_num":need_face_num,"vide_ratio":"0.01"};
      for(let s of params){
        let a=s.replace('Id','_id').split('=');
        p[a[0]]=a[1];
      }
      console.log('课程参数:',p);
      return p;
  } else {
    return null;
  }

}
const videoFinal=()=>{
  const p = getVideoParam();
  post("https://www.zaixian100f.com/api/course/addStudyTime",p,()=>{
    setTimeout(()=>{
      document.querySelector('.to-course').click();
    },2000);
  });
}


const addFunc=(c,n,fn)=>{
  const p=document.querySelector(`${c}`);

  if(!!p){
    const have = p.querySelectorAll('.__doit');
    if(have.length==0){
        const btn = document.createElement("button");
        btn.textContent = n;
        btn.classList.add('__doit');
        btn.addEventListener('click', function() {
          fn && fn();
        });
        p.appendChild(btn);
    }

  }

}

const addFuncs=()=>{
  addFunc('.lesson—left h1','12倍速',()=>{
    const video = document.querySelector('video#vjs_video_3_html5_api');
    if(video){
          video.addEventListener('ended',(e)=>{
              //console.log(e);
              videoFinal();
          });
          video.playbackRate=12;
    }

  });
  addFunc('.test-paper h4','自动答题',()=>{
    doit();
  });
}
const refresh_names=()=>{
  const _names = new Set(JSON.parse(localStorage.getItem('saved') || '[]'));
  console.log(_names)
  _names.forEach(i=>{
    const _list = new Set(JSON.parse(localStorage.getItem('saved-'+i) || '[]'));
    const element = document.querySelector(`[data-vname="${i}"]`);
    element && element.parentNode.removeChild(element);
    const _d = `<div data-vname="${i}">${i} : ${_list.size} <button class="_down" style="padding:0px;margin-left:5px;line-height:1;border:none;" data-name="${i}">⬇️</button></div>`;
    const div = document.createElement("div");
    div.innerHTML=_d;
    document.getElementsByClassName('__mytool')[0].appendChild(div);
  });
}
const save_result=(res)=>{
  if(res.list){
    for(let i in res.list){
      const _list = new Set(JSON.parse(localStorage.getItem('saved-'+i) || '[]'));
      res.list[i].forEach(x=>{_list.add(x);});
      localStorage.setItem('saved-'+i,JSON.stringify(Array.from(_list)));
      const _names = new Set(JSON.parse(localStorage.getItem('saved') || '[]'));
      _names.add(i);
      localStorage.setItem('saved',JSON.stringify(Array.from(_names)));
    }
  }
  refresh_names();
}
const root_url = 'https://cat.miw.cn';
const save_url = root_url+'/cat/zx100';
const down_url = root_url+'/cat/zx100/down';

const showTip=(msg)=>{
  var obj = {
    title:"提示框",  //标题 可选 也是默认值
    infoTips:msg,  //提示消息 可选 也是默认值
    duration:1800,  //消失时间 可选 也是默认值
    width:320,    //宽度 可选 也是默认值
    height:50,    //高度 可选 也是默认值
  };
  showTips(obj);
}
const __doExport=(name)=>{
  //这里开始导出
  const _list = new Set(JSON.parse(localStorage.getItem('saved-'+name) || '[]'));

    if(_list.size==0){
      showTip("未能成功保存题目,请先浏览全部题目再来导出.");
    } else {
      //console.log(_list.size);
      _cat(down_url,{ids:Array.from(_list),paperName:name},(v)=>{
        v & console.log(v.responseText);
        if(v.responseText!='Invalid CORS request'){
          //GM.openInTab(root_url+'/cat/zx100/down/'+v.responseText)
          GM.download({
            url: root_url+'/cat/zx100/down/'+v.responseText,
            name: name+".html", //不填则自动获取文件名
            saveAs: true,
          });
        } else {
          showTip("无权操作");
        }
      });
    }
}

const show_tool=()=>{
  const elements = document.getElementsByTagName('*');
  let zIndex=0;
  for(e of elements){
    let s=window.getComputedStyle(e);
    if(s.zIndex && s.zIndex!='auto') {
      try{
        let t = parseInt(s.zIndex);
        zIndex = t>zIndex?t:zIndex;
      }catch(e){}
    }
  }
  var body = document.body;
  var __mytool = document.createElement("div");
      __mytool.innerHTML = `浏览:<span class="myquestions">${myquestions.size}</span><br>保存:`;
      __mytool.classList.add('__mytool');

  __mytool.style.cssText = `position:fixed;left:20px;top:150px;bord-radius:10px; z-index:${zIndex+1};font-size:9pt;padding:5px; max-width:180px;height:auto;background-color: rgba(109, 174, 243,0.6);color:yellow;box-shadow:3px 3px 3px #ffffffbf;`;
  body.parentNode.insertBefore(__mytool, body);

    var container = document.getElementsByClassName('__mytool')[0];

    // 绑定事件处理器到容器,用于未来子元素的点击事件
    container.addEventListener('click', function(event) {
      // 检查事件是否来自特定的子元素或符合特定条件的其他元素
      if (event.target && event.target.matches('._down')) {
        const _name = event.target.getAttribute('data-name');
        //console.log('子元素被点击了!'+_name);
        __doExport(_name);
      }
    });

}

function showTips(objInfo){
  var mTitle = objInfo && objInfo.title || "提示框";
  var w = objInfo && objInfo.width || 180;

  var h = objInfo && objInfo.height || 100;
  var duration = objInfo && objInfo.duration || 800;

  var infoTips = objInfo && objInfo.infoTips || "hi";

  var alert = document.createElement("div");
  alert.style.cssText = `position:absolute;left:50%;top:50%;z-index:99999;transform: translate(-50%,-50%);color:white;font-size:12px;border-radius:10px;box-shadow:inset 0px 0px 3px #fff;background-color: rgba(0,0,0,0.5);overflow:hidden;`;
  alert.style.width = w+"px";
  alert.style.minHeight = h+"px";

  var title = document.createElement("p");
  title.innerHTML = mTitle+":";
  title.style.cssText = `margin:10px 0 10px 10px;`;

  var con = document.createElement("p");
  con.style.cssText = `display:flex;justify-content:center;align-items:center;padding:0px 10px 0px;margin-bottom:10px;font-size:14px;word-break:break-all;`;
  con.innerHTML = infoTips;

  alert.appendChild(title);
  alert.appendChild(con);
  document.body.appendChild(alert);
  setTimeout(function(){
    document.body.removeChild(alert);
  },duration);
}

function __init() {
    var ___open = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = async function (method, url, async) {
        const res = await ___open.apply(this, arguments);
        addFuncs();
        return res;
    };

    const nativeSend = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function(body) {
        const nativeOnReadyStateChange = this.onreadystatechange;
        this.onreadystatechange = async function() {

            if (this.readyState === 4) {
              if(this.responseURL.endsWith('/api/course/faceNumber')){
                need_face_num = JSON.parse(this.responseText).data.count;
                //console.log(need_face_num);
              }
              if(this.responseType !='arraybuffer'){
                try{
                  //console.log(this);
                  //console.log(await GM.listValues());
                 const responseText=this.responseText;
                  const res = JSON.parse(responseText);
                  const list = res.data.testpaper_item || res.data.content || res.data.items || res.data.item;
                  const title=res.data.testpaper_name || res.data.title;
                  if(list && list.length){
                    list.map(x=>{
                      const an = JSON.parse(x.answer).answer;
                      ans[x.id] = typeof an ==='string' ? an : an.join('');
                      x['user_answer'] = an;
                      myquestions.add(x.id);
                    });
                  }
                  if(myquestions.size>0){localStorage.setItem('myquestions',JSON.stringify(Array.from(myquestions)));}
                  console.log('我的题目数量:',myquestions.size);
                  if(save_url!=this.responseURL && list ){
                    _cat(save_url,{url:this.responseURL,list:list, title: title},(v)=>{
                        //v & console.log(v.responseText);
                        if(v.responseText=='Invalid CORS request'){
                          _cat(save_url,{url:this.responseURL,list:list, title: title},(v)=>{
                              //v & console.log(v.responseText);
                              if(v.responseText=='Invalid CORS request'){
                                console.log('重试失败');
                              } else {
                                //GM.openInTab("https://www.miw.cn/",{active:false});
                                save_result(JSON.parse(v.responseText));
                              }
                          });
                        } else {
                          //GM.openInTab("https://www.miw.cn/",{active:false});
                          save_result(JSON.parse(v.responseText));
                        }
                    });
                  }

                }catch(e){
                  console.log('解析出错,说明不是需要的数据');
                }
              }
            }

            if (nativeOnReadyStateChange) {
                nativeOnReadyStateChange.apply(this, arguments);
            }
        };
        nativeSend.apply(this, arguments);
    };

}
长期地址
遇到问题?请前往 GitHub 提 Issues。