• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[Addon] Google Bilder Direktlinks

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
Nabend,

Link zur aktuellen Version für Firefox, Opera und Chrome:
Chrome: https://chrome.google.com/webstore/detail/googlepanicimages/ofnokbendbpfgbomaepcomeciblhphip
Opera: https://addons.opera.com/en/extensions/details/googlepanicimages/
Firefox: https://addons.mozilla.org/en-US/firefox/addon/googlepanicimages/


ich wollte mal versuchen ob man die Direktlink Funktion bei Google Bilder suche nicht über ein Greasemonkey/Tampermonkey Skript auch indirekt wiederherstellen kann.
Und dies scheint relativ einfach möglich zu sein, zumindest für die Hauptansicht der Google Bildersuche, nicht die "relevante Untersuche" nach ähnlichen Bildern, jenes habe ich nicht eingebaut.

Wenn mit der Maus über ein Bild gefahren wird:
Erscheint ein "View" Link/Button, der bei Klick einen neuen Tab, direkt zum Bild öffnet (Links unten im Bild steht der Link).
Das ganze funktioniert auch für die große Vorschau / Ansicht.

Das funktioniert auch bei dynamisch nachgeladenen Bildern, da das kleine Skript in beliebig einstellbaren Intervallen die Seite auf Änderungen überprüft.

ALT:

Und hier das Skript, auch minimal dokumentiert.

Edit: Alte Version, nur "normale Suche" (nicht jedoch die relevanten Bilder...) - für die relevante bitte die Version aus dem letzten Posting nehmen. Danke.

[src=javascript]// ==UserScript==
// @name Google-Panic-Image
// @version 1
// @author theSplit
// @include https://www.google.*
// @grant none
// ==/UserScript==

// ----------------------------------------------------------------------------------------
// Timings and classname for panic button
// ----------------------------------------------------------------------------------------

// Seconds, when the script should scan the search page for new images
let SECONDS_TO_FIRE = 4

// Our panic class (buttons)
let GOOGLE_PANIC_CLASS = 'Google-panic-image-btn'

// ----------------------------------------------------------------------------------------
// Global variables
// ----------------------------------------------------------------------------------------
let fireAt = 0
let contentHeight = 0

// ----------------------------------------------------------------------------------------
// Gathers all images and adds a "view" link to the direct picture url

function rewampImgs () {
let imgLinks = document.querySelectorAll('a.rg_l')

for (let img of imgLinks) {
let imgURL = img.href.match(/(http|https)%3A.*\.(jpg|jpeg|gif|png|webm)/g)

if (imgURL === null) {
imgURL = img.href.match(/(http|https)%3A.*(\&imgrefurl=http)/g)

if (imgURL !== null) imgURL[0] = imgURL[0].substr(0, imgURL[0].length - 15)
}

if (imgURL !== null) {
let hasControls = false

for (let child of img.parentNode.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
hasControls = true
break
}
}

if (!hasControls) {
imgURL = decodeURIComponent(imgURL[0])
img.parentNode.addEventListener('mouseenter', overlayControls)
img.parentNode.addEventListener('mouseleave', hideControls)
img.parentNode.innerHTML += '<a target="_blank" class="' + GOOGLE_PANIC_CLASS + '" style="visibility:hidden;position:absolute;top:75%;left:5%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:5px 10%;border-radius:12px;z-index:999;font-size:12px;text-decoration:none;" href="' + imgURL + '">View</a>'
}
}
}
}

// ----------------------------------------------------------------------------------------
// Function which does schedule the processing
function waitForLoaded () {
if (Date.now() >= fireAt) {
let tmpHeight = document.querySelector('#cnt').clientHeight
if (contentHeight !== tmpHeight) {
contentHeight = tmpHeight
rewampImgs()
}

fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
window.requestAnimationFrame(waitForLoaded)
} else window.requestAnimationFrame(waitForLoaded)
}

// ----------------------------------------------------------------------------------------
// Display the controls, when the mouse is hovered over the image
function overlayControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'visible'
break
}
}
}

// Hide the controls, if the mouse is moved out of the image
function hideControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'hidden'
break
}
}
}

// ----------------------------------------------------------------------------------------
// Initial run after X seconds after this script was loaded
fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
window.requestAnimationFrame(waitForLoaded)
[/src]

Das Script als Add-on.
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #2
Re: [Grease/Tamper] Google Bilder Direktlinks (normale + relevante Suche)

Okay, ich glaube jetzt passt es:

Der "View" Link wird nun auch für die große Vorschau (bild anklicken) generiert und (scheinbar auch vorher schon) für die kleinen Thumbnails in der relevanten Suche.

Bei den kleinen Bildern gibt es nur einen Haken: Man kann den Link (getestet in Firefox) nicht direkt anklicken, was man machen muß um die "View" Seite zu laden : Strg + Linksklick auf "View", dann geht es und es öffnet sich direkt das Bild in einem neuen Tab.

Hier das Update:

[src=javascript]

// ==UserScript==
// @name Google-Panic-Image
// @version 1
// @author theSplit
// @include https://www.google.*
// @grant none
// ==/UserScript==

// ----------------------------------------------------------------------------------------
// Timings and classname for panic button
// ----------------------------------------------------------------------------------------

// Seconds, when the script should scan the search page for new images
let SECONDS_TO_FIRE = 4

// Time after script reparsing on click on forward and next button on related images search as well as click on related images
let SECONDS_TO_FIRE_CUT = SECONDS_TO_FIRE * 0.25

// Our panic class (buttons)
let GOOGLE_PANIC_CLASS = 'Google-panic-image-btn'

// ----------------------------------------------------------------------------------------
// Global variables
// ----------------------------------------------------------------------------------------
let fireAt = 0
let contentHeight = 0
let currentVed = 'null'

// ----------------------------------------------------------------------------------------
// Gathers all images and adds a "view" link to the direct picture url

