如何用python在Microsoft Graph中显示用户图像

sbtkgmzw  于 2022-12-25  发布在  Python
关注(0)|答案(4)|浏览(134)

我尝试使用GET https://graph.microsoft.com/v1.0/me/photo/$value来获取用户的图像/照片,但它只返回一个HTTP 200状态码。我该如何获取二进制数据?
我也尝试过content.property按照similar post中的建议使用www.example.com,但获得.format不是dict的属性。

@app.route("/photo")
def get_photo():
    token = _get_token_from_cache(app_config.SCOPE)
    if not token:
        return redirect(url_for("login"))
    photo = requests.get(app_config.PHOTO_ENDPOINT,  
            headers={'Authorization': 'Bearer ' + token['access_token']})
    print(photo.status_code)
    return photo
mitkmikd

mitkmikd1#

获取个人资料照片,并选择性地保存本地副本。返回原始照片数据、HTTP状态代码、内容类型和保存的文件名的元组。请参阅此sample

def profile_photo(session, *, user_id='me', save_as=None):
    """Get profile photo, and optionally save a local copy.
    session = requests.Session() instance with Graph access token
    user_id = Graph id value for the user, or 'me' (default) for current user
    save_as = optional filename to save the photo locally. Should not include an
              extension - the extension is determined by photo's content type.
    Returns a tuple of the photo (raw data), HTTP status code, content type, saved filename.
    """

    endpoint = 'me/photo/$value' if user_id == 'me' else f'users/{user_id}/$value'
    photo_response = session.get(api_endpoint(endpoint),
                                 stream=True)
    photo_status_code = photo_response.status_code
    if photo_response.ok:
        photo = photo_response.raw.read()
        # note we remove /$value from endpoint to get metadata endpoint
        metadata_response = session.get(api_endpoint(endpoint[:-7]))
        content_type = metadata_response.json().get('@odata.mediaContentType', '')
    else:
        photo = ''
        content_type = ''

    if photo and save_as:
        extension = content_type.split('/')[1]
        filename = save_as + '.' + extension
        with open(filename, 'wb') as fhandle:
            fhandle.write(photo)
    else:
        filename = ''

    return (photo, photo_status_code, content_type, filename)
bvjveswy

bvjveswy2#

如果要在网页上显示生成的图像,则使用基于原始问题代码的替代方法。

from base64 import b64encode

@app.route("/photo")
def get_photo():
    token = _get_token_from_cache(app_config.SCOPE)
    if not token:
        return redirect(url_for("login"))
    response = requests.get(
        app_config.PHOTO_ENDPOINT,  
        headers={'Authorization': 'Bearer ' + token['access_token']}
    )
    content_type = response.raw.getheader('Content-Type')
    return render_template('index.html',
                           photo_data=b64encode(response.content),
                           photo_content_type=content_type)

然后在index.html模板中,您可以如下显示照片:

<html>
  <body>
    <img src="data:{{ photo_content_type }};base64,{{ photo_data }}" />
  </body>
</html>
qnzebej0

qnzebej03#

Call Api: - 

    Axios.get('https://graph.microsoft.com/v1.0/me/photo/$value', {
                  headers: { 'Authorization': 'Bearer '+AccessToken },
                  responseType: 'blob'
                }).then(o => {
                  const url = window.URL || window.webkitURL;
                  const blobUrl = url.createObjectURL(o.data);
                  
                    self.setState({ imageUrl: blobUrl });
                })

JSX: -
 <img alt="image" src={this.state.imageUrl} />
unguejic

unguejic4#

以下是对我起作用的方法:

from base64 import b64encode

token = _get_token_from_cache(app_config.graphSCOPE)
aadPhotoURI = "https://graph.microsoft.com/v1.0/me/photo/$value"
response = requests.get(aadPhotoURI, headers={'Authorization': 'Bearer ' + 
    token['access_token']},)
content_type = response.raw.getheader('Content-Type')

return render_template(
    'usersettings.html',
    photo_data = b64encode(response.content).decode(),
    photo_content_type = content_type)

然后在. html页面中添加:

<img class="account-img" alt="" src="data:{{ photo_content_type }};base64,{{ photo_data }}"/>

帐户的CSS-img:

.account-img {
    width: 40px;
    float: right;
    border-radius: 50%;
  }

相关问题