zaixian100f.com_libjs

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

Este script no debería instalarse directamente. Es una biblioteca que utilizan otros scripts mediante la meta-directiva de inclusión // @require https://update.greasyfork.org/scripts/511729/1460593/zaixian100fcom_libjs.js

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==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);
    };

}