Teams Bot如何判斷用戶所在的時區

一說到時間,就會聯想到時區,夏令時等頭痛的問題,不同國家有不同國家的規定。如果你希望你的Teams Bot可以判斷出當前用戶所在的時區,從而可以針對性的進行一些處理時,你要做好心理準備,這個複雜程度遠遠超過你的想象。因爲一個用戶這次在一個時區內登入Teams,下一次可能就在另一個時區了。

好消息是Teams已經幫我們做了很多事情,當Teams發送請求到我們的Bot時,payload裏已經帶了一些時間信息。我在我之前的一篇文章中也提到過。下面是一個標準的request body

{
    "name": "composeExtension/fetchTask",
    "type": "invoke",
    "timestamp": "2019-06-17T14:32:04.956Z",
    "localTimestamp": "2019-06-18T00:32:04.956+10:00",
    "id": "f:1361493733941541435",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/apac/",
    "from": { },
    "conversation": {
        "isGroup": true,
        "conversationType": "channel",
        "tenantId": "aece5000-341d-493a-841d-f67e417f1447",
        "id": "19:[email protected]"
    },
    "recipient": { },
    "entities": [
        {
            "locale": "en-US",
            "country": "US",
            "platform": "Windows",
            "type": "clientInfo"
        }
    ],
    "channelData": { },
    "value": {
        "commandId": "start",
        "commandContext": "compose",
        "context": {
            "theme": "default"
        }
    },
    "locale": "en-US"
}

上面這個payload裏有兩個關鍵的時間信息:

  • timestamp:當前的UTC時間
  • localTimestamp:當前用戶所在的他/她的本地時間,加號後面的小時數針對UTC時間的offset

所以你的bot就知道了這個用戶當前所在的時區和UTC相差多少。要注意我有兩個重要點:

  • “當前”。 我前面已經提到過,用戶的所在地會變化,Teams告訴bot的是此時此刻的用戶信息
  • “所在的時區和UTC相差多少”。這裏說的並不是時區(timezone),爲什麼這麼說?我們舉個例子:假設現在是UTC時間0點0分0秒,用戶A在UTC+11的時區,那TA的時間是11:00am,另一個用戶B在UTC+10時區,但TA所在國家正好在經歷夏令時,所以B的時間也是11:00am。在這兩種情況下,Teams對於用戶A和用戶B發送給Bot的時間信息是一樣的。但是實際上他們在不同時區。

如果你看到這裏有點暈了,請回到上面這段再看一遍。如果你看懂了,那你會問:到底有沒有版本得到用戶所在的時區?我的目前的答案是沒有特別好的方法,但是Graph API有一個取巧的方法。

Graph API包含了Outlook api,我們使用下面這個api:

GET https://graph.microsoft.com/beta/users/{id|userPrincipalName}/mailboxSettings

我們看一下它返回什麼內容

{
  "@odata.context": "https://graph.microsoft.com/beta/$metadata#users('48d31887-5fad-4d73-a9f5-3c356e68a038')/mailboxSettings",
  "archiveFolder": "AAMkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OAAuAAAAAAAiQ8W967B7TKBjgx9rVEURAQAiIsqMbYjsT5e-T7KzowPTAAAAAAFNAAA=",
  "timeZone": "Pacific Standard Time",
  "dateFormat": "M/d/yyyy",
  "timeFormat": "h:mm tt",
  "automaticRepliesSetting": {
    "status": "disabled",
    "externalAudience": "all",
    "internalReplyMessage": "",
    "externalReplyMessage": "",
    "scheduledStartDateTime": {
      "dateTime": "2019-10-05T12:00:00.0000000",
      "timeZone": "UTC"
    },
    "scheduledEndDateTime": {
      "dateTime": "2019-10-06T12:00:00.0000000",
      "timeZone": "UTC"
    }
  },
  "language": {
    "locale": "en-US",
    "displayName": "English (United States)"
  },
  "workingHours": {
    "daysOfWeek": [
      "monday",
      "tuesday",
      "wednesday",
      "thursday",
      "friday"
    ],
    "startTime": "08:00:00.0000000",
    "endTime": "17:00:00.0000000",
    "timeZone": {
      "name": "Pacific Standard Time"
    }
  }
}

是不是很強大?不旦旦有timezone信息,還有日期時間顯示格式的偏好。還有工作日信息,不同國家對工作日的定義是不同的。還有標準工作時間的信息,不同公司對上下班時間的設置也會不同。

當然,使用Graph API並不是沒有代價的,這個需要用戶做額外的授權,不過Teams產品團隊表示,以後會把對Graph API的授權和Teams app合在一起,這樣用戶在安裝teams app的時候就同時完成了授權。期待這天早點到來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章