Búsqueda de imágenes de Google: ¿cómo construyo una URL de búsqueda de imágenes inversa?

¿Cómo puedo progtwigr mediante Java convertir una imagen a “alguna cadena” para pasarla como un parámetro para buscar en la búsqueda de imágenes de Google? En realidad, he hecho una conversión base64 de imagen, pero difiere de la que hace Google en su motor de búsqueda de imágenes. He hecho una conversión así (java 7):

import javax.xml.bind.DatatypeConverter; ... Path p = Paths.get("my_photo.JPG"); try(InputStream in = Files.newInputStream(p); PrintWriter write = new PrintWriter("base64.txt"); ) { byte [] bytes = new byte[in.available()]; in.read(bytes); String base64 = DatatypeConverter.printBase64Binary(bytes); write.println(base64); } catch(IOException ex) { ex.printStackTrace(); } 

el resultado de este sencillo progtwig difiere de la cadena de google en url. Hablo de esa cadena que va después de tbs=sbi:AMhZZ...

Esta es mi mejor estimación de cómo funciona la búsqueda de imágenes:

Los datos en la URL no son una forma codificada de la imagen. Los datos son una huella dactilar de imagen utilizada para la concordancia difusa.

Deberías notar que cuando cargas una imagen para buscar, es un proceso de 2 pasos. El primer paso carga la imagen a través de la URL http://images.google.com/searchbyimage/upload . El servidor de Google devuelve la huella digital. El navegador se redirige a una página de búsqueda con una cadena de consulta basada en la huella digital.

A menos que Google publique el algoritmo para generar la huella digital, no podrá generar la cadena de consulta de búsqueda desde su aplicación. Hasta entonces, puede hacer que su aplicación publique la imagen en el URI de carga. Debería poder analizar la respuesta y construir la cadena de consulta.

EDITAR

Estas son las claves y valores enviados al servidor cuando subí un archivo.

 image_url = btnG = Search encoded_image = // the binary image content goes here image_content = filename = hl = en bih = 507 biw = 1920 

“bih” y “biw” parecen dimensiones, pero no corresponden al archivo cargado.

Utilice esta información bajo su propio riesgo. Es una API indocumentada que podría cambiar y romper su aplicación.

 Using google's image search. import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.DefaultHttpClient; public class HttpFileUpload { public static void main(String args[]){ try { HttpClient client = new DefaultHttpClient(); String url="https://www.google.co.in/searchbyimage/upload"; String imageFile="c:\\temp\\shirt.jpg"; HttpPost post = new HttpPost(url); MultipartEntity entity = new MultipartEntity(); entity.addPart("encoded_image", new FileBody(new File(imageFile))); entity.addPart("image_url",new StringBody("")); entity.addPart("image_content",new StringBody("")); entity.addPart("filename",new StringBody("")); entity.addPart("h1",new StringBody("en")); entity.addPart("bih",new StringBody("179")); entity.addPart("biw",new StringBody("1600")); post.setEntity(entity); HttpResponse response = client.execute(post); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = ""; while ((line = rd.readLine()) != null) { if (line.indexOf("HREF")>0) System.out.println(line.substring(8)); } }catch (ClientProtocolException cpx){ cpx.printStackTrace(); }catch (IOException ioex){ ioex.printStackTrace(); } } } 

Según la respuesta de @ Ajit, esto hace lo mismo pero usando el comando curl (Linux / Cygwin / etc)

 curl -s -F "image_url=" -F "image_content=" -F "filename=" -F "h1=en" -F "bih=179" -F "biw=1600" -F "encoded_image=@my_image_file.jpg" https://www.google.co.in/searchbyimage/upload 

Esto imprimirá una URL en salida estándar. Puede descargar esa URL con curl o wget pero es posible que tenga que cambiar el User Agent por el de un navegador web gráfico como Chrome.

    Intereting Posts