Поиск изображений Google: Как создать обратный URL-адрес поиска изображений?

Как я могу программно через java преобразовать изображение в "некоторую строку", чтобы передать его в качестве параметра для поиска в Google Image search. На самом деле я сделал некоторое преобразование base64 изображения, но оно отличается от того, что google делает в своей поисковой системе изображений. Я сделал такое преобразование (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();
            }

вывод этой простой программы отличается от строки google в url. Я говорю о той струне, которая идет после tbs=sbi:AMhZZ...

3 ответов


Это мое лучшее предположение о том, как работает поиск изображений:

данные в URL не зашифрованном виде изображения. Данные-это отпечаток пальца изображения, используемый для нечеткого сопоставления.

вы должны заметить, что при загрузке изображения для поиска, это процесс 2 шага. Первый шаг загружает изображение через url http://images.google.com/searchbyimage/upload. Сервер Google возвращает отпечаток пальца. Затем браузер перенаправляется на страницу поиска со строкой запроса, основанной на дактилоскопический.

Если Google не опубликует алгоритм генерации отпечатка пальца, вы не сможете создать строку поискового запроса из вашего приложения. До тех пор вы можете отправить изображение в URI загрузки приложения. Вы должны иметь возможность проанализировать ответ и построить строку запроса.

редактировать

это ключи и значения, отправленные на сервер при загрузке файла.

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

" bih" и "кузовов" выглядят как габариты, но не corrispond загруженного файла.

используйте эту информацию на свой страх и риск. Это недокументированный api, который может изменить и сломать ваше приложение.


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();
    }
 }
}

основываясь на ответе @Ajit, это делает то же самое, но с помощью 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

это напечатает URL на стандартном выходе. Вы можете загрузить этот URL с помощью curl или wget но вам может потребоваться изменить пользовательский агент на графический веб-браузер, такой как Chrome.