- // ==UserScript==
- // @name JsonCrawler
- // @namespace http://tampermonkey.net/
- // @version 0.3
- // @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);
- })();