Christoph Kormesser
Christoph Kormesser

Reputation: 13

Error: Unauthorized - Python script to IBM Watson Visual Recognition

So I'm trying to get the output of the IBM Visual Recognition Service, but always get the same Error: {"code":401, "error": "Unauthorized"}

It works if I try it with cURL:

$ curl -X POST -u "apikey: ------------" -F "[email protected]" "https://gateway.watsonplatform.net/visual-recognition/api/v3/detect_faces?version=2018-03-19"
{ facerecognition data }

My python code so far:

import json
import sys
import requests
header= { 'apikey': '---------', 'Content-Type': 'FaceCharacteristics'}
url= "https://gateway.watsonplatform.net/visual-recognition/api/v3/detect_faces?version=2018-03-19"
file ={image:open('bobross.jpg','rb')}
r = requests.post(url, headers=header, files=file)
print(r.text)

I tried my code in other variants, but it always led to "Unauthorized". Btw, I am very little experienced with python, I'm still trying to learn.

Upvotes: 0

Views: 507

Answers (1)

cathaldi
cathaldi

Reputation: 161

In your curl example you are passing authentication with the -u flag while in python you are passing it in the header as is. The server is ignoring the authentication in the header and you are being returned a 401 as we expect.

To make life easier we can pass our auth details into the request itself with auth=('apikey', '[An API Key]') as a named parameter.

It would also be worth removing the Content-Type: FaceCharacteristics from the header - not really sure where this was picked up.

import requests

url = 'https://gateway.watsonplatform.net/visual-recognition/api/v3/classify?version=2018-03-19'
files = {'images_file': open('fruitbowl.jpg','rb')}
resp = requests.post(url, auth=('apikey', '[An API Key]'), files=files)

print(resp.content)

Finally add the file and you should be all set.

More info on requests here


However if you are doing anything more than this..

You probably want to have a look at the Python SDK that IBM provides. It has more documentation and sample code that you can use.

For example, this is provided.

import json
from watson_developer_cloud import VisualRecognitionV3

visual_recognition = = VisualRecognitionV3(
    version='{version}',
    api_key='{api_key}'
)
with open('./fruitbowl.jpg', 'rb') as images_file:
    classes = visual_recognition.classify(
        images_file,
        threshold='0.6',
        classifier_ids='dogsx2018x03x17_1725181949,Connectors_424118776')
print(json.dumps(classes, indent=2))

Upvotes: 1

Related Questions