peterleb

Direktlink Bildersuche als Kontextmenü im Windows Explorer

Hallo,

in einer älteren Anfrage (Direktlink Google Bildersuche als Kontextmenü im Windows Explorer)
Bildersuche

wurde mir sehr schön geholfen und eine funktionierende Lösung mit Powershell aufgezeigt (Dank nochmal an colinardo).
Ich habe im Windows-Explorer bei Bildern ein Kontextmenüeintrag "Google Imagesuche".

Nun möchte ich das ganze auch für die Yandex-Bildersuche einrichten.
Für Google hieß der Befehl:

$request = [Net.HttpWebRequest] ([Net.HttpWebRequest]::Create('https://images.google.com/searchbyimage/upload'))  

doch für Yandex fand ich nur: yandex.com/images/search?rpt=imageview&img_url={fullURL}.
Wie müßte die Adresse für "searchbyimage" richtig heißen?

Für hilfreiche Tipps oder Links wäre ich Euch sehr dankbar.

Gruß
Peter
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 572088

Url: https://administrator.de/forum/direktlink-bildersuche-als-kontextmenue-im-windows-explorer-572088.html

Ausgedruckt am: 18.07.2025 um 15:07 Uhr

144260
144260 15.05.2020 um 19:45:44 Uhr
F12 im Browser drücken, auf den Tab Netzwerk wechseln, Bild über den Button hochladen und in den Developer Tools die URL für den Post Request ablesen, so einfach ist es ...
PeterleB
PeterleB 16.05.2020 um 07:54:43 Uhr
Ordentliches Mißverständnis!
Für einen Kommentar sollte man sich schon mal die Mühe machen, den alten Link nachzuverfolgen,
dann wüßtest Du, worum es geht.

2020-05-16


Gruß
Peter
PeterleB
PeterleB 16.05.2020 um 08:02:45 Uhr
Ich kann auch gerne nochmal das alte Script hochladen.
Hier war noch zusätzlich eine Proxy-Abfrage eingebaut.

param(
    [string]$file
)
#Hide Console
## $window = Add-Type -memberDefinition @"[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);"@ -name "Win32ShowWindowAsync" -namespace Win32Functions passThru  
## $window::ShowWindow((Get-Process –id $pid).MainWindowHandle, 0)