function rewampImgs () {

let imgLinks = document.querySelectorAll('a.rg_l')

for (let img of imgLinks) {
if (img.childElementCount >= 2 && img.children[1].nodeName === 'SPAN') continue

let imgURL = img.href.match(/(http|https)%3A.*\.(jpg|jpeg|gif|png|webm|JPG|JPEG|GIF|PNG|WEBM)&/g)

if (imgURL === null) {
imgURL = img.href.match(/(http|https)%3A.*(\&imgrefurl=http)/g)

if (imgURL !== null) imgURL[0] = imgURL[0].substr(0, imgURL[0].length - 15)
} else {
imgURL[0] = imgURL[0].substr(0, imgURL[0].length - 1)
}

if (imgURL === null) {
if (img.href.indexOf('/search?q=') === -1) {
console.log('[ERROR in "rewampImgs" of google-panic-images"] The following image link could not be extracted:')
console.log(img)
console.log(img.href)
}
}

let hasControls = false
for (let child of img.parentNode.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
hasControls = true
break
}
}

if (hasControls) continue

imgURL = decodeURIComponent(imgURL[0])
img.parentNode.addEventListener('mouseenter', overlayControls)
img.parentNode.addEventListener('mouseleave', hideControls)
img.parentNode.innerHTML += '<a target="_blank" class="' + GOOGLE_PANIC_CLASS + '" style="visibility:hidden;position:absolute;top:75%;left:5%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:5px 10%;border-radius:12px;z-index:1;font-size:12px;text-decoration:none;" href="' + imgURL + '">View</a>'
}
}

// ----------------------------------------------------------------------------------------
// Create / adopt the preview image link

function rewampPreviews () {
let vedSrc = document.querySelector('#irc_cb')

if (vedSrc === null) {
console.log('[ERROR in "rewampPreviews" of google-panic-images] vedSrc not found.')
return
} else if (vedSrc.dataset === undefined) {
console.log('[ERROR in "rewampPreviews" of google-panic-images] vedSrc does not contain data-attributes.')
return
} else if (vedSrc.dataset['ved'] === undefined) {
console.log('[ERROR in "rewampPreviews" of google-panic-images] vedSrc does not contain "ved" in dataset.')
return
} else if (vedSrc.dataset['ved'].startsWith(currentVed)) {
return
}

let previewImgs = document.querySelectorAll('img.irc_mi')
let immersiveContainers = document.querySelectorAll('div.immersive-container')

if (previewImgs !== null && immersiveContainers !== null) {
currentVed = document.querySelector('#irc_cb').dataset['ved'].split('_')[0]

// Assign control click commands
let gControls = document.querySelectorAll('._KKw')
for (let control of gControls) control.addEventListener('click', resetFire)

let imgControls = document.querySelectorAll('img.irc_rii')
for (let control of imgControls) control.addEventListener('click', resetFire)

let previewImg = null
let imgIndex = 0

for (let container of immersiveContainers) {
let container = immersiveContainers[imgIndex]
if (container.dataset['ved'] !== undefined && container.dataset['ved'].startsWith(currentVed)) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
console.log('[ERROR in "rewampPreviews" of google-panic-images] Error reading out correct preview image, skipping view link');
return
}

let imgURLsrc = decodeURIComponent(previewImg.src)
let imgURL = imgURLsrc.match(/(http|https).*\.(jpg|jpeg|gif|png|webm|JPG|JPEG|GIF|PNG|WEBM)/g)

if (imgURL === null) imgURL = imgURLsrc
else imgURL = imgURL[0]

let targetContainer = document.querySelector('#irc_shc');
let hasControls = false;
for (let child of targetContainer.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.href = imgURL
hasControls = true
break
}
}

if (!hasControls) targetContainer.innerHTML += '<a target="_blank" role="button" class="' + GOOGLE_PANIC_CLASS + '" style="cursor:pointer;visibility:visible; position:relative; top:89%;left:29%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:6px 3%;border-radius:12px;z-index:999;font-size:14px;text-decoration:none;" href="' + imgURL + '">View</a>'
}
}

// ----------------------------------------------------------------------------------------
// Reschedule a parsing
function resetFire () {
fireAt = Date.now() + (SECONDS_TO_FIRE_CUT * 1000);
contentHeight = 0;
}

// ----------------------------------------------------------------------------------------
// Function which does schedule the processing
function waitForLoaded () {
if (Date.now() > fireAt) {
let tmpHeight = document.querySelector('#cnt').clientHeight
if (contentHeight !== tmpHeight) {
contentHeight = tmpHeight
rewampImgs()
rewampPreviews()
}

fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
}

window.requestAnimationFrame(waitForLoaded)
}

// ----------------------------------------------------------------------------------------
// Display the controls, when the mouse is hovered over the image
function overlayControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'visible'
break
}
}
}

// Hide the controls, if the mouse is moved out of the image
function hideControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'hidden'
break
}
}
}

// ----------------------------------------------------------------------------------------
// Initial run after X seconds after this script was loaded
fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
window.requestAnimationFrame(waitForLoaded)


[/src]
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #3
Re: [Grease/Tamper] Google Bilder Direktlinks

So, hier nun eine weitere Version:

- Angepasst, wenn die aktuelle Image-Ved nicht gefunden wird, wird eine alternative Methode genutzt um das aktuelle Bild zu ermitteln, welches in der Vorschau aktiv ist - dies sollte auch Probleme bei Reloads beheben
- Styling, die "VIEW" Links in der normalen Ansicht erscheinen nun immer Links oben, da einfacher zu handhaben, nicht mittem im Bild und auch nicht die URL überlappend und haben einen hellen Rand (da auf dunklen Bildern schlecht sichtbar)
- Styling, der "VIEW" Link für die große Bildansicht, ist nun etwas weiter unterhalb der großen Vorschaubildes platziert.
- Angepasst, Skript Aktivierung etwas verringert

Preview:



Code:

[src=javascript]// ==UserScript==
// @name Google-Panic-Image
// @version 1
// @author theSplit
// @include https://www.google.*
// @grant none
// ==/UserScript==

// ----------------------------------------------------------------------------------------
// Timings and classname for panic button
// ----------------------------------------------------------------------------------------

// Seconds, when the script should scan the search page for new images
let SECONDS_TO_FIRE = 3

// Time after script reparsing on click on forward and next button on related images search as well as click on related images
let SECONDS_TO_FIRE_CUT = SECONDS_TO_FIRE * 0.35

// Our panic class (buttons)
let GOOGLE_PANIC_CLASS = 'Google-panic-image-btn'

// ----------------------------------------------------------------------------------------
// Global variables
// ----------------------------------------------------------------------------------------
let fireAt = 0
let contentHeight = 0
let currentVed = 'null'
// ----------------------------------------------------------------------------------------
// Gathers all images and adds a "view" link to the direct picture url

