0x00 引言
在前兩天的 Apache CommunityOverCode Asia 2024 大會上認識到了一個很有意思的專案:Apache Answer
。這是一個 Apache
開源問答社群系統,可以幫助開發者在社群中快速找到答案。嘗試為這個專案做一些貢獻,整理一下開發筆記。
領取的任務: incubator-answer-plugins | Lark Notification Support #76
0x01 設計
社群透過建立一個飛書組織並在其中新增一個機器人,將機器人的 Webhook
地址配置到機器人中。當社群中有新的問題或回答時,外掛會透過飛書機器人通知使用者。
由於 Answer
外掛機制的限制沒有辦法申請一個路由來接收飛書的訊息回撥實現對使用者進行繫結,只能夠實現接收通知事件方法,在方法中也只能獲取到使用者和系統的配置,其它的資訊都無法獲取。
因此設計了兩個版本的外掛,殘缺版需要使用者自己建立一個飛書應用,透過應用反饋拿到自己的使用者ID以後配置到外掛中。完整版則是網站管理員配置好以後使用者只需要繫結自己的賬戶然後在使用者設定中啟用通知即可。
如何獲取自己的 Open ID?
訊息的形式上選擇使用卡片訊息
下面為完整版設計
繫結:
通知:
配置項需要資料
系統配置項
配置項 | 資料型別 | 描述 |
---|---|---|
飛書機器人 App ID |
string |
飛書機器人的 Webhook 地址 |
飛書機器人 App Secret |
string |
飛書機器人的 Token |
使用者配置項
配置項 | 資料型別 | 描述 |
---|---|---|
飛書使用者 ID | string |
飛書使用者的 OpenID 只寫 |
收件箱通知 | bool |
是否開啟收件箱通知 |
新問題通知 | bool |
是否開啟新問題通知 |
關注標籤的新問題通知 | bool |
是否開啟關注標籤的新問題通知 |
許可權列表
許可權ID | 許可權名稱 | 描述 |
---|---|---|
im:message |
獲取與傳送單聊、群組訊息 | 獲取與傳送單聊、群組訊息` |
0x02 賬戶繫結
先註冊一個飛書機器人,這裡不過多贅述,可以參考官方文件。
由於飛書當前公開版本的 OAuth2
授權是非標導致無法使用倉庫中已有的 OAuth2 Basic 外掛
飛書OAuth2 介面文件 中可以看到編碼方式不是
application/x-www-form-urlencoded
而是application/json
。
透過朋友瞭解到飛書已經在內測標準介面了,拿到內測介面測試了下可以登入,免去再開發個飛書登入外掛的問題。
考慮到飛書需要設定 Webhook
來向 Answer
外掛傳送訊息需要把開發環境暴露到公網上。
整個開發環境訪問鏈路如下
由於域名是解析到 Cloudflare 上的,所以阿里雲伺服器沒辦法透過 acme.sh
自動續簽證書,所以只能手動設定證書,可以參考 Cloudflare
的 加密CloudFlare 與您源伺服器之間的流量 獲取證書。阿里雲伺服器配置如下
demo.domain.com {
tls cert.pem cert.key
reverse_proxy http://192.168.3.x:3000
}
WireGuard
在之前的文章中有過介紹可以參考下。
根據官方文件建立一個外掛,需要注意開發時外掛的包名需要在三個地方相同
// cmd/answer/main.go
import (
_ "github.com/apache/incubator-answer-plugins/notification-lark" // 引入外掛
answercmd "github.com/apache/incubator-answer/cmd"
)
// ui/src/plugins/notification-lark/go.mod
module github.com/apache/incubator-answer-plugins/notification-lark
// go.mod
replace github.com/apache/incubator-answer-plugins/notification-lark => ./ui/src/plugins/notification-lark