type
status
date
slug
summary
tags
category
icon
password
在使用Graph API時,我們主要是用request方法去使用api,但在此之前我們需要token,因此除了Graph API 的呼叫程式碼外,這一篇筆記也會涵蓋使用 msal 這個套件細節,但在此之前需要對Microsoft的細節有更多的了解,可以先去看上一篇筆記
另外,假如從頭到尾閱讀這一篇可能會發瘋,因此先看最下面我提供的Code,並且通靈感受一下那個Code流程,再一個一個慢慢補一些細節比較好理解
註冊開發程式以及設定一些有的沒的取得token什麼是MSAL? ADAL?Scope大致上的介紹實際上使用的方法在Python使用MSAL一個簡單的說明和開始PublicClientApplication & ConfidentialClientApplication介紹建立App需要的參數App依照不同的情境會有的python方法Code 範例:fastAPI + Authorization code flowGraphAPI本人簡介試用GraphAPI: Graph Explorer常見功能針對抓取mail相關訊息的方法message/ List messages抓特定messagemessage/ List attachmentsAttachment/Get attachment
註冊開發程式以及設定一些有的沒的
先去Azure裡面的App registrations,把app生出來

注意,假如希望多數的帳號都可以使用這個app,而不是要在租戶裡面,那要選擇第三個

這邊用已經存在的outlookYaraScan當示範,下面是app裡面可以設定的東西