function rewampImgs () {

let imgLinks = document.querySelectorAll('a.rg_l')

for (let img of imgLinks) {
if (img.childElementCount >= 2 && img.children[1].nodeName === 'SPAN') continue

let imgURL = img.href.match(/(http|https)%3A.*\.(jpg|jpeg|gif|png|webm|JPG|JPEG|GIF|PNG|WEBM)&/g)

if (imgURL === null) {
imgURL = img.href.match(/(http|https)%3A.*(\&imgrefurl=http)/g)

if (imgURL !== null) imgURL[0] = imgURL[0].substr(0, imgURL[0].length - 15)
} else {
imgURL[0] = imgURL[0].substr(0, imgURL[0].length - 1)
}

if (imgURL === null) {
if (img.href.indexOf('/search?q=') === -1) {
console.log('[ERROR in "rewampImgs" of google-panic-images"] The following image link could not be extracted:')
console.log(img)
console.log(img.href)
}

continue
}

let hasControls = false
for (let child of img.parentNode.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
hasControls = true
break
}
}

if (hasControls) continue

imgURL = decodeURIComponent(imgURL[0])
img.parentNode.addEventListener('mouseenter', overlayControls)
img.parentNode.addEventListener('mouseleave', hideControls)
img.parentNode.innerHTML += '<a target="_blank" class="' + GOOGLE_PANIC_CLASS + '" style="visibility:hidden;position:absolute;top:6%;left:0%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:7px 8% 4px 5%;border-radius:0px 12px 12px 0px;z-index:1;font-size:12px;text-decoration:none;border:1px solid #aaa;border-left: none;" href="' + imgURL + '">VIEW</a>'
}
}

// ----------------------------------------------------------------------------------------
// Create / adopt the preview image link

function rewampPreviews () {
let vedSrc = document.querySelector('#irc_cb')

if (vedSrc === null) {
return
} else if (vedSrc.dataset === undefined) {
return
} else if (vedSrc.dataset['ved'] === undefined) {
return
} else if (vedSrc.dataset['ved'].startsWith(currentVed)) {
return
}

let previewImgs = document.querySelectorAll('img.irc_mi')
let immersiveContainers = document.querySelectorAll('div.immersive-container')

if (previewImgs !== null && immersiveContainers !== null) {
currentVed = document.querySelector('#irc_cb').dataset['ved'].split('_')[0]

// Assign control click commands
let gControls = document.querySelectorAll('._KKw')
for (let control of gControls) control.addEventListener('click', resetFire)

let imgControls = document.querySelectorAll('img.irc_rii')
for (let control of imgControls) control.addEventListener('click', resetFire)

let previewImg = null
let imgIndex = 0

for (let container of immersiveContainers) {
let container = immersiveContainers[imgIndex]
if (container.dataset['ved'] !== undefined && container.dataset['ved'].startsWith(currentVed)) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
imgIndex = 0
for (let container of immersiveContainers) {
let container = immersiveContainers[imgIndex]
if (container.dataset['hveid'] !== undefined) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
console.log('[ERROR in "rewampPreviews" of google-panic-images] Error reading out correct large preview image link with hveid, skipping view link');
return
}
}

let imgURLsrc = decodeURIComponent(previewImg.src)
let imgURL = imgURLsrc.match(/(http|https).*\.(jpg|jpeg|gif|png|webm|JPG|JPEG|GIF|PNG|WEBM)/g)

if (imgURL === null) imgURL = imgURLsrc
else imgURL = imgURL[0]

let targetContainer = document.querySelector('#irc_shc');
let hasControls = false;
for (let child of targetContainer.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.href = imgURL
hasControls = true
break
}
}

if (!hasControls) targetContainer.innerHTML += '<a target="_blank" role="button" class="' + GOOGLE_PANIC_CLASS + '" style="cursor:pointer;visibility:visible;position:absolute;top:90%;left:30%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:7px 10px 4px 10px;border:1px solid #aaa;border-radius:12px;z-index:999;font-size:14px;text-decoration:none;" href="' + imgURL + '">VIEW</a>'
}
}

// ----------------------------------------------------------------------------------------
// Reschedule a parsing
function resetFire () {
fireAt = Date.now() + (SECONDS_TO_FIRE_CUT * 1000);
contentHeight = 0;
}

// ----------------------------------------------------------------------------------------
// Function which does schedule the processing
function waitForLoaded () {

if (Date.now() > fireAt) {
let tmpHeight = document.querySelector('#cnt').clientHeight
if (contentHeight !== tmpHeight) {
contentHeight = tmpHeight
try {
rewampImgs()
} catch (e) {
console.log('[ERROR] in script, function rewampImgs ():')
console.log(e);
}
}

try {
rewampPreviews()
} catch (e) {
console.log('[ERROR] in script, function rewampPreviews ():')
console.log(e);
}

fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
}

window.requestAnimationFrame(waitForLoaded)
}

// ----------------------------------------------------------------------------------------
// Display the controls, when the mouse is hovered over the image
function overlayControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'visible'
break
}
}
}

// Hide the controls, if the mouse is moved out of the image
function hideControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'hidden'
break
}
}
}

// ----------------------------------------------------------------------------------------
// Initial run after X seconds after this script was loaded
fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
window.requestAnimationFrame(waitForLoaded)

[/src]
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #4
Re: [Grease/Tamper] Google Bilder Direktlinks

Kurzfassung:
+ tiff und svg zu filtern hinzugefügt
+ Regex etwas optimiert (non-global (eh nur einen Treffer....), case-insensitive wegen der Schreibweisen von png, PNG, pnG usw....)
+ einige unnötige "let" entfernt.

Im Falle von Fehlern oder Wünschen melden.

Nachtrag: Ich hab noch keine gute Methode gefunden zu erkennen, wenn sich etwas nachgeladen hat, zum Beispiel weil Google neue Bilder beim scrollen nachlädt, über Tips wäre ich sehr dankbar.

[src=javascript]// ==UserScript==
// @name Google-Panic-Image
// @version 1.1
// @author theSplit <touch@dwrox.net>
// @include https://www.google.*
// @grant none
// ==/UserScript==

