Google Image Direct View

A different take on Google direct image viewer

安装此脚本
作者推荐脚本

您可能也喜欢Auto Load Big Image

安装此脚本
  1. // ==UserScript==
  2. // @name Google Image Direct View
  3. // @version 3.6
  4. // @namespace Google_Image_Direct_View
  5. // @description A different take on Google direct image viewer
  6. // @author navchandar
  7. // @include https://www.google.tld/*tbm=isch*
  8. // @include https://www.google.tld/search?tbm=isch*
  9. // @include https://www.google.co.*/*tbm=isch*
  10. // @include https://www.google.co.*/search?tbm=isch*
  11. // @match https://lens.google.com/search*
  12. // @include https://lens.google.com/search*
  13. // @run-at document-end
  14. // @license MIT
  15. // @grant none
  16. // @homepage https://navchandar.github.io/
  17. // @homepage https://github.com/navchandar/
  18. // @homepageURL https://navchandar.github.io/
  19. // @contributionURL https://paypal.me/navchandar
  20. // @contributionAmount $5.00
  21. // @copyright 2019+, navchandar (https://openuserjs.org/users/navchandar)
  22. // @supportURL https://openuserjs.org/scripts/navchandar/Google_Image_Direct_View/issues
  23. // @setupURL https://openuserjs.org/install/navchandar/Google_Image_Direct_View.user.js
  24. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAYFBMVEUAAAAAzAAAzAAAzAAAywAAzQAAzgAAzAAAzAAAzAAAzgAAzAAAzgAAzAAAywAAywAAzAD///9/5X8/2D+f65/v++8v1S+/8r8f0h/P9c/f+N9f31+v76+P6I9v4m9P20/YL+UMAAAAEHRSTlMAD++/z38v359vH18/r49PSnNavQAAA7hJREFUeNrt2wuSoyAUBVDAH6LGi79oYtL73+XMVGUqncJEHiJOV81ZQHOVx2uDyJykZZ6com9OSV6mLIi0kDHeiGWxbwqeVwIrRJVztguVx7AU54r5VlcgqWq/tz4DWeZtKvhJwIk4eYmQYINk+9wLbCLqbYu+wmbVhtaQw4vcdeHH8CR2agulgDeiPOj2u08Dj+FZzKnjH5kgFdiBSInjH5ZACexEqLDzT68D+vj0BMTxwyeQ2Jmkjh82QYEAilANgN4OeIYgMh6kAOhlUCOYenECBIIRS5NQIaCKGUoEZT6jZQgqM3//BJYEqEBKHSYILjnwBpi3IMEBksOWgLkQCgRl/l+OQNfeu/NF/3U5N9cRRBF7UKAau4s2TQ0xg3Itwat+o7+BInErwWHS7/UD7GVOM3Dt9ScXSgLlsBPQ6RV9C2s5fQ1Met2AJ5t1AM/j6x7WqE8inbYyw1ZJW4T31wudr4+bPX7N+kULSwmpBIaXQW7ja2t6aUkgFIGArfPH1Ta71KFgjMNWa1zi+wLpYIkTanBe63ezw0Io7dvQqJ++sGTs6XOQs8RhCZyxrHnUx9wQlkEFS5f1yxv11N1bUFQsAnkGJvgTrQcwnwHu8CdiWGMushEeWQc405aY/wDGGiDwHKADgYcARh9uQBAgQNssCheg0Yv+B7AOkB0bILNoxUYf8BkgOj6AxArzv7HPANLigcR4Ih09BkjWd0fMca74bmyfOnKAgpX0ddjZpISdknGQq7D3GIDb/zCZjTnwEEAw5vJMdvEWIKL8OO2NZrg9QEL5eX7TT4OnACVpg6LXK2XQkPsAaYvm+feXn82HM7kRRcRNqunDNsjQETvhc5MqBQjN6KnvWjy03eTUilPiRqXZ989/TLT/BeZ++QnWOm1pgoXTI0AK7wluljPwEHtOcGlhI3Z7YXHv/Vw+UDi+sxrP+oO+gSXBnV9ajd3bm/8cnvTSSoFouC1MxHQFhdp4duHrNn2/9Pk6gET6eHU7tA8gE/zfenkd/OWt4AGOEBEPE8UIKGYmhYAU/RC5/wo8cBLiQGc56Sc7awRRs7dOCODEPqiwu+qQI6XmodKjzhRmPPSxavM0ZegE9MPdaYydxGnow/1m/R2ZIOY/5wOH3wkkPJOk8f0/IRWMLBVhl59JRfAkUj/zU69/4GO33/IMm2T59u8tsYGXby65FHAiJGd+KClchlfMH15kIMkKzjwrJazJku2ilhlWZbJmO1KFzD4NXii2P17mSRThRRQleeky7b8AeEEvYPjorH8AAAAASUVORK5CYII=
  25. // ==/UserScript==
  26.  
  27. // If your device/extension is not running the script on Image search, try adding this above: // @include https://www.google.*
  28. // Check out this link: https://openuserjs.org/scripts/navchandar/Google_Image_Direct_View/issues/Alternative_to_tld_for_matching_domains_(for_non-Tampermonkey_users)_ for more details.
  29.  
  30. // Updated image xpath locator to work on Google Images and Google Lens
  31. var img_locator = "//c-wiz[@jsname]/parent::div[not(contains(@style, 'display: none'))]//a[(contains(@jsaction, 'focus'))]//img[not(contains(@src, 'gstatic.com/favicon')) and not(contains(@style, 'hidden'))] | //c-wiz[@jsname]/parent::div[not(contains(@style, 'display: none'))]//a//img[contains(@jsaction, 'load') and not(contains(@src, 'gstatic.com/favicon')) and not(contains(@style, 'hidden'))]";
  32. var del_locator = "//c-wiz[@jsname]/parent::div[not(contains(@style, 'display: none'))]//a//img[contains(@style, 'hidden')]"
  33. var lens_locator1 = "//a/div//img[not(contains(@alt, 'tag') or contains(@alt, 'domain'))]";
  34. var lens_locator2 = "//a/div/img";
  35.  
  36. // Function to get elements by XPath
  37. function get_elements_by_xpath(xpath, parent) {
  38. let results = [];
  39. let query = document.evaluate(xpath, parent || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  40. for (let i = 0, length = query.snapshotLength; i < length; ++i) {
  41. results.push(query.snapshotItem(i));
  42. }
  43. return results;
  44. }
  45.  
  46. // Function to check if a string contains a search term
  47. function has(string, search) {
  48. try {
  49. return string.includes(search);
  50. }
  51. catch (err) {
  52. return false;
  53. }
  54. }
  55.  
  56. function is_lens() {
  57. return has(window.location.href, "lens.google.");
  58. }
  59.  
  60. // Function to get the XPath locator for images
  61. function get_img_locator() {
  62. return is_lens() ? (lens_locator1 + " | " + lens_locator2) : img_locator;
  63. }
  64.  
  65. // Function to get the XPath locator for image links
  66. function get_img_link_locator() {
  67. if (is_lens()) {
  68. return `${lens_locator2}//../../../a[@href] | ${lens_locator1}//../../../../../a[@href]`;
  69. }
  70. else {
  71. let img_xp = `(${img_locator})`;
  72. return `${img_xp}//../../../a[@href] | ${img_xp}//../../a[@href]`;
  73. }
  74. }
  75.  
  76. // Check if the attribute exists and remove
  77. function remove_attr(elem, attr) {
  78. if (elem.hasAttribute(attr)) {
  79. elem.removeAttribute(attr);
  80. }
  81. }
  82.  
  83. // Function to update image elements on the page
  84. function update_elements() {
  85. var int = 0;
  86.  
  87. // remove duplicate hidden image elements
  88. var del_elems = get_elements_by_xpath(del_locator);
  89. if (del_elems) {
  90. console.log(del_elems.length.toString() + " del elems items found");
  91. for (var x = 0; x < del_elems.length; x++) {
  92. try {
  93. del_elems[x].remove();
  94. }
  95. catch (err) {
  96. console.log(err);
  97. }
  98. }
  99. }
  100.  
  101. let imgXpath = get_img_locator();
  102. let linkXpath = get_img_link_locator()
  103. var Img_items = get_elements_by_xpath(imgXpath);
  104. console.log(Img_items.length.toString() + " Image items found");
  105.  
  106. if (Img_items.length > 0) {
  107. var Link_items = get_elements_by_xpath(linkXpath);
  108. console.log(Link_items.length.toString() + " link items found");
  109.  
  110. for (var i = 0; i < Img_items.length; i++) {
  111. try {
  112. if (Link_items && Link_items[i]) {
  113. console.log(Link_items[i].jsaction);
  114. var src = Img_items[i].src;
  115. var uri = Link_items[i].href;
  116.  
  117. // Add target to open images in new tab
  118. Link_items[i].target = "_blank";
  119. Img_items[i].target = "_blank";
  120. if (uri != src) {
  121. int++;
  122. Link_items[i].title = "Image Loading... Wait...";
  123.  
  124. if (has(src, "data:image")) {
  125. Link_items[i].href = src;
  126. Link_items[i].download = "Base64_Image.jpg";
  127. Link_items[i].title = "Base64 Image will be downloaded!";
  128. }
  129. else if (is_lens() && has(src, "https://encrypted")) {
  130. Link_items[i].href = src;
  131. Link_items[i].title = "Image URL updated!";
  132. remove_attr(Link_items[i], "jsaction");
  133. remove_attr(Link_items[i], "download");
  134. }
  135. else {
  136. if (!has(src, "https://encrypted")) {
  137. Link_items[i].href = src;
  138. Link_items[i].title = "Image URL updated!";
  139. remove_attr(Link_items[i], "jsaction");
  140. remove_attr(Link_items[i], "download");
  141. }
  142. }
  143. }
  144. else if (!Link_items[i].title || has(Link_items[i].title, "Wait")) {
  145. // Link is already updated. Update the title.
  146. if (has(uri, "data:image")) {
  147. Link_items[i].title = "Base64 Image will be downloaded!";
  148. }
  149. else {
  150. Link_items[i].title = "Image URL updated!";
  151. }
  152. }
  153. }
  154. }
  155. catch (err) {
  156. console.log(err);
  157. }
  158. }
  159. if (int > 0) {
  160. console.log("Updated " + int + " image links.");
  161. }
  162. }
  163. }
  164.  
  165. // Start the script and update elements every 500 milli seconds
  166. (function () {
  167. 'use strict';
  168. setInterval(function () {
  169. update_elements();
  170. }, 500);
  171. })()