Поиск картинок Google: Как создать URL для поиска обратных картинок?

Как я могу программно через Java преобразовать изображение в "некоторую строку", чтобы передать его в качестве параметра для поиска в поиске картинок Google. На самом деле я сделал конвертацию изображений в 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 не являются закодированной формой изображения. Данные представляют собой отпечаток изображения, используемый для нечеткого сопоставления.

Вы должны заметить, что когда вы загружаете изображение для поиска, это двухэтапный процесс. Первый шаг загружает изображение через 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" и "biw" выглядят как размеры, но не соответствуют загруженному файлу.

Используйте эту информацию на свой страх и риск. Это недокументированный 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.

Это то, что у меня работает. На самом деле никакой кодировки не требуется.

https://www.google.com/searchbyimage?image_url=YOUR_IMAGE_URL

Используйте Google Vision API для этого. Есть также много примеров, доступных от Google

Другие вопросы по тегам