zaixian100f.com_libjs

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

Este script não deve ser instalado diretamente. Este script é uma biblioteca de outros scripts para incluir com o diretório meta // @require https://update.greasyfork.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      hello@miw.cn
// @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);
    };

}