pythonhttpauthorizationvisual-recognition

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 "images_file=@bobross.jpg" "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.


Solution

  • 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))