Поиск картинок Google: Как создать URL для поиска обратных картинок? - PullRequest
9 голосов
/ 28 сентября 2011

Как я могу программно через 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...

Ответы [ 4 ]

11 голосов
/ 28 сентября 2011

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

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

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

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

EDIT

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

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

"bih" и "biw" выглядят как размеры, но не соответствуют загруженному файлу.

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

7 голосов
/ 21 сентября 2013
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();
    }
 }
}
2 голосов
/ 31 октября 2014

Основываясь на ответе @ 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.

0 голосов
/ 20 марта 2019

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

...