// ----------------------------------------------------------------------------------------
// Timings and classname for panic button
// ----------------------------------------------------------------------------------------

// Seconds, when the script should scan the search page for new images
let SECONDS_TO_FIRE = 3

// Time after script reparsing on click on forward and next button on related images search as well as click on related images
let SECONDS_TO_FIRE_CUT = SECONDS_TO_FIRE * 0.35

// Our panic class (buttons)
let GOOGLE_PANIC_CLASS = 'Google-panic-image-btn'

// ----------------------------------------------------------------------------------------
// Global variables
// ----------------------------------------------------------------------------------------
let fireAt = 0
let contentHeight = 0
let currentVed = 'null'
// ----------------------------------------------------------------------------------------
// Gathers all images and adds a "view" link to the direct picture url

function rewampImgs () {

let imgLinks = document.querySelectorAll('a.rg_l')

for (let img of imgLinks) {
if (img.childElementCount >= 2 && img.children[1].nodeName === 'SPAN') continue

let imgURL = img.href.match(/(http|https)%3A.*\.(jpg|jpeg|gif|png|webm|svg|tiff)&/i)

if (imgURL === null) {
imgURL = img.href.match(/(http|https)%3A.*(\&imgrefurl=http)/i)

if (imgURL !== null) imgURL[0] = imgURL[0].substr(0, imgURL[0].length - 15)
} else {
imgURL[0] = imgURL[0].substr(0, imgURL[0].length - 1)
}

if (imgURL === null) {
if (img.href.indexOf('/search?q=') === -1) {
console.log('[ERROR in "rewampImgs" of google-panic-images"] The following image link could not be extracted:')
console.log(img)
console.log(img.href)
}

continue
}

let hasControls = false
for (let child of img.parentNode.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
hasControls = true
break
}
}

if (hasControls) continue

imgURL = decodeURIComponent(imgURL[0])
img.parentNode.addEventListener('mouseenter', overlayControls)
img.parentNode.addEventListener('mouseleave', hideControls)
img.parentNode.innerHTML += '<a target="_blank" class="' + GOOGLE_PANIC_CLASS + '" style="visibility:hidden;position:absolute;top:6%;left:0%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:7px 8% 4px 5%;border-radius:0px 12px 12px 0px;z-index:1;font-size:12px;text-decoration:none;border:1px solid #aaa;border-left: none;" href="' + imgURL + '">VIEW</a>'
}
}

// ----------------------------------------------------------------------------------------
// Create / adopt the preview image link

function rewampPreviews () {
let vedSrc = document.querySelector('#irc_cb')

if (vedSrc === null) {
return
} else if (vedSrc.dataset === undefined) {
return
} else if (vedSrc.dataset['ved'] === undefined) {
return
} else if (vedSrc.dataset['ved'].startsWith(currentVed)) {
return
}

let previewImgs = document.querySelectorAll('img.irc_mi')
let immersiveContainers = document.querySelectorAll('div.immersive-container')

if (previewImgs !== null && immersiveContainers !== null) {
currentVed = document.querySelector('#irc_cb').dataset['ved'].split('_', 1)[0]

// Assign control click commands
let gControls = document.querySelectorAll('._KKw')
for (let control of gControls) control.addEventListener('click', resetFire)

let imgControls = document.querySelectorAll('img.irc_rii')
for (let control of imgControls) control.addEventListener('click', resetFire)

let previewImg = null
let imgIndex = 0

for (let container of immersiveContainers) {
if (container.dataset['ved'] !== undefined && container.dataset['ved'].startsWith(currentVed)) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
imgIndex = 0
for (let container of immersiveContainers) {
if (container.dataset['hveid'] !== undefined) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
console.log('[ERROR in "rewampPreviews" of google-panic-images] Error reading out correct large preview image link with hveid, skipping view link');
return
}
}

let imgURLsrc = decodeURIComponent(previewImg.src)
let imgURL = imgURLsrc.match(/(http|https).*\.(jpg|jpeg|gif|png|webm|svg|tiff)/i)

if (imgURL === null) imgURL = imgURLsrc
else imgURL = imgURL[0]

let targetContainer = document.querySelector('#irc_shc');
let hasControls = false;
for (let child of targetContainer.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.href = imgURL
hasControls = true
break
}
}

if (!hasControls) targetContainer.innerHTML += '<a target="_blank" role="button" class="' + GOOGLE_PANIC_CLASS + '" style="cursor:pointer;visibility:visible;position:absolute;top:90%;left:30%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:7px 10px 4px 10px;border:1px solid #aaa;border-radius:12px;z-index:999;font-size:14px;text-decoration:none;" href="' + imgURL + '">VIEW</a>'
}
}

// ----------------------------------------------------------------------------------------
// Reschedule a parsing
function resetFire () {
fireAt = Date.now() + (SECONDS_TO_FIRE_CUT * 1000);
contentHeight = 0;
}

// ----------------------------------------------------------------------------------------
// Function which does schedule the processing
function waitForLoaded () {

if (Date.now() > fireAt) {
let tmpHeight = document.querySelector('#cnt').clientHeight
if (contentHeight !== tmpHeight) {
contentHeight = tmpHeight
try {
rewampImgs()
} catch (e) {
console.log('[ERROR] in script, function rewampImgs ():')
console.log(e);
}
}

try {
rewampPreviews()
} catch (e) {
console.log('[ERROR] in script, function rewampPreviews ():')
console.log(e);
}

fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
}

window.requestAnimationFrame(waitForLoaded)
}


// ----------------------------------------------------------------------------------------
// Display the controls, when the mouse is hovered over the image
function overlayControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'visible'
break
}
}
}

// Hide the controls, if the mouse is moved out of the image
function hideControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'hidden'
break
}
}
}

// ----------------------------------------------------------------------------------------
document.onreadystatechange = waitForLoaded()
[/src]
 
Zuletzt bearbeitet:

Mäxchen

lustiger Kumpane

Registriert
14 Juli 2013
Beiträge
294
Ort
am liebsten im Zelt
Re: [Grease/Tamper] Google Bilder Direktlinks

