Apache Answer Plugin 開發筆記

Sonui發表於2024-08-07

0x00 引言

在前兩天的 Apache CommunityOverCode Asia 2024 大會上認識到了一個很有意思的專案:Apache Answer。這是一個 Apache 開源問答社群系統,可以幫助開發者在社群中快速找到答案。嘗試為這個專案做一些貢獻,整理一下開發筆記。

領取的任務: incubator-answer-plugins | Lark Notification Support #76

0x01 設計

社群透過建立一個飛書組織並在其中新增一個機器人,將機器人的 Webhook 地址配置到機器人中。當社群中有新的問題或回答時,外掛會透過飛書機器人通知使用者。

由於 Answer 外掛機制的限制沒有辦法申請一個路由來接收飛書的訊息回撥實現對使用者進行繫結,只能夠實現接收通知事件方法,在方法中也只能獲取到使用者和系統的配置,其它的資訊都無法獲取。

因此設計了兩個版本的外掛,殘缺版需要使用者自己建立一個飛書應用,透過應用反饋拿到自己的使用者ID以後配置到外掛中。完整版則是網站管理員配置好以後使用者只需要繫結自己的賬戶然後在使用者設定中啟用通知即可。

如何獲取自己的 Open ID?

訊息的形式上選擇使用卡片訊息

card demo

下面為完整版設計

繫結:

graph LR A[飛書使用者] --OAuth2--> B[社群] --BindURL--> C[飛書機器人] D[社群使用者] --BindURL--> C

通知:

graph LR A[收件箱] --WebHook--> B[飛書機器人] --Message--> C[使用者] D[所有新問題通知] --WebHook--> B E[關注標籤的新問題通知] --WebHook--> B

配置項需要資料

系統配置項

配置項 資料型別 描述
飛書機器人 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 外掛傳送訊息需要把開發環境暴露到公網上。

整個開發環境訪問鏈路如下

graph LR A[飛書伺服器] --webhook--> B[demo.domain.com] --Cloudflare--> C[阿里雲伺服器] --WireGuard--> D[本地開發環境]

由於域名是解析到 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

相關文章