Я хотел бы загрузить электронные письма и их вложения из моей учетной записи Outlook через Python.Поэтому я использовал официальный скрипт Python с некоторыми изменениями, так как я не хотел использовать Django.Здесь ниже вы можете увидеть мои две неудачные попытки, две соответствующие ошибки и некоторые комментарии.Если я не ошибаюсь, проблема возникает, когда я пытаюсь получить код авторизации для получения токена доступа.На этом этапе я не могу сделать так, чтобы мое приложение входило успешно и автоматически.Хотя в этом посте я только представляю проблему с кодом авторизации, я хотел бы сообщить вам, что вторая проблема связана с неверным токеном доступа, который я получаю, используя мой client_id, client_secret и полученный вручную код авторизации.
Обратите внимание, что я использую так называемую «конечную точку аутентификации Azure AD v2» (как предложено в https://docs.microsoft.com/en-us/previous-versions/office/office-365-api/api/version-2.0/use-outlook-rest-api и https://docs.microsoft.com/en-us/outlook/rest/python-tutorial) для регистрации и аутентификации моего приложения.Стоит подчеркнуть, что я также пытался использовать Azure AD и OAuth (т.е. второй подход для обработки регистрации приложений и авторизации пользователей 'https://manage.windowsazure.com/') без какого-либо успеха. Каков правильный подход в моем случае? Где моя ошибка? Учитывая мои проблемы, я считаю, что регистрирую свое приложение неправильно.
Заранее благодарю, желаю всем хорошего дня.
Модифицированный скрипт :
# Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE.txt in the project root for license information.
#from urllib.parse import quote, urlencode
from urlparse import urlparse
from urllib2 import urlopen
from urllib import urlencode
import requests
import base64
import json
import time
import httplib
# Client ID and secret
client_id = 'xxxxxxxxxx'
client_secret = 'xxxxxxxxxx'
# Constant strings for OAuth2 flow
# The OAuth authority
authority = 'https://login.microsoftonline.com'
# The authorize URL that initiates the OAuth2 client credential flow for admin consent
authorize_url = '{0}{1}'.format(authority, '/common/oauth2/v2.0/authorize?{0}')
# The token issuing endpoint
token_url = '{0}{1}'.format(authority, '/common/oauth2/v2.0/token')
# The scopes required by the app
scopes = [ 'openid',
'User.Read',
'Mail.Read',
'offline_access']
def get_signin_url(redirect_uri):
# Build the query parameters for the signin url
params = { 'client_id': client_id,
'redirect_uri': redirect_uri,
'response_mode': 'query',
'response_type': 'code',
'scope': ' '.join(str(i) for i in scopes)
}
signin_url = authorize_url.format(urlencode(params))
return signin_url
signin_url = get_signin_url("http://localhost/myapp/")
## first attempt
signin_url_r = signin_url.replace('https://', "")
conn = httplib.HTTPConnection(signin_url_r)
#conn.request("GET", "code")
#conn.request("GET","/")
#r1 = conn.getresponse()
#print(r1.read())
#print(r1.status, r1.reason)
## second attempt
resq = requests.get(signin_url)
print resq.status_code
print resq.text
print resq.url
#with open('authhelper_f_v0.html', 'w') as outfile:
# outfile.write(resq.text)
Ошибки :
(1)
ERROR ---> conn.request("GET", "code")
gaierror: [Errno -2] Name or service not known
(2)
<!DOCTYPE html>
<html dir="ltr" class="" lang="en">
<head>
<title>Sign in to your account</title>
etc..
Комментарии :
Первая попытка выдает ошибку (1), которая, по моему мнению, происходит из-за отсутствия слова «code» в ответе get. Если я печатаю «resq.text» со второй попытки, ядействительно может видеть, что ответ get не является ожидаемым (то есть GET HTTP / 1.1 302 Found Location: http://localhost/myapp/?code= xxxxx & session_state = xxxx & state = xxx - см. «Запрос на перенаправление после успешного входа» в https://docs.microsoft.com/en-us/outlook/rest/get-started), а не тот, который вы видите в (2), то есть страницу «Вход в Outlook».