Das ist ein tolles script. Dass ich nicht schon früher auf dieses Thema gestoßen bin...danke dir.
Habe zum testen mal nach "girl" gegoogelt. Ein Beispiellink ist "https://images.pexels.com/photos/255349/pexels-photo-255349.jpeg?cs=srgb&dl=person-woman-field-255349.jpg&fm=jpg". Bei dem Link versucht der Browser, das Foto sofort runterzuladen, und nicht in einem neuen Tab zu öffnen. Vielleicht könnte man alles ab dem "?" entfernen? Ansonsten scheint alles perfekt zu funktionieren.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #6
Re: [Grease/Tamper] Google Bilder Direktlinks

@Mäxchen: Danke für das Lob, das kommt gut!

Ich bin deinem Link auf die Spur gegangen und habe den Fehler behoben.
Dank deines Einwands versucht das Skript nun noch beharrlicher die Bilddatei zu finden. [In imgurl + imgrefurl und fällt ansonsten zurück auf die imgurl]
Alles in allem eine gute Verbesserung.

Hier ist die modifizierte Version:

[src=javascript]// ==UserScript==
// @name Google-Panic-Image
// @version 1.1.1
// @author theSplit <touch@dwrox.net>
// @include https://www.google.*
// @grant none
// ==/UserScript==

// ----------------------------------------------------------------------------------------
// Timings and classname for panic button
// ----------------------------------------------------------------------------------------

// Seconds, when the script should scan the search page for new images
let SECONDS_TO_FIRE = 3

// Time after script reparsing on click on forward and next button on related images search as well as click on related images
let SECONDS_TO_FIRE_CUT = SECONDS_TO_FIRE * 0.35

// Our panic class (buttons)
let GOOGLE_PANIC_CLASS = 'Google-panic-image-btn'

// ----------------------------------------------------------------------------------------
// Global variables
// ----------------------------------------------------------------------------------------
let fireAt = 0
let contentHeight = 0
let currentVed = 'null'
// ----------------------------------------------------------------------------------------

// RegExParsers
let imgRegExBase = /imgurl=(http{0,1}%3A.*?(jpg|jpeg|gif|png|webm|svg|tiff))/i
let imgRegExRef = /imgurlref=(http{0,1}%3A.*?(jpg|jpeg|gif|png|webm|svg|tiff))/i
let imgRegExBaseNoImage = /imgurl=(http{0,1}%3A.[^&?]*)/i

// Gathers all images and adds a "view" link to the direct picture url
function rewampImgs () {

let imgLinks = document.querySelectorAll('a.rg_l')

for (let img of imgLinks) {
if (img.childElementCount >= 2 && img.children[1].nodeName === 'SPAN') continue

let imgURL = imgRegExBase.exec(img.href)

if (imgURL === null) {
imgURL = imgRegExRef.exec(img.href)

if (imgURL === null) {
imgURL = imgRegExBaseNoImage.exec(img.href)

if (imgURL === null) {
if (img.href.indexOf('imgurl=') !== -1) {
img.style.border = '6px solid #000'
console.log('[ERROR in "rewampImgs" of google-panic-images"] The following image link could not be extracted:')
console.log(img)
console.log(img.href)
}

continue
}
}
}

imgURL = imgURL[1]

let hasControls = false
for (let child of img.parentNode.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
hasControls = true
break
}
}

if (hasControls) continue

imgURL = decodeURIComponent(imgURL)
img.parentNode.addEventListener('mouseenter', overlayControls)
img.parentNode.addEventListener('mouseleave', hideControls)
img.parentNode.innerHTML += '<a target="_blank" class="' + GOOGLE_PANIC_CLASS + '" style="visibility:hidden;position:absolute;top:6%;left:0%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:7px 8% 4px 5%;border-radius:0px 12px 12px 0px;z-index:1;font-size:12px;text-decoration:none;border:1px solid #aaa;border-left: none;" href="' + imgURL + '">VIEW</a>'
}
}

// ----------------------------------------------------------------------------------------
// Create / adopt the preview image link

function rewampPreviews () {
let vedSrc = document.querySelector('#irc_cb')

if (vedSrc === null) {
return
} else if (vedSrc.dataset === undefined) {
return
} else if (vedSrc.dataset['ved'] === undefined) {
return
} else if (vedSrc.dataset['ved'].startsWith(currentVed)) {
return
}

let previewImgs = document.querySelectorAll('img.irc_mi')
let immersiveContainers = document.querySelectorAll('div.immersive-container')

if (previewImgs !== null && immersiveContainers !== null) {
currentVed = document.querySelector('#irc_cb').dataset['ved'].split('_', 1)[0]

// Assign control click commands
let gControls = document.querySelectorAll('._KKw')
for (let control of gControls) control.addEventListener('click', resetFire)

let imgControls = document.querySelectorAll('img.irc_rii')
for (let control of imgControls) control.addEventListener('click', resetFire)

let previewImg = null
let imgIndex = 0

for (let container of immersiveContainers) {
if (container.dataset['ved'] !== undefined && container.dataset['ved'].startsWith(currentVed)) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
imgIndex = 0
for (let container of immersiveContainers) {
if (container.dataset['hveid'] !== undefined) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
console.log('[ERROR in "rewampPreviews" of google-panic-images] Error reading out correct large preview image link with hveid, skipping view link');
return
}
}

let imgURLsrc = decodeURIComponent(previewImg.src)
let imgURL = imgRegExBase.exec(imgURLsrc)

if (imgURL === null) {
imgURL = imgRegExRef.exec(imgURLsrc)

if (imgURL === null) imgURL = imgRegExBaseNoImage.exec(imgURLsrc)
}

if (imgURL === null) imgURL = imgURLsrc
else imgURL = imgURL[1]

let targetContainer = document.querySelector('#irc_shc');
let hasControls = false;
for (let child of targetContainer.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.href = imgURL
hasControls = true
break
}
}

if (!hasControls) targetContainer.innerHTML += '<a target="_blank" role="button" class="' + GOOGLE_PANIC_CLASS + '" style="cursor:pointer;visibility:visible;position:absolute;top:90%;left:30%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:7px 10px 4px 10px;border:1px solid #aaa;border-radius:12px;z-index:999;font-size:14px;text-decoration:none;" href="' + imgURL + '">VIEW</a>'
}
}

// ----------------------------------------------------------------------------------------
// Reschedule a parsing
function resetFire () {
fireAt = Date.now() + (SECONDS_TO_FIRE_CUT * 1000);
contentHeight = 0;
}

