您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
获取截图及json
当前为
// ==UserScript== // @name FinalSpider // @namespace http://tampermonkey.net/ // @version 0.2 // @description 获取截图及json // @author You // @match *://*/* // @license MIT // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // ==/UserScript== (function () { 'use strict'; // * 在本地进行文件保存 // * @param {String} data 要保存到本地的图片数据/或路径 // * @param {String} filename 文件名 // */ function saveFile(data, filename) { // 创建一个<a>标签 let save_link = document.createElement('a'); save_link.href = data; save_link.download = filename; let event = document.createEvent('MouseEvents'); event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); save_link.dispatchEvent(event); } //本地下载快照 ,name是文件的部分名称 function doLoadQR(name) { //新建一个画布元素 let canvas2 = document.createElement("canvas"); //获取该元素区块的本身宽高 let w = 3000; let h = 2000; // console.log(w+"======"+h); //因为直接用默认画布会模糊,因此自定义画布,设置画布尺寸为容器的两倍大小,再将内容放大两倍画上去, // 修改偏移量,就可以解决模糊问题 //画布真实宽高 canvas2.width = w; canvas2.height = h; //宽高宽高 canvas2.style.width = w + "px"; canvas2.style.height = h + "px"; //设置画布的内容 let context = canvas2.getContext("2d"); //x,y轴放大两倍 //context.scale(2, 2); //获取容器边距对象 let rect = document.getElementsByTagName('body')[0]; //设置偏移量 context.translate('-' + rect.left, '-' + rect.top); //调用库 html2canvas(document.getElementsByTagName('body')[0] , { useCORS: true, scale: 2, width: w, height: h, //使用自定义的画布 canvas: canvas2, // window.devicePixelRatio是设备像素比 dpi: window.devicePixelRatio,//* 2, } ).then(function (canvas) { // 回调生成的画布canvas对象 // 获取生成的图片的相对url,其实将bese64加密的数据 的数据类型image/png换成image/octet-stream let imgUri = canvas.toDataURL("image/png") .replace("image/png", "image/octet-stream"); //文件名称 let filename = (new Date()).getTime() + "_" + name + '.png'; //下载 saveFile(imgUri, filename); }); } var script = document.createElement('script'); script.src = "http://html2canvas.hertzen.com/dist/html2canvas.min.js"; document.getElementsByTagName('head')[0].appendChild(script); var input = document.createElement("input"); input.type = "text"; input.style.width = "300px"; input.style.height = "50px"; input.style.borderRadius = "10px"; input.style.textAlign = "center"; input.value = (new Date()).getTime() + '默认名称'; input.style.borderColor = "#444654"; input.style.marginBottom = "20px"; var button = document.createElement("button"); //创建一个input对象(提示框按钮) button.id = "id001"; button.textContent = "DownLoad"; button.style.width = "200px"; button.style.height = "50px"; button.style.color = "#000" button.style.alignItems = "center"; button.style.borderRadius = "15px"; button.style.backgroundColor = "#ECF8FF"; button.style.border = "none"; button.style.marginBottom = "20px"; var isOnButton = document.createElement("button"); isOnButton.textContent = "已开启跳转"; isOnButton.style.width = "200px"; isOnButton.style.height = "50px"; isOnButton.style.color = "#000" isOnButton.style.alignItems = "center"; isOnButton.style.borderRadius = "15px"; isOnButton.style.backgroundColor = "#ECF8FF"; isOnButton.style.border = "none"; isOnButton.style.marginBottom = "20px"; var DownloadPicture = document.createElement("button"); DownloadPicture.textContent = "下载快照"; DownloadPicture.style.width = "200px"; DownloadPicture.style.height = "50px"; DownloadPicture.style.color = "#000" DownloadPicture.style.alignItems = "center"; DownloadPicture.style.borderRadius = "15px"; DownloadPicture.style.backgroundColor = "#ECF8FF"; DownloadPicture.style.border = "none"; DownloadPicture.style.marginBottom = "20px"; var container = document.createElement("div"); container.appendChild(input); container.appendChild(button); container.appendChild(DownloadPicture); container.appendChild(isOnButton); container.style.display = "flex"; container.style.flexDirection = "column"; container.style.justifyContent = "center"; container.style.alignItems = "center"; var isOn = true; isOnButton.onclick = function () { isOn = !isOn; if (isOn) { isOnButton.textContent = '已开启跳转'; isOnButton.style.backgroundColor = '#ECF8FF'; isOnButton.style.color = '#000'; } else { isOnButton.textContent = '已关闭跳转'; isOnButton.style.backgroundColor = '#ECF8FF'; isOnButton.style.color = '#000'; } } DownloadPicture.onclick = function () { function isEmpty(s) { return s == undefined || s === ''; } var iframe = document.getElementsByTagName('iframe')[0]; if (isOn && !isEmpty(iframe)) { var iframeSrc = iframe.getAttribute('src'); window.location.href = iframeSrc; // 创建消息提示框元素 var alertBox = document.createElement('div'); alertBox.setAttribute('class', 'alert-box'); alertBox.style.position = 'fixed'; alertBox.style.top = '0'; alertBox.style.width = '100%'; alertBox.style.padding = '10px'; alertBox.style.backgroundColor = '#007bff'; alertBox.style.color = '#fff'; alertBox.style.textAlign = 'center'; alertBox.style.zIndex = '9999'; alertBox.style.transition = 'transform .5s ease-in-out'; // 创建消息提示框文本元素 var alertText = document.createElement('span'); alertText.setAttribute('class', 'alert-text'); alertBox.appendChild(alertText); // 添加消息提示框到页面 document.body.appendChild(alertBox); // 显示消息提示框 function showAlert(message) { alertText.innerHTML = message; alertBox.style.transform = 'translateY(0)'; setTimeout(function () { alertBox.style.transform = 'translateY(-100%)'; }, 3000); } // 示例调用代码 showAlert('~已跳转到子文档对应网站~'); return; } doLoadQR(input.value); }; //绑定按键点击功能 button.onclick = function () { //如果有iframe元素,则跳转到对应网站,可以选择是否跳转 var iframe = document.getElementsByTagName('iframe')[0]; if (isOn && !isEmpty(iframe)) { var iframeSrc = iframe.getAttribute('src'); window.location.href = iframeSrc; // 创建消息提示框元素 var alertBox = document.createElement('div'); alertBox.setAttribute('class', 'alert-box'); alertBox.style.position = 'fixed'; alertBox.style.top = '0'; alertBox.style.width = '100%'; alertBox.style.padding = '10px'; alertBox.style.backgroundColor = '#007bff'; alertBox.style.color = '#fff'; alertBox.style.textAlign = 'center'; alertBox.style.zIndex = '9999'; alertBox.style.transition = 'transform .5s ease-in-out'; // 创建消息提示框文本元素 var alertText = document.createElement('span'); alertText.setAttribute('class', 'alert-text'); alertBox.appendChild(alertText); // 添加消息提示框到页面 document.body.appendChild(alertBox); // 显示消息提示框 function showAlert(message) { alertText.innerHTML = message; alertBox.style.transform = 'translateY(0)'; setTimeout(function () { alertBox.style.transform = 'translateY(-100%)'; }, 3000); } // 示例调用代码 showAlert('~已跳转到子文档对应网站~'); return; } // Your code here... var json = "{\"container\":{\"height\":" + document.documentElement.scrollHeight + "},\"blocks\":["; var reg = /(https?|http|ftp|file):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]/g; var numReg = /[1-9][0-9]*/g; // 遍历所有子元素 var nodes; nodes = document.all; //var pageWidth = document.documentElement.scrollWidth; var pageHeight = document.documentElement.scrollHeight; function isEmpty(s) { return s == undefined || s === ''; } function getElementPosInfo(width, height, left, top) { return "\"width\":" + width + ",\"height\":" + height + ",\"left\":" + left + ",\"top\":" + top + ","; } function getElementLeft(element) { var actualLeft = element.offsetLeft; var current = element.offsetParent; while (current !== null) { actualLeft += current.offsetLeft; current = current.offsetParent; } return actualLeft; } function getElementTop(element) { var actualTop = element.offsetTop; var current = element.offsetParent; while (current !== null) { actualTop += current.offsetTop; current = current.offsetParent; } return actualTop; } for (var i = 0; i < nodes.length; i++) { var o = nodes[i]; if (isEmpty(o)) { continue; } var text = o.innerText; var style = getComputedStyle(o); var color = style.getPropertyValue('color'); var fontSize = style.getPropertyValue('font-size').match(numReg); var backImg = style.getPropertyValue('background-image').match(reg); var textAlign = style.getPropertyValue('text-align'); var backgroundColor = style.getPropertyValue('background-color'); var error = 0; try { var otop = getElementTop(o); var oleft = getElementLeft(o); var owidth = o.offsetWidth; var oheight = o.offsetHeight; } catch (error) { console.log("Find exception"); error = 1; } if (error === 1) { continue; } if (owidth <= 0 || oheight <= 0 || otop < 0 || oleft < 0) { continue; } var posInfo = getElementPosInfo(owidth, oheight, oleft, otop); if (/*(o.tagName === 'A' && o.href != null) ||*/ o.tagName === 'btn') { // add a button var p = o; while (p.firstElementChild !== null) { p = p.firstElementChild; } text = p.innerHTML; var src = p.src; json = json + "{\"key\":\"默认按钮\",\"componentProps\":{}," + posInfo + "\"text\":\"" + text + "\""; //+ "\",\"font\":\""+font if (src !== undefined) { json = json + ",\"src\":\"" + src + "\""; } json = json + ",\"zIndex\":3},"; } else if ((text != null && o.firstElementChild === null && (o.tagName === 'H1' || o.tagName === 'H2' || o.tagName === 'H3' || o.tagName === 'H4' || o.tagName === 'H5' || o.tagName === 'H6' || o.tagName === 'A' || o.tagName === 'SPAN' || o.tagName === 'DIV' || o.tagName === 'P' || o.tagName === 'LI' || o.tagName === 'Q' || o.tagName === 'FONT' || o.tagName === 'B'))) { // add a label json = json + "{\"key\":\"文本框\",\"componentProps\":{}," + posInfo + "\"text\":\"" + text + "\",\"fontColor\":\"" + color + "\",\"size\":\"" + fontSize + "\",\"textAlign\":\"" + textAlign + "\",\"zIndex\":3},"; // "\",\"font\":\""+font+ } else if (o.tagName === 'IMG') { // add an image json = json + "{\"key\":\"图片\"," + posInfo + "\"componentProps\":{" + "\"src\":\"" + o.src + "\"},\"zIndex\":3},"; // + "\",\"font\":\""+font // + "\"text\":\""+text } else if (!isEmpty(backImg)) { // add a background image json = json + "{\"key\":\"网站模块背景\",\"componentProps\":{}," + posInfo + "\"bgcImage\":\"" + backImg + "\",\"bgcColor\":\"rgba(252, 214, 41, 0)\",\"zIndex\":1},"; } else if ((o.tagName === 'DIV' || o.tagName === 'SECTION' || o.tagName === 'FOOTER' || o.tagName === 'BLOCKQUOTE') && backgroundColor != 'rgb(255, 255, 255)' && backgroundColor != 'rgba(255, 255, 255, 1)' && backgroundColor != 'rgba(255, 255, 255, 0)' && backgroundColor != 'rgba(0, 0, 0, 0)' && !isEmpty(o)) { // add a color block json = json + "{\"key\":\"网站模块背景\",\"componentProps\":{}," + posInfo + "\"bgcColor\":\"" + backgroundColor + "\",\"zIndex\":1},"; } } json = json.substr(0, json.length - 1) + "],\"focusData\":{}}"; var downelem = document.createElement('a'); downelem.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(json)); downelem.setAttribute('download', input.value); downelem.style.display = 'none'; document.body.appendChild(downelem); downelem.click(); document.body.removeChild(downelem); /*var url = "http://121.36.109.90:8000/api/spider/add"; var httpRequest = new XMLHttpRequest(); httpRequest.open('POST', url, true); httpRequest.setRequestHeader("Content-type", "application/json"); var obj = { "json": json, }; httpRequest.send(JSON.stringify(obj)); // 响应后的回调函数 httpRequest.onreadystatechange = function () { if (httpRequest.readyState == 4 && httpRequest.status == 200) { var json = httpRequest.responseText; console.log(json); } };*/ }; window.top.document.getElementsByTagName('body')[0].appendChild(container); })();