[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  

function Get-GoogleImageSearchResult([string][ValidateScript({Test-Path $_})]$path){
    $boundary = [datetime]::now.Ticks.ToString()
    $p1 = @"  
--$boundary
Content-Disposition: form-data; name="encoded_image"; filename="$([IO.Path]::GetFileName($path))"  
Content-Type: image/$([System.IO.Path]::GetExtension($path).substring(1))


"@  
    $p2 = @"  
--$boundary
Content-Disposition: form-data; name="image_content"  


--$boundary--

"@  
    $bytes = [System.Text.Encoding]::ASCII.GetBytes($p1) + ([IO.File]::ReadAllBytes($path)) + [System.Text.Encoding]::ASCII.GetBytes($p2)
    $request = [Net.HttpWebRequest] ([Net.HttpWebRequest]::Create('https://images.google.com/searchbyimage/upload'))  
    $request.Method = "POST"  
    
    $proxyenabled = Get-ItemProperty -Path "Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"  
    #if proxy
    if($proxyenabled.ProxyEnable -eq 1) { 
        # Standardanmeldedaten ...
        ## $proxy = [System.Net.WebProxy]::GetDefaultProxy()
        ## $proxy.UseDefaultCredentials = $true
        # ...oder nach Anmeldedaten fragen
        ## $proxy.Credentials = (Get-Credential).GetNetworkCredential()
        # ...oder Anmeldedaten übergeben
        ## $creds = New-object System.Net.NetworkCredential($Username,$Password)
        $proxy = New-Object System.Net.WebProxy("http://xxx.xxx.xxx.xxx:80")  
        $creds = New-object System.Net.NetworkCredential("xxxxx","xxxxxxxx")  
        $proxy.Credentials = $creds
        $request.Proxy = $proxy
        }
    #endif proxy
    
    $request.ContentType = "multipart/form-data; boundary=$boundary"  
    $request.ContentLength = $bytes.Length
    $request.AllowAutoredirect = $false
    $stream = $request.GetRequestStream()
    $stream.Write($bytes, 0, $bytes.Length)
    $stream.Close()
    return [regex]::match((New-Object Io.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd(),'(?is)HREF="([^"]+)"').Groups[1].Value  
}

function ShowForm(){
    $form1 = New-Object System.Windows.Forms.Form
    $lblStatus = New-Object System.Windows.Forms.Label
    $form1.ClientSize = [System.Drawing.Size]::new(292,62)
    $form1.ControlBox = $False
    $form1.StartPosition = 1
    $form1.FormBorderStyle = 5
    $form1.Name = "form1"  
    $form1.Text = "Uploading ..."  
    $form1.add_Shown({
        $form1.Update()
        $url = Get-GoogleImageSearchResult $file
        if ($url){
            start $url
        }
        $form1.Close()
    })

    $lblStatus.Dock = 5
    $lblStatus.Font = New-Object System.Drawing.Font("Arial",13,1,3,0)  
    $lblStatus.Location = [System.Drawing.Point]::new(0,0)
    $lblStatus.Name = "lblStatus"  
    $lblStatus.Size = [System.Drawing.Size]::new(292,62)
    $lblStatus.Visible = $true
    $lblStatus.Text = "Datei-Upload, bitte warten."  
    $lblStatus.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
    $form1.Controls.Add($lblStatus)
    $form1.ShowDialog() | out-null
}
ShowForm
PeterleB
PeterleB 16.05.2020 um 08:15:07 Uhr
PS:
Sorry, habe Deine Antwort selbst nicht richtig gelesen.
Leider kann ich mit der Auflistung in den Dev-Tools nicht viel anfangen.
144260
144260 16.05.2020 aktualisiert um 08:48:23 Uhr
Zitat von @PeterleB:

PS:
Sorry, habe Deine Antwort selbst nicht richtig gelesen.
Aber immer erst mal motzen, Freitagspost ... Natürlich habe ich den Link gelesen und du hattest nach der spezifischen URL gefragt und ich habe dir oben aufgeschrieben was zu tun ist um diese zu erhalten!
Leider kann ich mit der Auflistung in den Dev-Tools nicht viel anfangen.
Wie ich geschrieben habe, findet beim Upload ein POST Request an eine spezifische URL statt, den Eintrag fischst du dir raus und liest die URL ab, inklusive der eventuell mitgeschickten Parameter (rechte Seite in den Developer Tools). Das bringt dir für die Zukunft mehr als wenn dir hier jemand die URL vorbetet da hast du nichts von gelernt.

p.s. Man kann auch alles in einen einzigen Kommentar schreiben.
colinardo
Lösung colinardo 16.05.2020 aktualisiert um 10:57:56 Uhr
Servus,
hier die reine Funktion ohne Proxy, den kannst du dir ja selbst im Skript noch ergänzen ...

Grüße Uwe

p.s. @144260 meinte wohl das hier face-wink, das ist aber nicht alles, Teile der URL muss man weglassen und den Multipart-Namen für den Upload anpassen und dann noch die zurückgegebene URL aus dem JSON auslesen und mit der Root-URL kombinieren.

screenshot
PeterleB
PeterleB 16.05.2020 aktualisiert um 11:59:19 Uhr
Du bist der Beste!

Vielen Dank und Gruß

Peter

PS:
Habe das Script wieder mit dieser ShowForm()-Funktion umgeschrieben
und ein schönes Icon für das Kontextmenü gemacht und
es funktioniert tadellos.

2020-05-16 (1)

2020-05-16 (2)
PeterleB
PeterleB 17.05.2020 aktualisiert um 13:39:33 Uhr
Eine Frage noch.
Vor einiger Zeit hatte ich mal mit C++ rumgespielt und DLL-Dateien für das Kontextmenü gebastelt.
Das Grundgerüst ist ja immer gleich und auch gut beschrieben.

Könnte jemand diese function Get-GoogleImageSearchResult() bzw. function Get-YandexImageSearchResult() nach C++ umsetzen?

Grüße
Peter
144260
144260 17.05.2020 aktualisiert um 14:37:11 Uhr
Vor einiger Zeit hatte ich mal mit C++ rumgespielt
Dann hast du ja jetzt eine schöne Sonntagsbeschäftigung 😉, wenn ich die Mädels da oben so sehe ...
PeterleB
PeterleB 17.05.2020 um 14:48:20 Uhr
Habe ein Dualmonitorsystem und bin immer auf der Suche nach schönen hochauflösenden Hintergründen, die sich über beide Monitore erstrecken und da sind auch mal paar schöne Mädels dabei.
colinardo
colinardo 18.05.2020 aktualisiert um 11:19:58 Uhr
Zitat von @PeterleB:
Könnte jemand diese function Get-GoogleImageSearchResult() bzw. function Get-YandexImageSearchResult() nach C++ umsetzen?
Bitteschön in C++ (CLR, Console-App)
GoogleSearch_YandexSearch_cPlusPlus_572088.zip
PeterleB
PeterleB 18.05.2020 um 14:20:34 Uhr
Das ist der Hammer. Danke.

Habe heute nur nicht gleich zeit dafür, da mein Enkel 2 Jahre alt wird.

Nochmals vielen Dank
Peter