// ----------------------------------------------------------------------------------------
// Function which does schedule the processing
function waitForLoaded () {

if (Date.now() > fireAt) {
let tmpHeight = document.querySelector('#cnt').clientHeight
if (contentHeight !== tmpHeight) {
contentHeight = tmpHeight
try {
rewampImgs()
} catch (e) {
console.log('[ERROR] in script, function rewampImgs ():')
console.log(e);
}
}

try {
rewampPreviews()
} catch (e) {
console.log('[ERROR] in script, function rewampPreviews ():')
console.log(e);
}

fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
}

window.requestAnimationFrame(waitForLoaded)
}


// ----------------------------------------------------------------------------------------
// Display the controls, when the mouse is hovered over the image
function overlayControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'visible'
break
}
}
}

// Hide the controls, if the mouse is moved out of the image
function hideControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'hidden'
break
}
}
}

// ----------------------------------------------------------------------------------------
document.onreadystatechange = waitForLoaded()[/src]
 

Mäxchen

lustiger Kumpane

Registriert
14 Juli 2013
Beiträge
294
Ort
am liebsten im Zelt
Re: [Grease/Tamper] Google Bilder Direktlinks

Es funktioniert auf jeden Fall praktischer als Google es früher selbst gemacht hat. Hier sind noch ein paar Testlinks, die nicht funktionieren. Man muss aber schon richtig suchen, um welche zu finden, die nicht klappen, und richtig schmlimm ist es auch nicht, wenn vereinzelte nicht gehen.
"https://www.bgland24.de/bilder/2017/06/26/8431951/2018164693-24-girl-jacqueline-1bjpG"
"https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=999104790102064"
"https://r.hswstatic.com/w_907/gif"
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #8
Re: [Grease/Tamper] Google Bilder Direktlinks

Schön zu hören das es praktischer ist. So muß das sein!

"https://www.bgland24.de/bilder/2017/06/26/8431951/2018164693-24-girl-jacqueline-1bjpG"
"https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=999104790102064"

Ich glaube hier wird es schwer:

Zu diesen beiden Links, hast du da den Original Google Link irgendwie greifbar? (mit modifizierent Werten, "ved", "ei", "psy_l" oder was auch immer da nicht in:
google.de/search?q=SUCHANFRAGE&imgurl=http%3A.......................&imgrefurl=http12345

Interessant sind die imgurl und die imgrefurl - da beziehe ich aktuell auch die Informationen her.

Allerdings stehen in deinem ersten Link kein Dateiformat und die URL scheint broken zu sein. Ich erreiche darüber jetzt keine Inhalte wenn ich sie aufrufe.

Zum zweiten Link da müsste ich genauer schauen, ob ich irgendwie eine Info bekommen kann, außerhalb dessen was "in der Übersicht" angezeigt wird.
Aber im Grunde ist das ein zensierter Facebook Link, so wie ich es sehe, daher die Ausweisung für in Crawler/Media" mit ID=12345.

Ein Schwierigkeit dabei ist nur, es gibt Quellurls ohne Datentyp (zu beiden Links) - also greife ich darauf zurück was ich nicht identifizieren kann, aber "gültig sein könnte" -
Zum Beispiel der hier:
https://www.google.de/imgres?imgurl...QxDUOEcVM&tbnid=xdtT_3Rm7qwN7M:&w=1024&h=1024

ist eigentlich der hier, wenn du klickst:
https://s3.amazonaws.com/tinycards/image/36125d06520a2f6acdae39d1221e5ca8

...beide URLs haben keine Dateiendung, sind aber gültig und verweisen auf Bildcontent.
 
Zuletzt bearbeitet:

Mäxchen

lustiger Kumpane

Registriert
14 Juli 2013
Beiträge
294
Ort
am liebsten im Zelt
Re: [Grease/Tamper] Google Bilder Direktlinks

Das hier ist der erste Link. Hoffe, das hilft. Der Link, den dein Skript ausgibt, endet auf "jpG" Diese Buchstabenkombination scheint aber nur zufällig innerhalb des Dateinamen zu sein.
"https://www.google.de/imgres?imgurl=https%3A%2F%2Fwww.bgland24.de%2Fbilder%2F2017%2F06%2F26%2F8431951%2F2018164693-24-girl-jacqueline-1bjpGT9bf.jpg&imgrefurl=https%3A%2F%2Fwww.bgland24.de%2Fleben%2F24-girl%2Fstefan-schmid%2F&docid=elyGz4L62e6mhM&tbnid=N2ifibtkrFm-3M%3A&vet=10ahUKEwi5-umuxqncAhUrsqQKHRSUBfAQMwh8KD4wPg..i&w=256&h=192&bih=601&biw=1280&q=girl&ved=0ahUKEwi5-umuxqncAhUrsqQKHRSUBfAQMwh8KD4wPg&iact=mrc&uact=8"

Das hier zum zweiten:
"https://www.google.de/imgres?imgurl=https%3A%2F%2Flookaside.fbsbx.com%2Flookaside%2Fcrawler%2Fmedia%2F%3Fmedia_id%3D999104790102064&imgrefurl=https%3A%2F%2Fde-de.facebook.com%2FOfficialCommonGirl%2F&docid=aH4Uy9Be2mh3gM&tbnid=zQfoNKxj3XdVJM%3A&vet=10ahUKEwi5-umuxqncAhUrsqQKHRSUBfAQMwg9KAowCg..i&w=585&h=585&bih=601&biw=1280&q=girl&ved=0ahUKEwi5-umuxqncAhUrsqQKHRSUBfAQMwg9KAowCg&iact=mrc&uact=8"
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #10
Re: [Grease/Tamper] Google Bilder Direktlinks

Der zweite Link verweist entweder auf das Userprofil, oder den Medialink mit Facebook Seite:
https://de-de.facebook.com/OfficialCommonGirl/
https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=999104790102064

Da ist also nicht direkt beizukommen aus der Übersicht.

Zum ersten kann ich eine positive Rückmeldung geben, das geht mit folgendem: [liegt am am Regex und Case-insensitivity, weil "jpg" auf "jpG" trifft und nen Treffer liefert]

Hier der Code, geändert haben sich die "RegExParsers" bei Zeile 29 bis 33

[src=javascript]// RegExParsers
let imgRegExBase = /imgurl=(http{0,1}%3A.*?\.(jpg|jpeg|gif|png|webm|svg|tiff))/i
let imgRegExRef = /imgurlref=(http{0,1}%3A.*?\.(jpg|jpeg|gif|png|webm|svg|tiff))/i
let imgRegExBaseNoImage = /imgurl=(http{0,1}%3A.[^&?]*)/i[/src]

Hier gesamter Code:

[src=javascript]// ==UserScript==
// @name Google-Panic-Image
// @version 1.1.2
// @author theSplit <touch@dwrox.net>
// @include https://www.google.*
// @grant none
// ==/UserScript==

// ----------------------------------------------------------------------------------------
// Timings and classname for panic button
// ----------------------------------------------------------------------------------------

// Seconds, when the script should scan the search page for new images
let SECONDS_TO_FIRE = 3

// Time after script reparsing on click on forward and next button on related images search as well as click on related images
let SECONDS_TO_FIRE_CUT = SECONDS_TO_FIRE * 0.35

// Our panic class (buttons)
let GOOGLE_PANIC_CLASS = 'Google-panic-image-btn'

// ----------------------------------------------------------------------------------------
// Global variables
// ----------------------------------------------------------------------------------------
let fireAt = 0
let contentHeight = 0
let currentVed = 'null'
// ----------------------------------------------------------------------------------------

// RegExParsers
let imgRegExBase = /imgurl=(http{0,1}%3A.*?\.(jpg|jpeg|gif|png|webm|svg|tiff))/i
let imgRegExRef = /imgurlref=(http{0,1}%3A.*?\.(jpg|jpeg|gif|png|webm|svg|tiff))/i
let imgRegExBaseNoImage = /imgurl=(http{0,1}%3A.[^&?]*)/i

// Gathers all images and adds a "view" link to the direct picture url
function rewampImgs () {

let imgLinks = document.querySelectorAll('a.rg_l')

for (let img of imgLinks) {
if (img.childElementCount >= 2 && img.children[1].nodeName === 'SPAN') continue

let imgURL = imgRegExBase.exec(img.href)

if (imgURL === null) {
imgURL = imgRegExRef.exec(img.href)

if (imgURL === null) {
imgURL = imgRegExBaseNoImage.exec(img.href)

if (imgURL === null) {
if (img.href.indexOf('imgurl=') !== -1) {
img.style.border = '6px solid #000'
console.log('[ERROR in "rewampImgs" of google-panic-images"] The following image link could not be extracted:')
console.log(img)
console.log(img.href)
}

continue
}
}
}

imgURL = imgURL[1]

let hasControls = false
for (let child of img.parentNode.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
hasControls = true
break
}
}

if (hasControls) continue

imgURL = decodeURIComponent(imgURL)
img.parentNode.addEventListener('mouseenter', overlayControls)
img.parentNode.addEventListener('mouseleave', hideControls)
img.parentNode.innerHTML += '<a target="_blank" class="' + GOOGLE_PANIC_CLASS + '" style="visibility:hidden;position:absolute;top:6%;left:0%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:7px 8% 4px 5%;border-radius:0px 12px 12px 0px;z-index:1;font-size:12px;text-decoration:none;border:1px solid #aaa;border-left: none;" href="' + imgURL + '">VIEW</a>'
}
}