我們可以特別注意
- Overview:裡面有各種白痴key
- Authentication:要設定redirect url要去那邊 (Authorization Code Flow會用到)
- Certificates & secrets:使用CredentialClientApp (App-only access) 會用到的secret key
- Token configuration, API permissions:設定權限會用到
取得token
什麼是MSAL? ADAL?
MSAL,全名Microsoft Authentication Library,是微軟開發的一種身份驗證庫,用於使應用程式能進行身份驗證和取得token來存取保護的資源(例如微軟的APIs)。它支援各種身份驗證標準,包括OpenID Connect和OAuth2.0。
MSAL的主要優勢在於支援最新的身份驗證協議和模式,並且它專為與微軟的身份驗證平台,如Azure Active Directory (Azure AD) 和 Microsoft Accounts (MSA) 進行交互而設計。此外,MSAL也提供了跨多個平台(包括.NET、Java、Python、JavaScript, Android, IOS and macOS)的支援。
關於ADAL(Azure Active Directory Authentication Library),它是MSAL之前的版本,也是為了讓開發者可以容易地使他們的應用程式與Azure AD進行交互。然而,微軟在2022年宣布將停止對ADAL的支援,並將在2023年起完全停止其使用。
主要的原因是微軟希望將重心放在維護和更新MSAL上,因為MSAL提供了更多的功能,更好的性能,並支援最新的安全性標準。另一個原因是,MSAL可以與Microsoft Graph API完全兼容,使開發者能夠更方便地存取和管理Microsoft 365的資源。所以,微軟建議開發者將他們的應用程式從ADAL遷移到MSAL。
Scope
大致上的介紹
Microsoft 提供了多種服務,每種服務都有自己的一套 scopes(權限範圍)。
以下是一些常見的範疄:
- Microsoft Graph API:Microsoft Graph API 是一種讓你能夠讀取和寫入多種 Microsoft 365 服務的資源的方法,包括 Outlook 郵件、日曆、OneDrive 檔案、任務、Teams 聊天等。以下是一些常見的 Microsoft Graph scopes:
User.Read
:讓應用程式讀取使用者的個人資訊。Mail.Read
:讓應用程式讀取使用者的郵件。Files.Read
:讓應用程式讀取使用者的 OneDrive 檔案。Calendars.Read
:讓應用程式讀取使用者的日曆。
- Office 365 Management APIs:Office 365 Management API 提供了許多與服務相關的管理功能,例如安全和合規性中心、審計等。以下是一些常見的 Office 365 Management API scopes:
https://manage.office.com/ActivityFeed.Read
:讓應用程式讀取 Office 365 安全審計記錄。https://manage.office.com/ServiceHealth.Read
:讓應用程式讀取 Office 365 服務狀態。
- Azure Management APIs:Azure Management API 提供了管理 Azure 資源的能力,例如虛擬機器、網路、資源組等。以下是一些常見的 Azure Management API scopes:
https://management.azure.com/user_impersonation
:讓應用程式以使用者的身份執行 Azure Management API。
這只是一小部分範例,實際上每種 Microsoft 服務都有自己的一套 scopes。你可以在相應的 Microsoft API 文件中找到更詳細的列表和說明。
在建立應用程式並請求權限時,請確保你只請求你真正需要的權限。這是一種稱為最小權限原則的最佳實踐,可以提高應用程式的安全性。
實際上使用的方法
我們會在scope裡面使用以下的指令,可以把當初app設定所有permision都拿下來
基本上使用Azure那邊註冊app的地方,
點選 API permission那邊,把要設定的東西放進去就對了
在Python使用MSAL
一個簡單的說明和開始
首先,你需要在你的 Python 環境中安裝 MSAL。你可以使用 pdm 來安裝:
一般而言,使用 MSAL 進行身份驗證和授權的基本流程如下:
- 初始化一個
PublicClientApplication
或ConfidentialClientApplication
物件 (詳細可以看上一篇的)。
- 使用該物件調用相關的方法(例如
acquire_token_by_authorization_code
) 進行身份驗證並取得令牌。
PublicClientApplication & ConfidentialClientApplication介紹
在 MSAL 中,
PublicClientApplication
和 ConfidentialClientApplication
是兩種用於進行身份驗證和授權的物件,但是它們適用於不同的情境。PublicClientApplication
:這個類別是用於構建那些無法安全存儲客戶端密鑰的應用程式的,比如一般的桌面應用或者是移動應用。這些類型的應用程式在初始化PublicClientApplication
物件時,只需要提供client_id
(應用程式在 Azure AD 中的識別碼)。這類應用程式將主要使用如 Device Code Flow、Interactive Flow 之類的授權流程。
ConfidentialClientApplication
:這個類別是用於那些能夠安全存儲客戶端密鑰的應用程式的,例如運行在伺服器端的 Web 應用程式或服務。這些類型的應用程式在初始化ConfidentialClientApplication
物件時,需要提供client_id
和client_secret
。這類應用程式主要使用如 Authorization Code Flow、Client Credential Flow 等授權流程。
總的來說,選擇哪種類別取決於你的應用程式類型以及能否安全地存儲客戶端密鑰。兩種類別都提供了一組相似的 API 方法用於進行身份驗證和授權,但具體使用哪種方法則取決於授權流程。
基本上,假如有看過上一篇,那其實有更快的理解方式
- PublicClientApplication:對應到 Delegated access
- ConfidentialClientApplication:對應到App-only access
那基本上,我們的專案是去抓個人的mail,依照上一篇的結論,我們會知道要使用PublicClientApplication。
建立App需要的參數
在 Python 中,你可以使用以下方式建立一個
PublicClientApplication
:
(假如是ConfidentialClientApplication,把PublicClientApplication置換掉就好)這些參數的細節如下:
client_id
:這是你的應用程式在 Azure AD 中的應用程式(客戶端)ID。這是必需的,因為它讓 Azure AD 知道是哪一個應用程式正在試圖進行身份驗證或授權操作。
authority
:這是一個 URL,指向了負責處理身份驗證和授權請求的 Azure AD 的實體。如果你沒有提供這個參數,則 MSAL 會使用默認的實體(即https://login.microsoftonline.com/common
)。在多數情況下,你不需要更改這個參數,除非你需要指向特定的租戶或使用國家特定的雲。
client_credential
:這個參數在PublicClientApplication
中並不常用,因為公開客戶端應用程式通常無法安全地存儲客戶端密鑰。然而,如果你確實有一個密鑰,並且想要用它來執行某些需要它的操作(例如 client credentials flow),那麼你可以提供這個參數。但在ConfidentialClientApplication
蠻常用的(吧)。
App依照不同的情境會有的python方法
- Authorization Code Flow
get_authorization_request_url()
: 此方法返回一個 URL,應用程式可以引導用戶前往此 URL 以獲得授權碼。acquire_token_by_authorization_code()
: 當用戶返回並帶回授權碼時,此方法可以將授權碼交換為令牌。
此流程主要用於 Web 應用程式,允許伺服器端的 Web 應用程式代表用戶獲取 Access Token 和 ID Token。這需要用戶在瀏覽器中互動以獲得授權碼,然後應用程式可以將此授權碼交換為令牌。
- Device Code Flow
initiate_device_flow()
: 此方法初始化設備碼流程並返回一個包含設備碼和相應 URL 的字典。acquire_token_by_device_flow()
: 應用程式需要定期呼叫此方法以檢查用戶是否已在瀏覽器中完成授權。
此流程適用於沒有瀏覽器或僅限文字輸入的設備(例如,智能電視或 IoT 設備)。在此流程中,設備將顯示一個設備碼和 URL,用戶需要在另一台有瀏覽器的設備上輸入這些信息以完成授權。
- Refresh Token Flow
acquire_token_silent()
: 此方法使用在先前的授權過程中獲得的 Refresh Token 來獲得新的 Access Token。如果成功,此方法將返回新的 Access Token;否則,將引發一個例外,此時可能需要重新引導用戶進行互動授權。
此流程允許應用程式使用 Refresh Token 獲得新的 Access Token。當 Access Token 過期時,此流程可以在無需用戶互動的情況下獲得新的 Access Token。
- Client Credentials Flow
acquire_token_for_client()
: 此方法使用應用程式的client_id
和client_credential
來獲得 Access Token。
此流程允許應用程式以其自身的身份(而不是代表用戶)來獲取 Access Token。此流程適用於僅需要 App-only access 的應用程式。
- Resource Owner Password Credentials Flow
- acquire_token_by_username_password(username, password, scopes)
使用用戶的帳號密碼來登入,通常只能用在學校或租戶的帳號
以上是幾種常見流程中的一些主要方法,每種流程在實際使用時都需要相應的權限設定和用戶同意(如果涉及用戶)。而且,每種方法在呼叫時都可能需要提供其他一些參數,例如你希望獲取的權限範疇(scope)等。具體詳情可以參考 MSAL 的文檔。
Code 範例:fastAPI + Authorization code flow
這是一個用msal取得token的範例
程式碼大致結構
我們先將程式碼分成兩個route
- ”login”:取得microsoft的登入介面(url)
- “callback”:登入結束之後,microsoft會傳code到我們建立的callback,我們在callback藉由code取得token
login:
- A: 把需要用的參數設定在config字典裡面
- B: 建立一個publicClientApp
- C: 使用get_authorization_request_url取得url
- D: 把url給user
callback: (可以接收str: code)
- E: 同A
- F: 同B
- G: acquire_token_by_authorization_code 取得token本人
當然,以下把一些run的程式碼省略了,請不要直接貼上和執行謝謝
想要套件等等的請把程式碼貼上跟gpt要,不然下面會很亂:)
GraphAPI本人
簡介
- Facebook 的 Graph API:
Facebook 的 Graph API 是他們核心的一部分,它允許開發者讀取、寫入和修改 Facebook 社交圖表的數據。在這裡,社交圖表基本上是指的 Facebook 的全球社交連結網絡,包括用戶(人)、他們分享的內容(例如照片、影片)、地點、應用程式、以及他們之間的各種關聯(例如朋友關係、分享行為、評論等)。
Graph API 提供了一種統一的視角來查看所有的數據,無論是個人的狀態更新、照片,還是公共頁面的貼文。開發者可以使用此 API 來建立與 Facebook 數據深度交互的應用程式,例如擷取用戶資訊、發布內容以及對已存在的數據進行更多操作。
- Microsoft Graph API:
Microsoft Graph API 是微軟 365 的連接點,提供一個統一的可程式化的訪問點,以訪問 Microsoft 365 中的數據,包括但不限於 Office 365、Enterprise Mobility and Security、Windows 10,以及更多其他的微軟雲服務。簡單來說,Microsoft Graph API 是微軟雲的 API。
它提供了一個一致的模型來訪問豐富的數據和關係,包括用戶、郵件、日曆、聯繫人、任務、設備等等。開發者可以用這個 API 來建立對 Microsoft 365 數據進行各種操作的應用程式,比如自動化工作流程、分析數據、集成系統等等。
當然,我們這邊是要用Microsoft的Graph API
基本上呼叫GraphAPI都用request的方式,我們通常會呼叫以下的網址,還有設定header
詳細功能要繼續往下看
試用GraphAPI: Graph Explorer
它主要是可以快速的試用並了解Graph API的能力
常見功能
Microsoft Graph API 提供了許多功能,可讓開發者讀取和寫入到 Microsoft 365 的各種資源中。以下是一些主要的功能:
- 使用者和群組: 你可以管理使用者和群組,包括創建、讀取、更新和刪除使用者或群組的信息。例如,你可以讀取使用者的郵件,或者更新使用者的個人資訊。
- 郵件和日曆: 你可以管理使用者的郵件和日曆。例如,你可以讀取、創建、發送郵件,或者讀取、創建、更新和刪除日曆項目。
- OneDrive 和 SharePoint 文件: 你可以讀取、創建、更新和刪除 OneDrive 和 SharePoint 中的文件和文件夾。
- Teams: 你可以管理 Teams 中的頻道和訊息,包括讀取、創建、更新和刪除頻道或訊息。
在發送到 Microsoft Graph API 的請求中,除了 'Authorization' 頭部,還可以添加一些其他的頭部以使用更多的功能。例如:
- Content-Type: 當你發送一個包含 JSON 內容的 POST 或 PUT 請求時,你需要添加一個 'Content-Type' 頭部並將其值設置為 'application/json'。
- ConsistencyLevel: 當你需要進行需要一致性保證的複雜查詢時,你可以添加一個 'ConsistencyLevel' 頭部並將其值設置為 'eventual'。
- Prefer: 當你想控制某些操作的行為時,你可以添加一個 'Prefer' 頭部。例如,當你創建一個新的資源時,你可以添加 'Prefer: return=representation' 頭部來要求服務器在回應中返回新創建的資源。
- If-Match: 當你更新或刪除一個資源時,你可以添加一個 'If-Match' 頭部來提供資源的當前版本。這可以防止你覆蓋其他人剛剛做的更新。
這些只是一些基本的功能和頭部,實際上 Microsoft Graph API 提供了更多的功能和選項。你可以查看官方的文件來獲得更詳細的信息。
針對抓取mail相關訊息的方法

