皮丘Bot - 基于 Pichubot 开发的定制化QQ机器人

前言

这是基于 Pichubot 开发的QQ机器人,名为皮丘Bot。

写它是为了青年大学习。团组织每周有一次线上学习,成员学完要把完成截图发到 QQ 群,团支书要数谁交了谁没交。皮丘Bot 做的就是把这件事自动化:群里发截图就算完成,管理员在群里用指令或者在网页面板上查完成情况、改成员状态、看提交的截图。

功能:青年大学习管理系统

这个功能共有三个模块,分别为:

  • 网页面板

  • QQ群管理

  • 网络API

网页面板

在这个模块中,皮丘Bot会提供一个简单的网页面板,用于管理青年大学习系统。管理员登录后看到的是自己所在群的数据,面板顶部会提示「群 xxx 的管理员」。

面板有三个页面:

  • 完成情况:一条进度条和完成人数,下面是未完成人员名单,表格列出名称和 QQ,带分页
  • 成员编辑:维护本群参与大学习的成员列表
  • 截图查看:每个成员提交的截图,带姓名和 QQ,点开可以放大

该模块有响应式布局,对手机端适配。桌面端左侧是 el-aside 侧边菜单,手机端把侧边菜单藏起来,换成顶部的 headtable 组件。

image-20211129100954349

响应式布局仅需设置 el-aside 与 headtable 的 display 属性即可。

@media screen and (max-width: 768px) {
  .asidemenu {
    display: none;
  }
  .headmenu {
    display: visible;
  }
}

@media screen and (min-width: 768px) {
  .asidemenu {
    display: visible;
  }
  .headmenu {
    display: none;
  }
}

QQ群管理

image-20211126172117257

在这个模块中,皮丘Bot会接收到群消息,并将消息解析处理,这个功能是皮丘Bot的核心功能。

成员在群里发一张图片,皮丘Bot 就把这个人标记为本期已完成,回复「成功完成本期青年大学习」,并把收到的图片回显一遍,方便本人确认交对了图。

管理员用 !dxx 开头的指令管理:

指令 作用
!dxx cx 查询本次完成人数,并列出未完成的人
!dxx add @某人 把某人的状态设为完成
!dxx rem @某人 把某人的状态设为未完成
!dxx reset 重置本群本期的完成情况,下一期开始时用

网络API

网页面板采用的是前后端分离的模式,这个模块是用于提供网络API的。

面板每次请求都带 Bearer Token,服务端按 QQ 号存了一份登录时发的 token,收到请求后取出 Authorization 头做比对:

func verifyToken(qq string, token string) bool {
	if strings.HasPrefix(token, "Bearer") {
		if _, ok := Cookies[qq]; ok && Cookies[qq] == token[7:] {
			return true
		}
	}
	return false
}

前端开发时面板和 API 不在一个域下,API 的响应里要加上跨域头:

writer.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域
writer.Header().Set("Access-Control-Allow-Methods", "*")
writer.Header().Set("Access-Control-Allow-Headers", "*")

文档站是静态文件,直接用 http 包的 FileServer 挂出去:

// 将本地 "/doc" 路径下的文件绑定至 "www.xxx.com/" 下
http.Handle("/", http.FileServer(http.Dir("./doc")))

// 将本地 "/doc" 路径下的文件绑定至 "www.xxx.com/abc/" 下
http.Handle("/abc/", http.StripPrefix("/abc", http.FileServer(http.Dir("./doc"))))

评论

评论加载中…

输入关键词开始搜索。

选择Enter 打开Esc 关闭CtrlK 唤起