peterleb
Goto Top

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: https://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

Content-Key: 572088

Url: https://administrator.de/contentid/572088

Printed on: April 25, 2024 at 16:04 o'clock

Mitglied: 144260
144260 May 15, 2020 at 17:45:44 (UTC)
Goto Top
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 ...
Member: PeterleB
PeterleB May 16, 2020 at 05:54:43 (UTC)
Goto Top
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
Member: PeterleB
PeterleB May 16, 2020 at 06:02:45 (UTC)
Goto Top
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
Member: PeterleB
PeterleB May 16, 2020 at 06:15:07 (UTC)
Goto Top
PS:
Sorry, habe Deine Antwort selbst nicht richtig gelesen.
Leider kann ich mit der Auflistung in den Dev-Tools nicht viel anfangen.
Mitglied: 144260
144260 May 16, 2020 updated at 06:48:23 (UTC)
Goto Top
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.
Member: colinardo
Solution colinardo May 16, 2020 updated at 08:57:56 (UTC)
Goto Top
Servus,
hier die reine Funktion ohne Proxy, den kannst du dir ja selbst im Skript noch ergänzen ...
back-to-topyandex_imagesearch_572088.zip

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
Member: PeterleB
PeterleB May 16, 2020 updated at 09:59:19 (UTC)
Goto Top
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)
Member: PeterleB
PeterleB May 17, 2020 updated at 11:39:33 (UTC)
Goto Top
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
Mitglied: 144260
144260 May 17, 2020 updated at 12:37:11 (UTC)
Goto Top
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 ...
Member: PeterleB
PeterleB May 17, 2020 at 12:48:20 (UTC)
Goto Top
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.
Member: colinardo
colinardo May 18, 2020 updated at 09:19:58 (UTC)
Goto Top
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
Member: PeterleB
PeterleB May 18, 2020 at 12:20:34 (UTC)
Goto Top
Das ist der Hammer. Danke.

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

Nochmals vielen Dank
Peter