Graph API 是 Microsoft 365 的統一程式設計接口,它提供開發者訪問、分享和處理 Microsoft 365 中的資料,包含郵件 (Outlook)、日曆、聯絡人、任務等等。以下我會針對你提到的郵件相關功能做介紹:
- Overview:這部分提供對於郵件 API 的總體理解, 描述了可以透過 API 實現的主要功能(如閱讀、發送郵件等)。
- Message:Message 端點可以讓開發者讀取、創建、更新和刪除郵件。 你可以在 Message 物件中設定一些內容,比如收件人,主題,郵件正文等等。
- Attachment:Attachment 端點提供了對郵件附件的操作。 你可以添加、查看、刪除郵件的附件。
- Category:這允許你為郵件添加類別,方便後續查找和管理。
- Focused Inbox:Focused Inbox 是 Outlook 的一個特性,可以將重要的郵件過濾出來。 透過 API,你可以控制哪些郵件出現在 Focused Inbox 中。
- Mail folder:Mail folder 端點允許開發者操作郵箱的資料夾, 包括創建、刪除、重命名資料夾等等。
- Mail search folder:這允許你創建搜索資料夾, 將符合特定條件的郵件自動添加到這個資料夾。
- Rule:規則可以讓你自動處理特定的郵件。 比如說,你可以創建一條規則,將所有主題包含 "invoice" 的郵件移動到特定的資料夾。
- Extended properties:這提供了一種擴展 Message 物件的方式, 可以添加額外的、自定義的屬性。
message/ List messages
params
當你向 "https://graph.microsoft.com/v1.0/me/mailfolders/inbox/messages" 發送 GET 請求時,這個請求將返回你的收件箱中的郵件。除了在 'Authorization' 頭部添加訪問權杖外,你還可以添加以下一些參數和頭部以獲得更多的控制和功能:
- $top: 這個查詢參數可以用來限制返回的郵件數量。例如,?$top=10 將只返回前 10 封郵件。
- $skip: 這個查詢參數可以用來跳過一定數量的郵件。例如,?$skip=10 將跳過前 10 封郵件。
- $filter: 這個查詢參數可以用來過濾郵件。例如,?$filter=from/emailAddress/address eq 'johndoe@example.com' 將只返回來自 johndoe@example.com 的郵件。
- $orderBy: 這個查詢參數可以用來排序郵件。例如,?$orderBy=receivedDateTime desc 將按照收到的時間降序排序郵件。
- $select: 這個查詢參數可以用來選擇返回的欄位。例如,?$select=subject,receivedDateTime 將只返回每封郵件的主題和收到的時間。
- Prefer: outlook.body-content-type="text": 這個頭部可以用來控制返回的郵件正文的格式。如果你添加這個頭部並將其值設置為 "text",則郵件正文將以純文本格式返回。如果你將其值設置為 "html",則郵件正文將以 HTML 格式返回。
這些只是一些基本的參數和頭部,實際上你可以添加更多的參數和頭部以獲得更多的功能。具體的參數和頭部取決於你的需求和使用的具體 API。你可以查看 Microsoft Graph API 的官方文件來獲得更詳細的信息。
response.json()的長相
抓特定message
詳細回傳內容
message/ List attachments
Attachment/Get attachment
- 作者:Q蛇
- 链接:/article/f8cf4d87-af4e-4f23-be55-1045956e37e2
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。