小雅爬爬爬

爬取课件url

目前為 2024-03-06 提交的版本,檢視 最新版本

// ==UserScript==
// @name        小雅爬爬爬
// @match      *://ccnu.ai-augmented.com/*
// @grant       none
// @description 爬取课件url
// @license MIT
// @author   Yi
// @version 1.0.2
// @namespace https://greasyfork.org/users/1268039
// ==/UserScript==

// 定义要抓取的后缀名
var extensions = [".doc", ".pdf", ".docx", ".ppt", ".pptx", ".xls", ".xlsx"];

// 创建一个元素,用于显示抓取到的 url
var list = document.createElement("div");
list.style.position = "fixed";
list.style.top = "10px";
list.style.right = "0";
list.style.width = "300px";
list.style.height = "10%";
list.style.overflow = "auto";
list.style.zIndex = "9999";
list.style.padding = "10px";

// 定义一个函数来改变边框颜色
function changeBorderColor() {
  // 根据当前时间的秒数来计算一个颜色值
  let color = "hsl(" + new Date().getSeconds() * 3 + ", 100%, 50%)";
  // 设置一个动态的边框颜色
  list.style.border = "5px solid " + color;
  // 用 requestAnimationFrame 来在下一帧渲染时再次调用 changeBorderColor 函数
  requestAnimationFrame(changeBorderColor);
}

// 调用一次 changeBorderColor 函数,开始动画
changeBorderColor();

// 为元素添加一个渐变的背景色
list.style.background = "linear-gradient(to right bottom, #ffc700, #ffa500)";

// 为元素添加一个阴影效果
list.style.boxShadow = "0 4px 8px 0 rgba(0, 0, 0, 0.2)";

// 为元素添加一个圆角效果
list.style.borderRadius = "10px";

// 为元素添加一个动画效果,让它在鼠标悬停时放大
list.style.transition = "transform 0.3s";
list.addEventListener("mouseover", function() {
  list.style.transform = "scale(1.1)";
});
list.addEventListener("mouseout", function() {
  list.style.transform = "scale(1)";
});

list.innerHTML = "<h3><span style=\"font-family: '微软雅黑'; font-weight: bold; font-style: italic; font-size: 16px;\">抓取到的 url</span></h3>";
// 添加 draggable 属性,让元素可以被拖动
list.setAttribute("draggable", "true");
// 添加 resize 属性,让元素可以调整大小
list.style.resize = "both";
// 添加事件监听器,处理拖动事件
list.addEventListener("dragstart", function(e) {
  // 设置拖动元素的透明度
  e.target.style.opacity = "0.5";
  // 设置拖动元素的 id
  e.dataTransfer.setData("text/plain", e.target.id);
  // 记录拖动元素的初始位置和鼠标的初始位置
  e.target.startX = e.clientX;
  e.target.startY = e.clientY;
  e.target.offsetX = e.target.offsetLeft;
  e.target.offsetY = e.target.offsetTop;
});
list.addEventListener("drag", function(e) {
  // 如果鼠标的位置有效,根据鼠标的移动距离,更新拖动元素的位置
  if (e.clientX > 0 && e.clientY > 0) {
    e.target.style.left = e.target.offsetX + e.clientX - e.target.startX + "px";
    e.target.style.top = e.target.offsetY + e.clientY - e.target.startY + "px";
  }
});
list.addEventListener("dragend", function(e) {
  // 恢复拖动元素的透明度
  e.target.style.opacity = "1";
});

document.body.appendChild(list);

// 创建一个数组,用于存储已经抓取过的 url
var crawled_urls = [];

// 监听 xhr 请求,检查响应的 url 是否符合条件
var open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
  this.addEventListener("load", function() {
    // 如果 url 包含指定的后缀名之一,且没有被抓取过
    for (var i = 0; i < extensions.length; i++) {
      if (url.includes(extensions[i]) && !crawled_urls.includes(url)) {
        // 将 url 添加到已抓取的数组中
        crawled_urls.push(url);
        // 发送一个新的 xhr 请求,获取真正的下载地址
        var xhr = new XMLHttpRequest();
        xhr.open("GET", url, true);
        xhr.onload = function() {
          // 如果响应的文本中包含一个以 http 或 https 开头的 url,将其添加到列表中
          // 在此之前,先将响应的文本中的 "}}" 和引号替换为空字符串,去掉多余的符号
          var text = xhr.responseText.replace("}}", "").replace(/"/g, "");
          var match = text.match(/(http|https):\/\/\S+/);
          if (match) {
            var link = document.createElement("a");
            link.href = match[0];
            link.target = "_blank";
            link.textContent = match[0];
            link.style.color = "#00aeeb";
            list.appendChild(link);

list.appendChild(document.createElement("br"));
          }
        };
        xhr.send();
        break;
      }
    }
  });
  open.call(this, method, url, async, user, pass);
};