懶人日記 — 不開啟 Slack 發送指令

帶大家看看我如何一步步實現不開啟 Slack 來發送指令的過程

Jeremy Xue
Jeremy Xue ‘s Blog
9 min readApr 14, 2020

--

Photo by NeONBRAND on Unsplash

前情提要:

為什麼我想做這件莫名其妙的事情呢?

因為好想工作室其實是有保全系統的,來工作室的第一個人必須要先解鎖保全系統後才能夠進行感應開門的動作,而工作室的 Host — Howard 大大為了讓大家方便解鎖保全系統,所以在 Slack 上做了一個指令,類似於 /door open 或是 /door close 的指令,讓大家可以透過 Slack 指令解鎖門禁系統,但是這個指令必須在特殊的頻道中使用才有效果。

而因為最近調整作息的因素,所以都特別早前往工作室,所以我必須當這個第一個開門(解鎖)的角色。平常可能沒有什麼感覺,但是日復一日的打著這個指令又稍嫌麻煩,而如果當天手拿著大包小包的東西,單手使用手機又特別難解鎖。因此,我就在思考有什麼方式可以不用再打指令,最好是按一下就直接解鎖了。

⚠️
但要注意相關指令的使用,有些指令暴露出來可能有潛在危險,
像是解鎖就是一個蠻危險的指令,即使他無法開門。

‣ 預期目標:

我預期如果非必要的話我希望不要寫 iOS APP,因為想要各種平台都有辦法使用(而且 iOS 在打包方面有點麻煩 QQ)。所以,我希望結果會是一串網址,並且可以轉成用 Safari 加入到主畫面,讓大家能夠透過網址的方式發送指令來解鎖,所以我下面研究的方法主要都為網址相關的方式。

▸ 實現過程:

‣ 第一次嘗試 DeepLink & URLScheme:

一開始沒想太多,想說有沒有方法能讓 Slack 開啟指定的門禁頻道,並且輸入解鎖指令這樣,因此就來爬了一下 Slack 的 Deep linking into Slack 文件:

基本上我們已知透過瀏覽器在網址輸入 slack:// 就能開啟 slack,接著我們看看哪個方式可以打開特定的頻道:

OH,這個方法看起來非常適合我們,我們可以透過 team 和 id 參數來開啟特定的頻道,而如果不知道 TEAM_ID 和 CHANNEL_ID 是什麼,可以開啟網頁版的 Slack,並且與我下面這串網址對應就知道了:

所以我們應該只需要打出 slack://channel?team=TEAM_ID&id=CHANNEL_ID 就能夠開啟特定 workspace 的 channel 了。(各位讀者可以試試看)

後來在查詢這個 deeplink 是否支援文字相關的 query 的時候,發現 Slack 的 deeplink 好像沒有支援這種輸入文字或指令的服務。如此一來,我就只能單純打開 Slack 的特定頻道而已 😭

但在 Google 的時候發到有人說 Slack 文件中有 API methods,而其中有一支 API 可以發送訊息到特定頻道,因此又燃起了一線生機。

▸ Slack API methods — chat.postMessage

看到這個 chat.postMessage 方法後,看起來有辦法讓我們實現發訊息到某個頻道中,而且也有許多 arguments 可以作為使用。而 Slack 也很貼心的在 Documentation 旁邊有 Tester 區塊,你可以直接透過 Tester 來測試發送的 API。要注意到他有幾個是 required 的 arguments,必須都要帶上才能正確提交請求:

再發送出訊息後,你應該可以在最下面的 URL 區域看見這次發送請求的 URL,而我們之後就可以單純透過這段網址發送這次的測試訊息。

而有趣的是你可以帶上幾個參數讓這次的訊息變得更有趣,像是下列這個訊息我就是多帶上 icon_emoji, as_user, username 之後輸出的結果:

接著重頭戲到了,讓我們來輸入一個 Slack 常見的指令 /who 看看:

Oh my God… 看來 Slack 是把它當作一段文字訊息再發送而不是指令,接著我又到 arguments 中找來找去,看有沒有一個參數是把文字轉為指令的參數。後來發現在查詢時好像再次碰壁了,因為 chat.postMessage 只能單純發送文字訊息。悲劇 QQ,只好再次找 Google 大神取暖。

▸ Slack API methods — chat.command

後來在 Google 的時候發現有人提到 chat.command 這個指令,但我在 Slack 的 API 文件中卻沒看到這個方法,直到後來在某個 Github 中,找到了它:

看起來這個 Github 連結中是收集一些 Slack 沒有紀錄的非官方的 API 方法。而其中我們也找到我們所需的 chat.command 指令,而他的描述看起來就非常能夠符合我們預期的結果。

This method executes a slash command in a public channel. 👍🏻

而其中 tokenchannel 參數就不多解釋了,而這邊特別的是有 commandtext 參數:

  • command:為 required 參數。此參數為要執行的斜槓指令,必需要加上 / 斜槓。
  • text:為 optional 參數,此參數是要提供給 slash 命令的其他參數。

因此,讓我們來隨便試試看一個指令吧,我們來試試看剛剛的 /who 指令:

我們可以在 response 中看見我們下指令後的結果,接著讓我們換個可以帶上 text 參數的指令看看吧,我們測試 /me Hello, world

如此一來,我們解鎖所需的 URL 就完成了,基本上我們把這段網址貼到網頁上就能夠送出我們的請求了,大致上的樣子如下:

▸ 添加到手機桌面

接著我們用 Safari 打開,並在上面新增輸入發送指令的網址,你應該可以看到以下結果:

接著我們按下中間的分享按鈕,開啟後選擇 Add to Home Screen

接著我們就可以將這個 Safari 開啟的網址存成類似於一個 APP。你可以把這個東西想像成一個書籤,你可以藉由加入主畫面作為捷徑來開啟網頁。

Tada 🎉,完成啦!你現在已經可以用桌面捷徑的方式發送 Slack 指令了!

後記:

⚠️
後來也發現這個方式蠻危險的,只要被獲取這個網址,對方就有辦法解鎖保全,雖然還是沒辦法開門就是了,但是還是有許多淺藏的危險

其實後來回頭來看這個過程真的是蠻有趣的,雖然不是什麼特別困難的事情,就當作個日記記錄一下。但是第一次沒有寫任何程式碼做出一個自己想要的功能還真的是蠻有成就感的 🥰,然後這個功能又是很常會使用到的。也是第一次覺得工程師懶還要更懶的想法,果然科技來自於人性

附上一個之前覺得很有趣的工程師的報導,先不管其真實性,但真的感覺到工程師們真的是越懶越強 xDD

--

--

Jeremy Xue
Jeremy Xue ‘s Blog

Hi, I’m Jeremy. [好想工作室 — iOS Developer]