Python-Microsoft认知验证API(params)

Python-Microsoft认知验证API(params),python,microsoft-cognitive,Python,Microsoft Cognitive,我正在尝试将Microsoft认知验证API与python 2.7结合使用: 代码是: import httplib, urllib, base64 headers = { # Request headers 'Content-Type': 'application/json', 'Ocp-Apim-Subscription-Key': 'my key', } params = '{\'faceId1\': \'URL.jpg\',\'faceId2\': \'URL

我正在尝试将Microsoft认知验证API与python 2.7结合使用:

代码是:

import httplib, urllib, base64

headers = {
    # Request headers
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': 'my key',
}

params = '{\'faceId1\': \'URL.jpg\',\'faceId2\': \'URL.jpg.jpg\'}'

try:
    conn = httplib.HTTPSConnection('api.projectoxford.ai')
    conn.request("POST", "/face/v1.0/verify?%s" % params, "{body}", headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))
我试着让conn.request热线这样:

conn.request("POST", "/face/v1.0/verify?%s" % params, "", headers)
错误是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request</h2>
<hr><p>HTTP Error 400. The request is badly formed.</p>
</BODY></HTML>

错误的请求
错误的请求
HTTP错误400。请求的格式不正确

我一直试图遵循以下代码并使其正常工作:

  • 然而,我就是不能让这一个工作。我猜params或body参数有问题。
    非常感谢您的任何帮助。

    Dawid的评论似乎应该修复它(双引号),请在python 2.7中尝试以下内容:

    import requests
    
    url = "https://api.projectoxford.ai/face/v1.0/verify"
    
    payload = "{\n    \"faceId1\":\"A Face ID\",\n    \"faceId2\":\"A Face ID\"\n}"
    headers = {
        'ocp-apim-subscription-key': "KEY_HERE",
        'content-type': "application/json"
        }
    
    response = requests.request("POST", url, data=payload, headers=headers)
    
    print(response.text)
    
    对于python 3:

    import http.client
    
    conn = http.client.HTTPSConnection("api.projectoxford.ai")
    
    payload = "{\n\"faceId1\": \"A Face ID\",\n\"faceId2\": \"Another Face ID\"\n}"
    
    headers = {
        'ocp-apim-subscription-key': "keyHere",
        'content-type': "application/json"
        }
    
    conn.request("POST", "/face/v1.0/verify", payload, headers)
    
    res = conn.getresponse()
    data = res.read()
    
    你可以参考

    显然,您不理解代码
    “{body}”
    意味着您应该将其替换为包含请求url的正文,正如网站上所说:

    因此,您可以通过以下方式使用此api:

    body = {
                "url": "http://example.com/1.jpg"                          
           }
    …………
    
    conn = httplib.HTTPSConnection('api.projectoxford.ai')
    conn.request("POST", "/face/v1.0/detect?%s" % params, str(body), headers)
    

    您的脚本有几个问题:

  • 必须向REST API传递面ID,而不是URL或文件对象
  • 您必须正确制定HTTP请求
  • 但是,您可能会发现使用Python API比使用REST API更容易。例如,一旦有了面id,您就可以运行
    result=CF.face.verify(faceid1,另一个\u face\u id=faceid2)
    ,而不用担心设置正确的POST请求

    您可能需要使用
    pip
    安装
    cognitive\u-face
    。我使用这个API获取一些额外指令的面部ID

    为了简化这个过程,我们假设磁盘上有img1.jpg和img2.jpg

    下面是一个使用REST API的示例:

    import cognitive_face as CF
    from io import BytesIO
    import json
    import http.client
    
    # Setup
    KEY = "your subscription key"
    
    
    # Get Face Ids
    def get_face_id(img_file):
        f = open(img_file, 'rb')
        data = f.read()
        f.close()
        faces = CF.face.detect(BytesIO(data))
    
        if len(faces) != 1:
            raise RuntimeError('Too many faces!')
    
        face_id = faces[0]['faceId']
        return face_id
    
    
    # Initialize API
    CF.Key.set(KEY)
    
    faceId1 = get_face_id('img1.jpg')
    faceId2 = get_face_id('img2.jpg')
    
    
    # Now that we have face ids, we can setup our request
    headers = {
        # Request headers
        'Content-Type': 'application/json',
        'Ocp-Apim-Subscription-Key': KEY
    }
    
    params = {
        'faceId1': faceId1,
        'faceId2': faceId2
    }
    
    # The Content-Type in the header specifies that the body will
    # be json so convert params to json
    json_body = json.dumps(params)
    
    try:
        conn = httplib.HTTPSConnection('https://eastus.api.cognitive.microsoft.com')
        conn.request("POST", "/face/v1.0/verify", body=json_body, headers=headers)
        response = conn.getresponse()
        data = response.read()
        data = json.loads(data)
        print(data)
        conn.close()
    except Exception as e:
        print("[Errno {0}] {1}".format(e.errno, e.strerror))
    

    我认为JSON格式使用双引号而不是单引号。我会试着在帕拉马斯改变它们。谢谢@Dawid,@Ryan。恐怕不行。我像你说的那样尝试了,它显示了错误
    ImportError:没有名为http.client的模块。
    如果我改为使用
    conn=httplib.HTTPSConnection('api.projectoxford.ai')
    和双引号
    payload=“{\n\“faceId1\”:\“A Face ID\”,\n\“faceId2\:“另一个Face ID\”\n}
    我得到这个错误:
    {error:{“BadArgument”、“message”:“Face ID无效。”}}
    对不起,我没有注意到您使用的是python 2.7。http.client是python 3的一部分。此外,为了完整性,您必须交换您拥有的实际有效的Face ID guid,比如从以前的/detect/callFormatting技巧中获得的guid…使用三引号/撇号(ala docString)要包含复杂的文本,…
    payload=''{“faceId1”:“URL.jpg”,…}'