如何通过OAuth2获取授权令牌并通过http请求阅读Outlook电子邮件?

时间:2019-01-18 02:24:03

标签: python python-3.x python-requests microsoft-graph outlook-restapi

我一直在Outlook中仅通过使用python请求获取端点bot = Bot('.') bot.remove_command('help') @bot.group(invoke_without_command=True) # Change this to false to always run main command async def help(): pass @help.command() async def music(): await bot.say("Music is music") @help.command() async def fun(): await bot.say("Fun is strictly prohibited")

来检索电子邮件

示例代码:

.help fun

我会找回一个json对象,解析它,然后获取我的电子邮件的内容。但是现在Microsoft已弃用它,我一直在尝试迁移到使用Microsoft Graph。我的问题是,如何获得OAuth2令牌而不必使用http请求启动浏览器?

到目前为止,我一直在阅读docs并将我的“ app”(只是常规的python脚本)注册到Application Registration Portal中。我遇到的每个示例,我总是必须访问一个授权URL,在该URL中,我必须通过如下所示的前端UI手动登录: outlook login 我希望能够通过http请求/没有前端UI来执行此操作,但是我似乎找不到任何有关执行此操作的答案。

这是我到目前为止的代码:

outlook_test.py

https://outlook.office365.com/api/v1.0/me/messages

这就是我得到的:

import requests

requests.get('https://outlook.office365.com/api/v1.0/me/messages', auth=(email, pwd))

这是我注册应用程序时平台设置中的内容(如果有帮助): app platform settings screenshot

我可以通过编程方式获取授权码吗?我也尝试传递auth参数,但这没用。

新发现

我最近发现python请求可以处理OAuth2,但是现在我在尝试遵循their examples时遇到了另一个错误。 这是我得到的错误:

import requests

authorize_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'
token_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'

payload = {
        'client_id': app_client_id, # Variable exists but not exposed in this question
        'response_type': 'code',
        'redirect_uri': 'https://login.microsoftonline.com/common/oauth2/nativeclient',
        'response_mode': 'form_post',
        'scope': 'mail.read',
        'state': '12345'
        }

r = requests.get(authorize_url, params=payload)
print(r.status_code)
print(r.text)

我尝试将200 <!DOCTYPE html> <html dir="ltr" class="" lang="en"> <head> <title>Sign in to your account</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scal able=yes"> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Expires" content="-1"> <meta name="PageID" content="ConvergedSignIn" /> <meta name="SiteID" content="" /> <meta name="ReqLC" content="1033" /> <meta name="LocLC" content="en-US" /> <noscript> <meta http-equiv="Refresh" content="0; URL=https://login.microsoftonline.com/jsdisabled" /> </noscript> <link rel="shortcut icon" href="https://secure.aadcdn.microsoftonline-p.com/ests/2.1.8502.8/co ntent/images/favicon_a_eupayfgghqiai7k9sol6lg2.ico" /> <meta name="robots" content="none" /> ... 用作作用域,但是得到了“无效的作用域参数”。

我的新python脚本:

outlook_test.py

  File "outlook_test.py", line 31, in <module>
    token = oauth.fetch_token(token_url=token_url, auth=auth)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\requests_oauthlib\oauth2_session.py", line 307, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\oauthlib\oauth2\rfc6749\clients\base.py", line 415, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\oauthlib\oauth2\rfc6749\parameters.py", line 425, in parse_token_response
    validate_token_parameters(params)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\oauthlib\oauth2\rfc6749\parameters.py", line 432, in validate_token_parameters
    raise_from_error(params.get('error'), params)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\oauthlib\oauth2\rfc6749\errors.py", line 405, in raise_from_error
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.InvalidClientIdError: (invalid_request) AADSTS90014: The required field 'scope' is missing.
Trace ID: 2359d8a6-0140-43c1-8ff5-8103045d2f00
Correlation ID: dff39a1f-ffe1-493e-aea3-1536974b777d

2 个答案:

答案 0 :(得分:0)

您正在使用的范围Mail.Read需要用户同意。您想要的是需要管理员同意的应用程序权限Mail.Read(此链接显示如何获取Admin Consent)。 您正在尝试访问用户的消息,因此用户需要同意该操作。 根据文档: enter image description here

enter image description here

答案 1 :(得分:-1)

我发现本教程对于获取访问代码非常有帮助:

本教程使用Microsoft Graph(涵盖包括Microsoft Outlook在内的几种Microsoft产品)而非Outlook REST API(仅涵盖Outlook)。

https://docs.microsoft.com/en-us/outlook/rest/python-tutorial

起初,我认为设置Django服务器是过分的。然后我意识到,我想为我的Python实例提供一种在单点登录后捕获访问代码的方法。 (我必须使用浏览器进行单点登录,因为我的机构使用多因素身份验证。)拥有Django服务器是一种自然的方式。

因此,我创建了一个新的PyCharm Django项目(在PyCharm中很简单),并开始遵循该教程。

我发现至关重要的是,要继续显示该电子邮件,以免发生身份验证错误-完全不同于该教程,并且我收到了无法理解的错误消息(例如this one)。 / p>

(我之前是为了回答其他问题而发布此答案here。)