惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
Spread Privacy
Spread Privacy
IT之家
IT之家
F
Fortinet All Blogs
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
月光博客
月光博客
WordPress大学
WordPress大学
V
Vulnerabilities – Threatpost
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
MyScale Blog
MyScale Blog
小众软件
小众软件
AI
AI
云风的 BLOG
云风的 BLOG
Jina AI
Jina AI
博客园 - 【当耐特】
T
Tailwind CSS Blog
Recorded Future
Recorded Future
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
Schneier on Security
Schneier on Security
Engineering at Meta
Engineering at Meta
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
T
The Exploit Database - CXSecurity.com
大猫的无限游戏
大猫的无限游戏
PCI Perspectives
PCI Perspectives
K
Kaspersky official blog
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Webroot Blog
Webroot Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
C
CERT Recently Published Vulnerability Notes
Security Latest
Security Latest
爱范儿
爱范儿
L
LangChain Blog
V
Visual Studio Blog
W
WeLiveSecurity
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
C
Cisco Blogs
H
Hackread – Cybersecurity News, Data Breaches, AI and More

吖远zzyの博客

记录一下豆包视频去水印的研究过程,以及fallback_api加密数据qAAB开头数据的解密。 | 吖远zzyの博客 解决华为开发者工具 DevEco Studio 登录跳转 localhost:10101 端口被阻止问题 | 吖远zzyの博客 微信小程序个人资质审核血泪史:踩坑,从反复被拒到神奇过审 | 吖远zzyの博客 如何实现公众号自动回复或做一个短视频无水印解析机器人? | 吖远zzyの博客 以后在手机上用 Termux 和 GitHub Actions 更新 Hexo 博客 | 吖远zzyの博客 必备!这款万能小程序能给抖音/豆包视频图集去除水印、还有有趣的测反应、玩成语模拟工具。 自制的一些免费API接口第二弹(获取QQ昵称、头像、抖音/豆包视频去水印等...) 告别原生导航栏:微信小程序自定义导航栏完美适配方案 在安卓手机上运行OpenClaw?当然可以,用Termux折腾OpenClaw安装QQ机器人的踩坑记录... | 吖远zzyの博客 个人开发工具之抖音直播录制工具:一款功能强大的Android直播录制应用 UniApp中Canvas绘图的易错点与踩坑指南 QQ频道机器人与UniApp开发:常见踩坑点与解决方案 UniApp中Canvas绘图不显示的常见问题与解决方案 Hexo博客实现随机文章功能的完整教程 QQ频道机器人Android客户端使用指南 | 吖远zzyの博客 2024年AI编程助手深度评测:哪款最适合你? uni-app地图定位踩坑记:地图功能和定位的那些坑 uni-app文件上传踩坑记:图片处理和上传全攻略 uni-app表单验证踩坑记:这些坑我替你踩过了 uni-app开发踩坑记录:新手必看的常见问题与解决方案 uni-app安全防护指南:构建可靠的跨端应用 uni-app性能优化指南:从加载到渲染的全方位提升 uni-app动画效果实战:从基础到高级的动画实现指南 uni-app组件开发实战:从基础到进阶的最佳实践 uni-app网络请求与缓存策略:构建高效的数据层 uni-app状态管理进阶:Vuex最佳实践与性能优化 uni-app路由与页面跳转:最佳实践与踩坑指南
安卓版QQ频道机器人APP客户端插件开发指南 | 吖远zzyの博客
吖远zzy · 2024-12-19 · via 吖远zzyの博客
  1. 1. 插件结构
  2. 2. API 说明
    1. 2.1. 1. 消息对象(message)
    2. 2.2. 2. 频道对象(channel)
    3. 2.3. 3. 上下文对象(context)
  3. 3. 插件功能界面预览
  4. 4. 消息处理流程
  5. 5. 权限处理
  6. 6. 最佳实践

安卓版QQ频道机器人APP客户端插件开发指南 0 次阅读

本文档将指导您如何为QQ频道机器人客户端开发插件。

插件结构

每个插件都是一个标准的 JavaScript 文件,需要导出一个包含以下字段的对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 插件对象
const plugin = {
// 基本信息(必需)
id: 'plugin-id', // 插件ID,只能包含小写字母、数字、下划线和横线
name: '插件名称', // 插件显示名称
description: '插件描述', // 插件功能描述
command: '/命令', // 触发命令,必须以/开头

// 基本信息(可选)
version: '1.0.0', // 插件版本号
author: '作者名称', // 插件作者
enabled: true, // 插件是否启用

// 配置项(可选)
config: {
// 插件的配置项
minPoints: 10, // 示例:最小积分
maxPoints: 100, // 示例:最大积分
},

// 数据存储(可选)
storage: {
// 插件的数据存储
records: new Map() // 示例:记录存储
},

// 消息处理函数(必需)
handler: async (message, channel, context) => {
// 返回值:
// - 字符串: 要发送的回复消息
// - null/undefined: 不发送回复
// - Promise<string>: 异步返回回复消息
return '回复消息'
}
}

