# Google Image Upload



## MathiasBauer (14. Dez 2011)

Hallo zusammen,

ich würde gerne die Funktion von Google "Suche anhand von Bildern" nutzen und ein Bild hochladen. Leider gibt es dafür noch keine API.

Mit folgendem HTML-Code kann man Bilder hochladen:


```
<html>
<head>
</head>
<body>
<form action="http://images.google.com/searchbyimage/upload" enctype="multipart/form-data" method="post">
<input type="file" name="encoded_image">
<input type="hidden" name ="image_content" value="">
<input type="hidden" name ="filename" value="">
<input type="hidden" name ="hl" value="de">
<input type="hidden" name ="sa" value="G">
<input type="hidden" name ="bih" value="373">
<input type="hidden" name ="biw" value="1135">
<input type="hidden" name ="btnG" value="Suchen">
<input type="hidden" name ="image_content" value="">
<input type="submit">
</form>
</body>
</html>
```

Jetzt ist die Frage, wie kann man das in Java hinbekommen, da redirects mit drinne sind und FollowRedirects(true) nicht funktioniert.

Ich verwende die Libraries von Apache: commons-logging.jar, commons-codec-1.3.jar, commons-httpclient-3.0-rc4.jar

Hier mein Java-Code:
[Java]
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;


public class GoogleWrapper {

	public String test (String url,String filename) throws IOException{
		HttpClient client = new HttpClient();
		String response = url;
		client.getParams().setParameter("http.useragent", "Test Client");
		client.getParams().setParameter("http.connection.timeout",new Integer(5000));

		PostMethod method  = new PostMethod();
		FileOutputStream fos = null;

		BufferedReader br = null;

		method = new PostMethod(url);
		method.addParameter("image_content","");
		method.addParameter("filename","");
		method.addParameter("hl","de");
		method.addParameter("sa","G");
		method.addParameter("bih","373");
		method.addParameter("biw","1135");
		method.addParameter("btnG", "Suchen");

		File file = new File(filename);

		Part[] parts = {new FilePart("file", file.getName(), file)};
		method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));

		try{
			int returnCode = client.executeMethod(method);

			int statuscode = method.getStatusCode();
			System.out.println("STATUS CODE = "+statuscode);


			if ((statuscode == 301) | (statuscode == 302)) {
				// feed has moved
				Header location = method.getResponseHeader("Location");
				if (!location.getValue().equals("")) {
					// recursively check URL until it's not redirected any more
					String responseBody = method.getResponseBodyAsString();
					System.out.println(responseBody);
					String redirectLocation = location.getValue();
					System.out.println(redirectLocation);
					method = new PostMethod(redirectLocation);
					method.setRequestHeader(location);
					returnCode = client.executeMethod(method);

					statuscode = method.getStatusCode();
					System.out.println("STATUS CODE = "+statuscode);
				}
			} else {
				response = url;
			}


			if(returnCode == HttpStatus.SC_NOT_IMPLEMENTED) {
				System.err.println("The Post method is not implemented by this URI");
				// still consume the response body
				method.getResponseBodyAsString();

				String responseBody = method.getResponseBodyAsString();
				System.out.println(responseBody);

			} else {
				if(returnCode == HttpStatus.SC_OK)
				{
					String responseBody = method.getResponseBodyAsString();
					System.out.println(responseBody);
				}
			}
		} catch (Exception e) {
			System.err.println(e);
		} finally {
			method.releaseConnection();
			if(br != null) try { br.close(); } catch (Exception fe) {}
		}
		return null;
	}

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		GoogleWrapper wrapper = new GoogleWrapper();
		String filename = "D:/Photos/026.jpg";
		wrapper.test("http://images.google.com/searchbyimage/upload",filename);

	}

}
[/Java]

Und hier meine Konsolen-Ausgabe:

```
14.12.2011 13:54:11 org.apache.commons.httpclient.HttpMethodDirector isRedirectNeeded
INFO: Redirect requested but followRedirects is disabled
STATUS CODE = 302
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://images.google.com/search?tbs=sbi:AMhZZitnglxc3stDxx0TVFeEEdAdEhEfpaASn3s9r0MkYO_1qELcXh35uYPTTkr48gkv7_1IRkDNoB&amp;file=%FF%D8%FF%E1(~Exif">here</A>.
</BODY></HTML>

http://images.google.com/search?tbs=sbi:AMhZZitnglxc3stDxx0TVFeEEdAdEhEfpaASn3s9r0MkYO_1qELcXh35uYPTTkr48gkv7_1IRkDNoB&file=%FF%D8%FF%E1(~Exif
STATUS CODE = 405
```

Für jeden Ansatz wäre ich dankbar.

Grüße

Mathias


----------



## MathiasBauer (17. Dez 2011)

Wenn mir jemand einen Tipp geben könnte, wäre ich ihm sehr verbunden.


----------



## AlexSpritze (17. Dez 2011)

