Apache Answer Plugin 开发笔记

news/2024/11/20 14:22:27/文章来源:https://www.cnblogs.com/sonui/p/18346240

0x00 引言

在前两天的 Apache CommunityOverCode Asia 2024 大会上认识到了一个很有意思的项目:Apache Answer。这是一个 Apache 开源问答社区系统,可以帮助开发者在社区中快速找到答案。尝试为这个项目做一些贡献,整理一下开发笔记。

领取的任务: incubator-answer-plugins | Lark Notification Support #76

0x01 设计

社区通过创建一个飞书组织并在其中添加一个机器人,将机器人的 Webhook 地址配置到机器人中。当社区中有新的问题或回答时,插件会通过飞书机器人通知用户。

由于 Answer 插件机制的限制没有办法申请一个路由来接收飞书的消息回调实现对用户进行绑定,只能够实现接收通知事件方法,在方法中也只能获取到用户和系统的配置,其它的信息都无法获取。

因此设计了两个版本的插件,残缺版需要用户自己创建一个飞书应用,通过应用反馈拿到自己的用户ID以后配置到插件中。完整版则是网站管理员配置好以后用户只需要绑定自己的账户然后在用户设置中启用通知即可。

如何获取自己的 Open ID?

消息的形式上选择使用卡片消息

card demo

下面为完整版设计

绑定:

graph LRA[飞书用户] --OAuth2--> B[社区] --BindURL--> C[飞书机器人]D[社区用户] --BindURL--> C

通知:

graph LRA[收件箱] --WebHook--> B[飞书机器人] --Message--> C[用户]D[所有新问题通知] --WebHook--> BE[关注标签的新问题通知] --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 LRA[飞书服务器] --webhook--> B[demo.domain.com] --Cloudflare--> C[阿里云服务器] --WireGuard--> D[本地开发环境]

由于域名是解析到 Cloudflare 上的,所以阿里云服务器没办法通过 acme.sh 自动续签证书,所以只能手动设置证书,可以参考 Cloudflare 的 加密CloudFlare 与您源服务器之间的流量 获取证书。阿里云服务器配置如下

demo.domain.com {tls cert.pem cert.keyreverse_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779025.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 暑假集训笔记

Day 1搜索 DFS: 基本思路:边界设置(if(...) return ;) 检查(for(....)) 标记结果(a[...]=...) 递归搜索(dfs(...)) 回溯例题: N皇后问题 [POJ 1321] 棋盘问题 [POJ 1011] Sticks BFS 略分治 基本思路将处理区间二分为两个区间(merge(l,mid) merge(mid+1,r)) 边界(if(l==r) r…

macbook开机登录时输入正确的密码却提示密码错误

背景 Macbook正常的账户登录,提示密码错误,但是我输入的密码确认了几次都是完全正确的,就是死活登不上去一直显示密码错误,一搜索原来是操作系统BUG,有对应解决方案。 原因 系统macOS Monterey 12.0.1设计的原因,导致有某些时刻可能忘记你的开机密码,导致你输入正确的密…

中信证券抓取(页码范围)

中信证券抓取(页码范围) 创建时间:2024年8月5日 一、完整代码 import re import requests from lxml import etreeheaders = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, } url1 = ht…

三国演义内容抓取(诗词名句网)

三国演义内容抓取(诗词名句网) 时间:2024-08-06 一、完整代码 import random import timeimport requests from lxml import etreefour_famous_novels = https://www.shicimingju.com/bookmark/sidamingzhu.html # 四大名著在线阅读地址 three_kingdoms = https://www.shic…

表情党抓取(单页) (网站已转移)

表情党抓取(单页) (网站已转移) 创建时间:2024-08-06 一、完整代码 import requests from lxml import etree url = https://qq.yh31.com/xq/wq/ header = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.…

腾牛网抓取(单页)

腾牛网抓取(单页) 创建时间:2024-08-05 一、完整代码 import requests from lxml import etree url = https://www.qqtn.com/wm/meinvtp_1.html header = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0…

抓取金投网文本数据(xpath练习)

抓取金投网文本数据(xpath练习) 创建时间:2024年8月5日 一、完整代码 import requests from lxml import etreeheader = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0 } …

IntersectionObserver + scrollIntoView 实现电梯导航

电梯导航也被称为锚点导航,当点击锚点元素时,页面内相应标记的元素滚动到视口。而且页面内元素滚动时相应锚点也会高亮。电梯导航一般把锚点放在左右两侧,类似电梯一样。常见的电梯导航效果如下,比如一些官方文档中:之前可能会用 getBoundingClientRect() 判断元素是否在视…

pthread_once导致死锁

在一个pthread_once方法内又再次调用了这个pthread_once导致死锁。分析下这个pthread_once的源码:可以看到这个pthread_once_t结构体就是一个整形数字加自旋锁。 int ___pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) {/* Fast path. See __pth…

1.3 功率电感选型----硬件设计指南(持续补充更新)

本系列文章是笔者总结多年工作经验,结合理论与实践进行整理备忘的笔记。希望能在帮助自己温习整理避免遗忘的同时,也能帮助其他需要参考的朋友。笔者会不定期进行查漏补缺。如有谬误,欢迎大家进行指正。 一、设计要点 1.电流降额建议按照1-10%-电感精度进行,主要设计参数是…

基于simulink的分布式发电系统自动重合闸的建模与仿真分析

1.课题概述在配电系统中,80%-90%的故障都是瞬时故障。发生故障时,线路被保护迅速断开,随即重合闸。当分布式电源接入配电网后,线路发生故障后重合闸,此时分布式电源没有跳离线路,这将产生两种潜在威胁,即非同期重合闸和故障点电弧重燃。非同期重合闸:当线路上发生故障,…

Windows10 安装编译后的 pysqlcipher3-1.2.1 基于 Python 3.8.10

Windows10 安装编译后的 pysqlcipher3-1.2.1 基于 Python 3.8.10 本文主要是将直接安装编译后的文件,不一定的成功,但是可以尝试使用,若无法直接安装,请参考编译过程,自行编译安装,编译过程见这里 安装 pysqlcipher3 这里用 32位 举例 因为 64位 安装完全相同,只需要把对…