// 导出插件
module.exports = plugin

API 说明

1. 消息对象(message)

消息对象包含了消息的完整信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
id: "消息ID",
channel_id: "频道ID",
guild_id: "服务器ID",
content: "消息内容",
cleanContent: "去除命令前缀的消息内容", // 新增:清理后的内容
timestamp: "2023-01-01T00:00:00.000Z",
status: "normal", // 消息状态: normal-正常, auditing-审核中, rejected-审核拒绝
author: {
id: "用户ID",
username: "用户名",
bot: false,
avatar: "头像URL"
},
member: {
roles: ["角色ID1", "角色ID2"],
joined_at: "加入时间"
},
mentions: [
{
id: "被@用户ID",
username: "被@用户名"
}
],
mention_everyone: false
}

2. 频道对象(channel)

频道对象包含了频道的基本信息:

1
2
3
4
5
6
7
8
9
10
{
id: "频道ID",
guild_id: "服务器ID",
name: "频道名称",
type: 0, // 频道类型
position: 1, // 显示位置
parent_id: "父频道ID",
owner_id: "创建者ID",
permissions: "权限值"
}

3. 上下文对象(context)

上下文对象提供了插件运行时的环境和工具:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
{
// 存储API - 持久化存储插件数据
storage: {
get: (key) => value, // 获取存储的值
set: (key, value) => void, // 设置存储的值
delete: (key) => void, // 删除存储的值
clear: () => void, // 清空存储
has: (key) => boolean // 检查键是否存在
},

// 配置API - 管理插件配置
config: {
get: (key) => value, // 获取配置项
set: (key, value) => void, // 设置配置项
},

// 日志API - 记录插件运行日志
log: {
info: (message, details) => void, // 记录信息日志
success: (message, details) => void, // 记录成功日志
warning: (message, details) => void, // 记录警告日志
error: (message, details) => void // 记录错误日志
},

// 工具API
api: {
// 发送消息
sendMessage: async (channelId, content, options) => {
// channelId: 频道ID
// content: 消息内容
// options: 可选参数
// - msg_id: 回复的消息ID
// - event_id: 事件ID
// 返回:
// - 成功: messageObject
// - 审核: { code: 304023, data: { message_audit: { audit_id: "xxx" } } }
return response
},

// 删除消息
deleteMessage: async (channelId, messageId) => {
// channelId: 频道ID
// messageId: 消息ID
return boolean
},

// 获取成员信息
getMember: async (guildId, userId) => {
// guildId: 服务器ID
// userId: 用户ID
return memberObject
},

// 获取服务器角色列表
getGuildRoles: async (guildId) => {
// guildId: 服务器ID
return rolesArray
},

// 检查权限
hasPermission: (permissions, permission) => {
// permissions: 权限值
// permission: 要检查的权限
return boolean
}
}
}

插件功能界面预览

插件功能界面

消息处理流程

  1. 消息接收

    • 系统接收到新消息时,会检查消息内容是否以配置的命令前缀开始
    • 解析出命令和参数
    • 查找所有匹配的已启用插件
  2. 插件执行

    • 对每个匹配的插件:
      • 创建独立的插件上下文对象
      • 调用插件的handler函数
      • 等待处理结果
    • 多个插件可以使用相同的命令
    • 插件按照加载顺序依次执行
    • 某个插件执行失败不会影响其他插件
  3. 响应处理

    • 每个插件的handler如果返回字符串,系统会自动发送响应消息
    • 每个响应都是独立的,会分别发送到频道
    • 发送的消息可能进入审核状态(code: 304023)
    • 审核通过或拒绝会触发相应的事件

权限处理

系统会自动计算机器人的权限:

  1. 管理员权限

    • 频道主
    • 管理员
    • 超级管理员
    • 子频道管理员
      拥有以上角色时自动获得所有权限(1099511627775)
  2. 普通权限

    • 根据角色的permissions值按位计算
    • 多个角色的权限值进行按位或运算
    • 可以使用api.hasPermission检查特定权限

最佳实践

  1. 错误处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    handler: async (message, channel, context) => {
    try {
    // 处理逻辑
    context.log.info('处理成功', { messageId: message.id })
    return '成功消息'
    } catch (error) {
    context.log.error('处理失败', { error, messageId: message.id })
    return '处理失败,请稍后重试'
    }
    }
  2. 数据持久化

    1
    2
    3
    4
    // 使用storage API保存数据
    const records = context.storage.get('records') || {}
    records[userId] = { /* 数据 */ }
    context.storage.set('records', records)
  3. 消息审核处理

    1
    2
    3
    4
    5
    6
    const response = await context.api.sendMessage(channelId, content)
    if (response.code === 304023) {
    context.log.info('消息进入审核', {
    auditId: response.data.message_audit.audit_id
    })
    }
  4. 权限检查

    1
    2
    3
    if (!context.api.hasPermission(channel.permissions, 'MANAGE_MESSAGES')) {
    return '权限不足,需要管理消息的权限'
    }

么么扎~~