前言
通过Microsoft Identity Platform获取访问令牌之后,就可以在http头部添加Authorization,调用Microsoft Graph API去操作用户的outlook日历了。
其实各种请求的说明还是官方API文档比较详细,比如outlook事件的获取,附上连接 Microsoft Graph API 日历事件获取
这里只是总结以下开发时的一些注意点,主要有以下方面:
- 获取用户outlook日历事件(增删改查)
- 获取用户事件颜色设定
- 共享会议与个人事件
先看下实现效果
一些共通的代码先放前面
// 标准化返回值
class ResponseInfo {
constructor(status, data,msg) {
this.status = status;
this.data = data;
this.msg = msg;
}
}
// 用access Token注册 Graph client
function getAuthenticatedClient(accessToken) {
// Initialize Graph client
const client = graph.Client.init({
// Use the provided access token to authenticate
// requests
authProvider: (done) => {
done(null, accessToken);
}
});
return client;
}
一,获取用户outlook日历事件(增删改查)
首先要提醒一下outlook日历下面的事件和日历是不同的,主要区别在于重复的事件,比如每天早会,通过日历视图能取得重复的事件信息,但是通过事件取得的话,只能取得一条最初的重复事件数据。
通过日历视图取得事件的话需要指定开始和结束的时间范围,而通过event取事件的话不需要指定时间范围。这里是通过event取得事件的例子。
/**
* 获取用户events
*
* @param {*} accessToken 访问令牌
* @param {*} userPrincipalName 用户的微软账号(邮箱)
*/
getUserEvents : async function(accessToken,userPrincipalName){
try{
const client = getAuthenticatedClient(accessToken);
// timeZone:时区 默认是 Pacific Standard Time
let result = await client.api(`/users/${userPrincipalName}/events`)
.header('Prefer',`outlook.timezone="${timeZone}"`)
.get();
//console.log(result.value);
let response = new ResponseInfo(200,result.value,'');
return response;
}catch(errror) {
let response = new ResponseInfo(400,'',error);
return response;
}
},
/**
* 删除用户events
*
* @param {*} accessToken 访问令牌
* @param {*} userPrincipalName 用户的微软账号(邮箱)
* @param {*} eventsId event ID
* @returns
*/
delUserEvents : async function (accessToken, userPrincipalName, eventsId) {
try{
const client = getAuthenticatedClient(accessToken);
let result = await client.api(`/users/${userPrincipalName}/events/${eventsId}`)
.delete();
let response = new ResponseInfo(200,result,'');
return response;
}catch(errror) {
let response = new ResponseInfo(400,'',error);
return response;
}
},
/**
* 新增用户events
*
* @param {*} accessToken 访问令牌
* @param {*} userPrincipalName 用户的微软账号(邮箱)
* @param {*} newEvent event
* @returns
*/
setUserNewEvent : async function (accessToken,userPrincipalName,newEvent){
try{
const client = getAuthenticatedClient(accessToken);
//POST /users/{id | userPrincipalName}/events
let result = await client.api(`/users/${userPrincipalName}/events`)
.header('Prefer',`outlook.timezone="${timeZone}"`)
.post(newEvent);
let response = new ResponseInfo(200,result,'');
return response;
}catch(errror) {
let response = new ResponseInfo(400,'',error);
return response;
}
},
新增的时候event所需基本的格式如下
// timeZone:时区
const newEvent = {
subject: “件名”,
start: {
dateTime: “开始时间(UTC格式)”,
timeZone: timeZone
},
end: {
dateTime: “结束时间(UTC格式)”,
timeZone: timeZone
},
body: {
contentType: 'HTML',
content: “event内容”
},
location:{
displayName: “地点”
},
attendees:{},
};
二,获取用户事件颜色设定
这里需要注意,如果是通过用户认证的话,即使是管理员也只能读取自己的类别设定,无法读取认证用户之外成员的类别设定,但是通过无用户认证,也就是client Secret认证的话,才可以访问所有用户的类别设定。
而且这里取得类别只是一下形式,没有具体的颜色信息,比如官方API放回例子如下。
写代码的时候取色了一下,不过后面没用到,应该是分别对应以下颜色:
类别 | 颜色 |
preset0 | #FFFF14 |
preset1 | #FF8C00 |
preset2 | #FECB6F |
preset3 | #FFF100 |
preset4 | #5FBE7D |
preset5 | #33BAB1 |
preset6 | #A3B367 |
preset7 | #55ABE5 |
preset8 | #A895E2 |
preset9 | #E48BB5 |
preset10 | #B9C0CB |
preset11 | #4C596E |
preset12 | #ABABAB |
preset13 | #666666 |
preset14 | #474747 |
preset15 | #910A19 |
preset16 | #CE4B28 |
preset17 | #A47332 |
preset18 | #B0A923 |
preset19 | #026802 |
preset20 | #1C6367 |
preset21 | #5C6A22 |
preset22 | #254069 |
preset23 | #562685 |
preset24 | #80275D |
/**
* 用户事件类别取得
*
* @param {*} accessToken
* @param {*} userPrincipalName
*/
getUserMasterCategories : async function(accessToken,userPrincipalName) {
try{
const client = getAuthenticatedClient(accessToken);
let result =
await client.api(`/users/${userPrincipalName}/outlook/masterCategories`)
.get();
//console.log(result.value);
let response = new ResponseInfo(200,result.value,'');
return response;
}catch(errror) {
let response = new ResponseInfo(400,'',error);
return response;
}
},
三,共享会议与个人事件
在outlook日历里创建共享事件之后,共享给他人的话,会变成会议,这里暂时没有找到events里面是事件还是会议的区分标志位,所以只能暂时通过取得事件attendees来判断,但是在outlook上创建的个人事件里attendees里也包含自己本身,这个要注意,对于是否是通过别人共享过来的outlook事件,则有明显标志位organizer,所以这个可以明确判断。