您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Dragging any image allows you to do a TinEye image search.
// ==UserScript== // @name Reverse TinEye Image Search // @namespace AmineKudo // @description Dragging any image allows you to do a TinEye image search. // @include * // @exclude *www.google.*/imghp* // @exclude *www.google.*/search?*site=imghp&* // @exclude *www.google.*/search?tbs=sbi:* // @grant none // @version 1.00 // ==/UserScript== if (!document || !document.body || top !== self) return; /*=============*\ |* CONSTANTS *| \*=============*/ var CONSTANT = { incorrectTimeout: 2000, //Milliseconds }; var EL = { body: document.body, head: document.getElementsByTagName('head')[0], zone: null, //Set later form: null, //Set later message: null, //Set later }; var VAR = { dragImgSrc: null, //String dontHide: false, //Bool draggedOver: false, //Bool }; var MESSAGE = { drop: "Drop image here!", incorrect: "This is not a valid image.", oldBrowser: "You browser is too old and cannot use FileReader HTML5 API, please uninstall this userscript", }; var URL = { imageSearch: "https://www.tineye.com/search?url=", formSearch: "https://www.tineye.com/search", }; /*=============*\ |* CHECKS *| \*=============*/ if(!window.FileReader) { alert(MESSAGE.oldBrowser); return; } /*=============*\ |* FUNCTIONS *| \*=============*/ function getId(id) { return document.getElementById(id); } function createEl(elementName, id /*optional*/, attrArr /*optional*/) { var el = document.createElement(elementName); if (id) { el.id = id; } if (attrArr) { try{ for (var attr in attrArr) { el.setAttribute(attr, attrArr[attr]); } }catch(e){alert("Attributes are set wrong: "+e);} } return el; } function fileNameFromFileUrl (url) { var index = url.lastIndexOf("/"); if (index == -1) {return url;} return url.substr(index + 1); } function fixDataUrl(dataURL) { return dataURL.substr(dataURL.indexOf(",") + 1) .replace(/\//gm, "_").replace(/\+/gm, "-"); } /*=============*\ |* HTML *| \*=============*/ function addDropZone() { EL.zone = createEl("div", "userscripts-dropzone"); EL.body.appendChild(EL.zone); EL.message = createEl("div", "userscripts-dropzone-message"); EL.zone.appendChild(EL.message); attachDragEvents(false); } /*=============*\ |* CSS *| \*=============*/ (function(){ var CSS = { "#userscripts-dropzone" : { "margin" : "0", "height" : "50px", "width" : "100%", "-webkit-user-select" : "none", "-moz-user-select" : "none", "user-select" : "none", "position" : "fixed", "top" : "-140px", "left" : "0px", "background" : "#f0f0f0", "box-shadow" : "0 0px 10px rgba(0,0,0,0.8)", "box-sizing" : "border-box", "-webkit-box-sizing" : "border-box", "-moz-box-sizing" : "border-box", "z-index" : "10000000", "-moz-transition-property" : "top", "-moz-transition-duration" : "0.2s", "-moz-transition-timing-function" : "ease-out", "-webkit-transition-property" : "top", "-webkit-transition-duration" : "0.2s", "-webkit-transition-timing-function" : "ease-out", "transition-property" : "top", "transition-duration" : "0.2s", "transition-timing-function" : "ease-out", }, "#userscripts-dropzone.show" : { "top" : "0px", }, "#userscripts-dropzone-message": { "text-align" : "center", "font-size" : "18px !important", "font-weight" : "bold !important", "font-family" : "Arial, san-serif !important", "color" : "black !important", "padding" : "15px", }, }, cssString = "", propString = "", eachSelector = "", style = createEl("style"); for(var selector in CSS) { eachSelector = CSS[selector]; propString = ""; for(var property in eachSelector) { propString += property + ":" + eachSelector[property] + ";"; } cssString += selector + "{" + propString + "}"; } style.appendChild(document.createTextNode(cssString)); EL.head.appendChild(style); })(); /*=============*\ |* FUNCTIONS *| \*=============*/ function openSearchUrl(url) { var fileName = fileNameFromFileUrl(url); // Check if real file if (fileName.indexOf(".") === -1) { displayIncorrectFile(); return; } var tehUrl = URL.imageSearch + escape(url); window.open(tehUrl, "_blank"); hide(); } function displayIncorrectFile() { VAR.dontHide = true; EL.message.innerHTML = MESSAGE.incorrect; setTimeout(function(){ VAR.dontHide = false; hide(); }, CONSTANT.incorrectTimeout); } function processDrop(event) { try{ var dt = event.dataTransfer, link = dt.getData("Text"), imgUrl = VAR.dragImgSrc, files = dt.files, file = null, i = 0; if (imgUrl != null) { clearImageSource(); openSearchUrl(imgUrl); } else if (link != "") { console.log(link) openSearchUrl(link); } else if (files.length > 0) { for (; i < files.length; i++) { file = files[i]; var reader = new FileReader(); reader.file = file; reader.addEventListener("loadend", processFile, false); try { reader.readAsDataURL(file); }catch(error) { displayIncorrectFile(); if (console && console.log) { console.log(error); } } } } else { displayIncorrectFile(); if (console && console.log) { console.log("Not an image",event); } } stopBrowser(event); }catch(e){alert(e)} } function processFile(event) { event.currentTarget.removeEventListener('loadend', processFile, false); if (this.result == "") { displayIncorrectFile(); return; } var dataUrl = fixDataUrl(this.result), fileName = this.file.name; setImageForm(dataUrl, fileName); EL.form.submit(); hide(); this.file = null; setImageForm("", ""); // Fixes Chrome's form searching var counter = parseInt(EL.form.getAttribute('counter')) + 1; EL.form.setAttribute('counter', counter); EL.form.action = EL.form.getAttribute('origAction') + counter; } function setImageForm(dataUrl, fileName) { if (EL.form) { getId('userscripts-form-data-url').setAttribute('value', dataUrl); getId('userscripts-form-filename').setAttribute('value', fileName); return; } EL.form = createEl("form", "userscripts-form-image-search", { enctype: 'multipart/form-data', method: 'POST', target: '_blank', action: (URL.formSearch + '?d=0'), origAction: (URL.formSearch + '?d'), counter: 0, }); var field1 = createEl("input", 'userscripts-form-data-url', { type: 'hidden', name: 'image', value: dataUrl }), field2 = createEl("input", null, { type: 'hidden', name: 'btnG', value: 'Search' }), field3 = createEl("input", 'userscripts-form-filename', { type: 'hidden', name: 'filename', value: fileName }), field4 = createEl("input", null, { type: 'hidden', name: 'hl', value: 'en' }); EL.form.appendChild(field1); EL.form.appendChild(field2); EL.form.appendChild(field3); EL.form.appendChild(field4); EL.zone.appendChild(EL.form); } /*=============*\ |* EVENTS *| \*=============*/ function detachDragEvents() { document.removeEventListener("dragstart", processDragStart, false); document.removeEventListener("dragenter", processDragEnter, false); document.addEventListener("dragend", clearImageSource, false); document.addEventListener("mouseover", mouseMove, false); EL.zone.addEventListener("dragover", dragOverZone, false); EL.zone.addEventListener("dragleave", dragOutZone, false); EL.zone.addEventListener("drop", processDrop, false); } function attachDragEvents(shouldRemoveEvents) { document.addEventListener("dragenter", processDragEnter, false); document.addEventListener("dragstart", processDragStart, false); if (!shouldRemoveEvents) { document.removeEventListener("dragend", clearImageSource, false); document.removeEventListener("mouseover", mouseMove, false); EL.zone.removeEventListener("dragover", dragOverZone, false); EL.zone.removeEventListener("dragleave", dragOutZone, false); EL.zone.removeEventListener("drop", processDrop, false); } } function stopBrowser(evt) { evt.stopPropagation(); evt.preventDefault(); } function dragOverZone(event){ VAR.draggedOver = true; stopBrowser(event); } function dragOutZone(event){ VAR.draggedOver = false; stopBrowser(event); } function mouseMove(e) { if (VAR.draggedOver) { return; } if (EL.zone.className === "show") { hide(); } else { attachDragEvents(); } } function processDragStart(event) { var el = event.target; if (el.tagName === "IMG") { VAR.dragImgSrc = el.src; } else { var imgs = el.getElementsByTagName('img'); if (imgs.length > 0) { VAR.dragImgSrc = imgs[0].src; } else { if (el.tagName !== "A" || el.getAttribute("href") == "") { detachDragEvents(); return; } } } show(); } function processDragEnter(event) { if (VAR.dragImgSrc != null || event.dataTransfer.getData('Text') == "") { show(); } else { detachDragEvents(); } } /*=============*\ |* MISC *| \*=============*/ function clearImageSource(event) { VAR.dragImgSrc = null; hide(); } function show() { if (EL.zone.className === "show") { return; } EL.message.innerHTML = MESSAGE.drop; detachDragEvents(); EL.zone.className = "show"; } function hide() { if (EL.zone.className === "") { return; } attachDragEvents(); if (VAR.dontHide) { return; } VAR.draggedOver = false; EL.zone.className = ""; } /*=============*\ |* START *| \*=============*/ addDropZone();