企微群机器人
怎么说呢,之前学院集市的微信机器人挂了,我自己的微信被警告了两次,最后换了一个机器人。
qq 的稍微看了一下文档感觉挺简单的,如果以后有比较多的时间做一下。由于微信迁移到 qq 麻烦?最后选择了企微群机器人。
企微群机器人只有一个发送信息的功能,没有官方提供的接口获取聊天记录,不过对于信息提醒的话够了。
之后我写了一个更通用的企微群机器人,放在了这里
使用
企微群机器人的使用相当简单,只要给机器人的webhook地址发个POST请求就行了,没什么复杂的东西。
解耦
感觉这次的最大感受就是这个吧。最开始写的企微群机器人帖子的爬取和机器人联系还是比较紧密的,之后用接口解耦合了。
::: 之前的
type bot struct {
webhook string
postHandler post.PostHandler
templateStr string
}
type PostHandler interface {
Get(ctx context.Context) error
GetChan() *chan sseapi.Post
}
:::
之前我问 ai 接口应该什么时候用,它说同一种方法可能有多种实现的时候就需要用到接口,在这里还挺适合的。bot 实际需要的只有一个通道来获取需要发送的信息,信息怎么来的并不在意,于是我写了一个接口
type bot struct {
webhook string
infoHandlers []InfoHandler
messageChan chan string
cancelFunc context.CancelFunc
}
type InfoHandler interface {
GetChan chan string
}
为了之后可以更方便扩展,又把InfoHandler改成了Plugin
type Plugin interface {
PluginRequired
}
type PluginRequired interface {
GetChan() chan string
Name() string
}
type PluginRouteOption interface {
RegisterRoutes(r *gin.Engine) error
}
type PluginHandlerOption interface {
InitHandler() error
}
func verifyRegisterRoutes(p Plugin) bool {
_, ok := p.(PluginRouteOption)
return ok;
}
func verifyInitHandler(p Plugin) bool {
_, ok := p.(PluginHandlerOption)
return ok;
}
func RegisterPlugin(p Plugin){
handlers = append(handlers, p)
if verifyInitHandler(p) {
log.Println("init handler")
go func(){
err := p.(PluginHandlerOption).InitHandler()
if err != nil {
log.Println(err)
}
}()
}
if verifyRegisterRoutes(p) {
go func(){
err := p.(PluginRouteOption).RegisterRoutes(router.GetRouter())
if err != nil {
log.Println(err)
}
}()
}
}
func GetHandlers() []Plugin {
return handlers
}
原本我想做的是日程提醒,所以用了gin框架写个小后端,用来插入/删除日程安排,写了个注册路由。
这样的话,只要实现了Plugin接口,就可以添加插件了。不过还是有点问题,我是在插件.go里写init函数初始化的,这样子就得在main.go里导入这个包才能完成初始化
plugins/sse/sse.go
func init() {
sp := &SsePlugin{
PostChan: make(chan string),
}
plugins.RegisterPlugin(sp)
}
main.go
import (
_ "wx_assistant/plugins/sse"
)
还有一种方法是使用动态库,约定导出的变量名,把插件编译成.so文件,再在plugins.go里统一注册,这样就不用修改其它代码了。但是我搜的时候看到不同操作系统可能会有不同的现象,感觉不好把控,就没做了。
感觉插件注册的话可能python之类的语言会更简单一些,基本不用修改其它代码,只要写好自己的插件就行。
之后可能会写一点uniapp的东西。感觉我的文字好无趣,也许用ai渲染一下会好一点?