// ----------------------------------------------------------------------------------------
// Create / adopt the preview image link

function rewampPreviews () {
let vedSrc = document.querySelector('#irc_cb')

if (vedSrc === null) {
return
} else if (vedSrc.dataset === undefined) {
return
} else if (vedSrc.dataset['ved'] === undefined) {
return
} else if (vedSrc.dataset['ved'].startsWith(currentVed)) {
return
}

let previewImgs = document.querySelectorAll('img.irc_mi')
let immersiveContainers = document.querySelectorAll('div.immersive-container')

if (previewImgs !== null && immersiveContainers !== null) {
currentVed = document.querySelector('#irc_cb').dataset['ved'].split('_', 1)[0]

// Assign control click commands
let gControls = document.querySelectorAll('._KKw')
for (let control of gControls) control.addEventListener('click', resetFire)

let imgControls = document.querySelectorAll('img.irc_rii')
for (let control of imgControls) control.addEventListener('click', resetFire)

let previewImg = null
let imgIndex = 0

for (let container of immersiveContainers) {
if (container.dataset['ved'] !== undefined && container.dataset['ved'].startsWith(currentVed)) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
imgIndex = 0
for (let container of immersiveContainers) {
if (container.dataset['hveid'] !== undefined) {
previewImg = previewImgs[imgIndex]
break
}

++imgIndex;
}

if (previewImg === null) {
console.log('[ERROR in "rewampPreviews" of google-panic-images] Error reading out correct large preview image link with hveid, skipping view link');
return
}
}

let imgURLsrc = decodeURIComponent(previewImg.src)
let imgURL = imgRegExBase.exec(imgURLsrc)

if (imgURL === null) {
imgURL = imgRegExRef.exec(imgURLsrc)

if (imgURL === null) imgURL = imgRegExBaseNoImage.exec(imgURLsrc)
}

if (imgURL === null) imgURL = imgURLsrc
else imgURL = imgURL[1]

let targetContainer = document.querySelector('#irc_shc');
let hasControls = false;
for (let child of targetContainer.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.href = imgURL
hasControls = true
break
}
}

if (!hasControls) targetContainer.innerHTML += '<a target="_blank" role="button" class="' + GOOGLE_PANIC_CLASS + '" style="cursor:pointer;visibility:visible;position:absolute;top:90%;left:30%;background:rgba(0,0,0,0.6);color:#fff;font-weight:bold;padding:7px 10px 4px 10px;border:1px solid #aaa;border-radius:12px;z-index:999;font-size:14px;text-decoration:none;" href="' + imgURL + '">VIEW</a>'
}
}

// ----------------------------------------------------------------------------------------
// Reschedule a parsing
function resetFire () {
fireAt = Date.now() + (SECONDS_TO_FIRE_CUT * 1000);
contentHeight = 0;
}

