Teams Bot如何判断用户所在的时区
一說(shuō)到時(shí)間,就會(huì)聯(lián)想到時(shí)區(qū),夏令時(shí)等頭痛的問(wèn)題,不同國(guó)家有不同國(guó)家的規(guī)定。如果你希望你的Teams Bot可以判斷出當(dāng)前用戶(hù)所在的時(shí)區(qū),從而可以針對(duì)性的進(jìn)行一些處理時(shí),你要做好心理準(zhǔn)備,這個(gè)復(fù)雜程度遠(yuǎn)遠(yuǎn)超過(guò)你的想象。因?yàn)橐粋€(gè)用戶(hù)這次在一個(gè)時(shí)區(qū)內(nèi)登入Teams,下一次可能就在另一個(gè)時(shí)區(qū)了。
好消息是Teams已經(jīng)幫我們做了很多事情,當(dāng)Teams發(fā)送請(qǐng)求到我們的Bot時(shí),payload里已經(jīng)帶了一些時(shí)間信息。我在我之前的一篇文章中也提到過(guò)。下面是一個(gè)標(biāo)準(zhǔn)的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:bf1cbc367561473db0c3fe762c11b508@thread.skype"},"recipient": { },"entities": [{"locale": "en-US","country": "US","platform": "Windows","type": "clientInfo"}],"channelData": { },"value": {"commandId": "start","commandContext": "compose","context": {"theme": "default"}},"locale": "en-US" }上面這個(gè)payload里有兩個(gè)關(guān)鍵的時(shí)間信息:
- timestamp:當(dāng)前的UTC時(shí)間
- localTimestamp:當(dāng)前用戶(hù)所在的他/她的本地時(shí)間,加號(hào)后面的小時(shí)數(shù)針對(duì)UTC時(shí)間的offset
所以你的bot就知道了這個(gè)用戶(hù)當(dāng)前所在的時(shí)區(qū)和UTC相差多少。要注意我有兩個(gè)重要點(diǎn):
- “當(dāng)前”。 我前面已經(jīng)提到過(guò),用戶(hù)的所在地會(huì)變化,Teams告訴bot的是此時(shí)此刻的用戶(hù)信息
- “所在的時(shí)區(qū)和UTC相差多少”。這里說(shuō)的并不是時(shí)區(qū)(timezone),為什么這么說(shuō)?我們舉個(gè)例子:假設(shè)現(xiàn)在是UTC時(shí)間0點(diǎn)0分0秒,用戶(hù)A在UTC+11的時(shí)區(qū),那TA的時(shí)間是11:00am,另一個(gè)用戶(hù)B在UTC+10時(shí)區(qū),但TA所在國(guó)家正好在經(jīng)歷夏令時(shí),所以B的時(shí)間也是11:00am。在這兩種情況下,Teams對(duì)于用戶(hù)A和用戶(hù)B發(fā)送給Bot的時(shí)間信息是一樣的。但是實(shí)際上他們?cè)诓煌瑫r(shí)區(qū)。
如果你看到這里有點(diǎn)暈了,請(qǐng)回到上面這段再看一遍。如果你看懂了,那你會(huì)問(wèn):到底有沒(méi)有版本得到用戶(hù)所在的時(shí)區(qū)?我的目前的答案是沒(méi)有特別好的方法,但是Graph API有一個(gè)取巧的方法。
Graph API包含了Outlook api,我們使用下面這個(gè)api:
GET https://graph.microsoft.com/beta/users/{id|userPrincipalName}/mailboxSettings我們看一下它返回什么內(nèi)容
{"@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"}} }是不是很強(qiáng)大?不旦旦有timezone信息,還有日期時(shí)間顯示格式的偏好。還有工作日信息,不同國(guó)家對(duì)工作日的定義是不同的。還有標(biāo)準(zhǔn)工作時(shí)間的信息,不同公司對(duì)上下班時(shí)間的設(shè)置也會(huì)不同。
當(dāng)然,使用Graph API并不是沒(méi)有代價(jià)的,這個(gè)需要用戶(hù)做額外的授權(quán),不過(guò)Teams產(chǎn)品團(tuán)隊(duì)表示,以后會(huì)把對(duì)Graph API的授權(quán)和Teams app合在一起,這樣用戶(hù)在安裝teams app的時(shí)候就同時(shí)完成了授權(quán)。期待這天早點(diǎn)到來(lái)。
總結(jié)
以上是生活随笔為你收集整理的Teams Bot如何判断用户所在的时区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pom.xml 导入ojdbc6报错
- 下一篇: HTTP 协议中 Vary