Как отправить запрос остальных API (API Google Vision) с помощью python? - PullRequest
1 голос
/ 26 марта 2019

Полагаю, мой вопрос относительно прост и наивен, но я новичок в использовании REST API, поэтому буду благодарен за любую помощь или подсказку.

Я пытаюсь отправить запрос с помощью urllib (или другой библиотеки Python, которую мне не нужно устанавливать). Основываясь на их руководстве , формат:

POST https://vision.googleapis.com/v1/images:annotate?key=YOUR_API_KEY

и формат запроса JSON :

{
  "requests":[
    {
      "image":{
        "content":"/9j/7QBEUGhvdG9...image contents...eYxxxzj/Coa6Bax//Z"
      },
      "features":[
        {
          "type":"LABEL_DETECTION",
          "maxResults":1
        }
      ]
    }
  ]
}

Когда я пытаюсь отправить следующий текст (только для проверки) в строке URL-адреса в моем браузере:

https://vision.googleapis.com/v1/images:{
  "requests":[
    {
      "image":{
        "content":"/9j/7QBEUGhvdG9eYxxxzj/Coa6Bax//Z"
      },
      "features":[
        {
          "type":"LABEL_DETECTION",
          "maxResults":1
        }
      ]
    }
  ]
}?key=my_api_key

Я получаю, к сожалению, ошибку 404.

Что мне делать? Должен ли я использовать какую-либо библиотеку для генерации запроса? Или мне следует разместить запрос JSON в другом месте URL-адреса?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Если вам нужно отправить Request Body с URL, вы можете использовать CURL. Для тестирования REST API существует известное программное обеспечение под названием POSTMAN . С его помощью вы можете отправлять запросы и получать ответ.

CURL

curl -v -H "Content-Type: application/json" -X POST \
     -d '{"image":{"content":"/9j/7QBEUGhvdG9...image contents...eYxxxzj/Coa6Bax//Z"}, "features":[{"type":"LABEL_DETECTION","maxResults":1}]}' https://vision.googleapis.com/v1/images:annotate?key=YOUR_API_KEY

Используя POSTMAN, вы можете присвоить ему эти значения и получить результаты.

Дайте URL,

https://vision.googleapis.com/v1/images:annotate?key=YOUR_API_KEY

Выберите HTTP METHOD as,

POST

И добавьте тело запроса в поле raw и выберите JSON(application/json),

{
  "requests":[
    {
      "image":{
        "content":"/9j/7QBEUGhvdG9...image contents...eYxxxzj/Coa6Bax//Z"
      },
      "features":[
        {
          "type":"LABEL_DETECTION",
          "maxResults":1
        }
      ]
    }
  ]
}
0 голосов
/ 28 июня 2019

Это работает для меня:

import base64
import requests
import json

URL = "https://vision.googleapis.com/v1/images:annotate?key=YOUR_TOKEN"

#image to base64, which is a long long text
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read())

#make api call
def image_request(image_path):
    data = {
            "requests":[
                        {
                        "image":{
                            "content":encode_image(image_path)
                                },
                        "features":[
                                    {
                                    "type":"LABEL_DETECTION", #other options: LABEL_DETECTION FACE_DETECTION LOGO_DETECTION CROP_HINTS WEB_DETECTION
                                    "maxResults": 10
                                    }
                                   ]
                        }
                    ]
}
    r = requests.post(URL, json = data)
    return r.text


#arg = path of image
def main(argv):
    api_answer = json.loads(image_request(argv[1]))
    try:
        rows = api_answer['responses'][0]['labelAnnotations']
    except:
        print(file_to_proccess)
        print(api_answer)
    data = []
    for item in rows:
        data.append([item['mid'], item['description'], item['score'], item['topicality']])

    # save somewhere the data list...

if __name__ == "__main__":
    main(sys.argv)
...