Am Ende der Konsolen-Ausgabe steht doch als Status Code 405 was "Method Not Allowed" bedeutet. Heißt das, du müsstest anstatt POST GET verwenden? Oder vielleicht PUT?

Oder was passiert, wenn du dem Link in der Ausgabe folgst: 
	
	
	
	





```
<A HREF="http://images.google.com/search?tbs=sbi:AMhZZitnglxc3stDxx0TVFeEEdAdEhEfpaASn3s9r0MkYO_1qELcXh35uYPTTkr48gkv7_1IRkDNoB&amp;file=%FF%D8%FF%E1(~Exif">here</A>.
```


----------



## MathiasBauer (17. Dez 2011)

Vielen Dank für deine Anwort.

Laut Firebug ist es Post. Und der HTML-Code funktioniert auch mit Post.
Hier ein Screenshot aus Firebug:






Wenn ich die Url aus der Konsole aufrufe, sagt mir das, dass das Bild nicht upgeloaded wurde. 


Verwende ich MultipartRequestEntity richtig?


Wird ein Bild wirklich so gesendet und der PostMethod mit angehängt?


----------



## MathiasBauer (17. Dez 2011)

Ich glaube, dass es an diesen Zeilen liegt:


```
PostMethod method  = new PostMethod();
File file = new File(filename);
Part[] parts = {new FilePart("file", file.getName(), file)};
method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
```

Kann ich auf diese Weise per PostMethod Dateien versenden? Fehlt noch etwas?


----------



## MathiasBauer (19. Dez 2011)

Ich bin etwas weiter gekommen:
Nach der PostMethod folgt eine GetMethod.

Allerdings ist nur bei der PostMethod der Status 302. Bei der GetMethod bekomme ich den Status 200 zurück. 

Laut Firebug werden aber 7 Get-Anfragen gesendet.

Bei der ersten Weiterleitung (nach der PostMethod) sieht die Url in etwa so aus:
http://images.google.com/search?tbs=sbi:AMhZZisQr_1XYfQPfzgrp7SyWR7trwG8dvPWi8Q0IKOZmcmI_196cHyVdrfqIdN9ZhBicqqK6MxUkl&file=%FF%D8%FF%E1

Von der GetMethod bekomme ich allerdings keinen Header, da der Status 200 ist.

Wie komme ich an den Referer?
(z.B. GoogleUrl)


----------



## areafo (28. Dez 2011)

Getting Started - Google Image Search API - Google Code

werfe ich mal so in den raum. das ganze (api) ist als deprecated gekennzeichnet. wahrscheinlich wäre eine automatisierung wie du sie vorhast ein verstoß?


Using Java
The following code snippet shows how to make a request to the Google Image Search API using Java. This example uses the JSON library from json.org.

```
URL url = new URL("https://ajax.googleapis.com/ajax/services/search/images?" +
                  "v=1.0&q=barack%20obama&key=INSERT-YOUR-KEY&userip=INSERT-USER-IP");
URLConnection connection = url.openConnection();
connection.addRequestProperty("Referer", /* Enter the URL of your site here */);

String line;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while((line = reader.readLine()) != null) {
 builder.append(line);
}

JSONObject json = new JSONObject(builder.toString());
// now have some fun with the results...
```


----------



## MathiasBauer (28. Dez 2011)

Danke für deine Antwort.

Jedoch gibt es leider keine API von Google, um Bilder für die Bildersuche hochzuladen. Andersherum geht es schon. Zuerst kann man nach einem Suchbegriff suchen und dann die Bilder runterladen.


----------



## areafo (29. Dez 2011)

Stimmt da gebe ich dir recht. Das was ich rausgesucht habe ist nur auf String Basis und nicht auf IMG Basis.


----------



## MathiasBauer (29. Dez 2011)

Trotzdem danke für deine Bemühungen!


----------



## Landei (28. Feb 2012)

Das Thema würde mich auch interessieren, bist du inzwischen weitergekommen?

Ich habe noch das hier dazu gefunden:
java - Google image search: How do I construct a reverse image search URL? - Stack Overflow


----------



## MathiasBauer (28. Feb 2012)

Leider bin ich nicht weitergekommen. Mein Prof hat mich von der Aufgabe erlöst, da wir im Praktikum einen anderen Schwerpunkt hatten.

Den Inhalt des Links kenne. Das war auch meine Grundlage. Allerdings hat es nicht zum Erfolg geführt.

Ich habe es auch nochmal in PHP versucht. Hier der Forumsbeitrag:
Google Image Upload - php.de 

Dort wurde ich u.a. daruaf hingewiesen, dass es nicht erlaubt ist, außerhalb der APIs automatisiert Suchanfragen zu stellen.


----------



## Landei (28. Feb 2012)

Trotzdem danke. 

Zu blöd, dass das nicht in der API ist, und dass andere Seiten nichts taugen :-/


----------

