自动模拟滑块

//嵌入js 滑块脚本
function start() {
  let js_time1 = null;
  let time2 = null;
  let checkSlideFlag = false;
  let getImagesPollingNumber = 0;
  let slipperPollingNumber = 0;
  let retryRemoveNumber = 0;
  let slipperBtn = "";
  async function getslipperBtn() {
    console.log("getslipperBtn", checkSlideFlag);
    if (checkSlideFlag) {
      return;
    }
    try {
      slipperBtn = document.querySelector(".secsdk-captcha-drag-icon");
    } catch {
      slipperBtn = null;
    }
    if (slipperBtn) {
      checkSlideFlag = true;
      console.log("获取到滑块元素");
      await getimage();
    } else {
      slipperPollingNumber++;
      if (slipperPollingNumber > 10) {
        console.log("未获取到滑块元素", slipperPollingNumber);
        return;
      }
    }
  }
  //检测是否要刷新滑块图片
  function checkMsg() {
    let msgDom = "";
    try {
      msgDom = document.querySelectorAll(".sc-htoDjs");
    } catch {
      msgDom = null;
    }
    if (msgDom) {
      // let errDom = msgDom[0].innerHTML;
      let errDom = msgDom[0];
      if (errDom && RegExp(/网络故障/).test(errDom.innerHTML)) {
        console.log(RegExp(/网络故障/).test(errDom.innerHTML), "innerHTML");
        setTimeout(() => {
          document.querySelectorAll(".secsdk_captcha_refresh")[0].click();
        }, 2000);
      }
    }
  }
  //获取滑块图片
  async function getimage() {
    let file = "";
    let sub_file = "";
    try {
      file = document.getElementById("captcha-verify-image").attributes["src"]
        .nodeValue;
      sub_file = document.getElementsByClassName("captcha_verify_img_slide")[0]
        .attributes["src"].nodeValue;
    } catch {
      file = "";
      sub_file = "";
    }
    if (file && sub_file) {
      console.log("获取图片成功", new Date().getTime(), file, sub_file);
      let list = null;
      try {
        list = [{x:120,y:220}] // 需要动态获取图片坐标
      } catch {
        list = null;
        if (retryRemoveNumber < 5) {
          setTimeout(async () => {
            await getimage();
            console.log(`重试次数${retryRemoveNumber}`);
          }, 2000);
        }
      }
      if (!list) {
        console.log("获取坐标失败");
      }
      let startPosition = slipperBtn.getBoundingClientRect();
      let ratio = 1.0;
      var img_url = file + "?" + Date.parse(new Date());
      // 创建对象
      var img = new Image();
      // 改变图片的src
      img.src = img_url;
      // 加载完成执行
      img.onload = () => {
        // 打印
        console.log("img-width:", img.width);
        let imgWidth = img.width;
        let domWidth = document.querySelector(
          "#captcha-verify-image"
        ).offsetWidth;
        ratio = (domWidth / imgWidth).toFixed(2);
        console.log("domWidth", domWidth, imgWidth, ratio);
        console.log(
          list[0].x,
          list[0].x * ratio - startPosition.width / 2,
          "移动的x轴"
        );
        const clientX = startPosition.left;
        const clientY = startPosition.top + startPosition.height / 2;
        console.log(clientX, clientY, "滑块开始位置");
        setTimeout(() => {
          dragandDrop(
            slipperBtn,
            clientX,
            clientY,
            list[0].x * ratio - startPosition.width / 2
          );
        }, 2000);
      };
    } else {
      console.log("getImagesPollingNumber", getImagesPollingNumber);
      getImagesPollingNumber++;
      if (getImagesPollingNumber > 10) {
        return;
      }
      setTimeout(async () => {
        await getimage();
        console.log(1234);
      }, 2000);
    }
  }
  //模拟移动滑块
  function dragandDrop(elem, clientX, clientY, distance) {
    console.log("dragandDrop", new Date().getTime());
    var k = 0;
    var interval;
    iME(elem, "mousedown", 0, 0, clientX, clientY);
    interval = setInterval(function () {
      k++;
      iter(k);
      console.log("dragandDrop", k, distance);
      if (k > distance) {
        console.log("mouseup");
        clearInterval(interval);
        iME(elem, "mouseup", clientX + k, clientY, 220 + k, 400);
      }
    }, 10);

    function iter(y) {
      iME(elem, "mousemove", clientX + y, clientY, clientX + y, clientY);
    }

    function iME(obj, event, screenXArg, screenYArg, clientXArg, clientYArg) {
      var mousemove = document.createEvent("MouseEvent");
      mousemove.initMouseEvent(
        event,
        true,
        true,
        window,
        0,
        screenXArg,
        screenYArg,
        clientXArg,
        clientYArg,
        0,
        0,
        0,
        0,
        0,
        null
      );
      obj.dispatchEvent(mousemove);
    }
    // setTimeout(() => {
    //   console.log('滑动结束');
    //   checkSlideFlag = false;
    // }, 3000);
  }
  //获取滑块位置属性
  async function checkSlide() {
    // 滑动滑块
    const slideDom =
      (await waitStart(() => {
        return document.querySelector(".nc_iconfont");
      })) ||
      (await waitStart(() => {
        return document.querySelector(".btn_slide");
      }));
    const slidetounlockDom =
      (await waitStart(() => {
        return document.querySelector(".slidetounlock");
      })) ||
      (await waitStart(() => {
        return document.querySelector(".scale_text");
      }));
    if (slideDom && slidetounlockDom) {
      const slideDomInfo = slideDom.getBoundingClientRect();
      const slidetounlockDomInfo = slidetounlockDom.getBoundingClientRect();
      const distance = slidetounlockDomInfo.width - slideDomInfo.width;
      const clientX = slideDomInfo.left;
      const clientY = slideDomInfo.top + slideDomInfo.height / 2;
      dragandDrop(slideDom, clientX, clientY, distance);
    }
  }
  //轮询获取滑块
  js_time1 = setInterval(() => {
    getslipperBtn();
  }, 3000);
  //轮询是否是网络错误而没有获取到滑块
  time2 = setInterval(() => {
    checkMsg();
  }, 4000);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值