// ----------------------------------------------------------------------------------------
// Function which does schedule the processing
function waitForLoaded () {

if (Date.now() > fireAt) {
let tmpHeight = document.querySelector('#cnt').clientHeight
if (contentHeight !== tmpHeight) {
contentHeight = tmpHeight
try {
rewampImgs()
} catch (e) {
console.log('[ERROR] in script, function rewampImgs ():')
console.log(e);
}
}

try {
rewampPreviews()
} catch (e) {
console.log('[ERROR] in script, function rewampPreviews ():')
console.log(e);
}

fireAt = Date.now() + (SECONDS_TO_FIRE * 1000)
}

window.requestAnimationFrame(waitForLoaded)
}


// ----------------------------------------------------------------------------------------
// Display the controls, when the mouse is hovered over the image
function overlayControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'visible'
break
}
}
}

// Hide the controls, if the mouse is moved out of the image
function hideControls (event) {
let img = event.target
for (let child of img.childNodes) {
if (child.className === GOOGLE_PANIC_CLASS) {
child.style.visibility = 'hidden'
break
}
}
}

// ----------------------------------------------------------------------------------------
document.onreadystatechange = waitForLoaded()
[/src]
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #11
Re: [Grease/Tamper] Google Bilder Direktlinks

"https://r.hswstatic.com/w_907/gif"

Guten Morgen,

hatte deine Edit zu spät gesehen, jetzt klappt es korrekt mit der genannten URL - selbst wenn im Namen eine mögliche Dateiendung auftritt.

Habe die Version im vorherigen Post, nochmal geupdadet.

Danke für das Feedback! :)

Man sollte ergänzen '.' ist nicht gleich Punkt sondern nur irgendein mögliches Zeichen, hatte es nicht korrekt escaped so das es nicht '.bildFormat' erkannt hatte.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #14
Re: [Grease/Tamper] Google Bilder Direktlinks

Ein neuer Release!

Grund, die Google Bilder Suche hat sich verändert und das Addon wurde entsprechend aktualisiert und adaptiert.
Das bedeutet dass die große Vorschau, wie auch die Detailansichten, mit einem "View" Link, für die direkte Betrachtung, ausgestattet sind.

Außerdem ist es mögliche die Thumbnails in der Detailansicht mit "Strg + Links Klick" direkt zu öffnen.

Hier eine Vorschau:


Aktuell verfügbar für Firefox auf der Add-on Seite.

Edit:
Frage, besteht Bedarf an einer Chrome und Opera Version?
 
Zuletzt bearbeitet:

Kokser

Humanistischer Misanthrop

Registriert
14 Juli 2013
Beiträge
1.018
Re: [Grease/Tamper] Google Bilder Direktlinks

Hm. Also ich nutze in Chrome Imagus. Ist ja das gleiche nur Seitenübergreifend oder?
 

Lokalrunde

Schneehasen-Administrator
Teammitglied

Registriert
13 Juli 2013
Beiträge
74.486
Ort
im Tiefschnee
Re: [Grease/Tamper] Google Bilder Direktlinks

Edit:
Frage, besteht Bedarf an einer Chrome und Opera Version?
Ich würde es ja durchaus mal testen, da mich die Bildersuche in der aktuellen Variante schon teilweise nervt. Aber dazu brauche ich eine Chrome-Version ;)

Sollte ich aber der einzige sein, der daran Interesse haben sollte, lohnt es sich für Dich wohl nicht, denke ich mal ;)
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #17
Re: [Grease/Tamper] Google Bilder Direktlinks

Ich würde es ja durchaus mal testen, da mich die Bildersuche in der aktuellen Variante schon teilweise nervt. Aber dazu brauche ich eine Chrome-Version ;)

Ich musste es minimal anpassen, aber schaust du hier nach der ".crx" (Chrome und Opera!):
https://github.com/jrie/googlePanicImage/releases/tag/1.0.13

Die Firefox Version enthält bereits die letzten Änderungen, habe diese auch gleich angepasst. Und die Regex mussten noch etwas korrigiert werden, diese hatte ich fehlerhaft nachkorrigiert.

----

Hm. Also ich nutze in Chrome Imagus. Ist ja das gleiche nur Seitenübergreifend oder?

Ich kann ja mal schauen ob es ähnlich ist, aber das Feedback ist ja relativ durchwachsen für das Addon.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #18
Re: [Grease/Tamper] Google Bilder Direktlinks

Also wenn ich richtig sehe, dient "imagus" in erster Linie dazu ein direkte Vorschau der Bilder Suche zu bekommen. Das funktioniert auch. Allerdings finde ich das automatische Laden der großen Grafik als sehr störend bei der Bildersuche in Google. So würde ich persönlich Google Bilder nicht nutzen wollen.

Mein Add-on dagegen, funktioniert zwar nur für Google Bilder, bietet aber einen direkten Link zur Grafik an, den man anklicken kann, aber nicht muß. Hier wird also nichts "automatisch" geladen, sondern nur "on demand", also bei explizitem Klick auf den überlagerten "View"-Button.

Edit: Wobei gut, in den Optionen lässt sich bei gedrückter Ctrl/Strg Taste das laden verhinden bzw. aktivieren, je nach Einstellung. Ist schon Komfortable.
 

Kokser

Humanistischer Misanthrop

Registriert
14 Juli 2013
Beiträge
1.018
Re: [Grease/Tamper] Google Bilder Direktlinks

Ist ja trotzdem kein Ding da noch eine Alternative anzubieten. Wollte eben nur drauf hinweisen, dass es da schon was ähnliches gibt. :)
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.557
  • Thread Starter Thread Starter
  • #20
Google Bilder Direktlinks - V2.0.0

Eine neue Hauptversion ist erschienen. Diese ist mit der neuen Google Bildersuche kompatibel, besitzt jedoch aufgrund von Google Änderungen, speziell verschlüsselte URLs von Bildern, minimale Anpassungen:

Funktioniert nach den letzten Google Änderungen.

Standardmäßig werden die ersten 100 Bilder Links automatisch mit einem "View" Button ausgestattet, dies geschieht weil Google die ersten 100 Bilder auflistet, alles darüber ist kodiert.

Ab dem 100 Bild kann der "View" Link bezogen werden, wenn man einmal auf das Bild klickt, dass sich die Detailansicht öffnet, danach steht auch der View Link im Vorschaubild zu Verfügung. Dies ist deshalb notwendig, weil Google die Links verschleiert.

Download:
Für Firefox: https://addons.mozilla.org/de-DE/firefox/addon/googlepanicimages/
Opera/Chrome Link folgt nach Freischaltung.
 
Oben