# QRSpeed 变量大全<p style='font-size:15px'>安♡玖特别版</p>

作者：<img src="https://icean.moe/?req=anavat.png" style="height:24px;" />An!♡<img src="https://icean.moe/?req=annieavat.png" style="height:24px;" />阿玖

---

> 如何在网页内进行搜索？
>
> 智能手机：
> 一般是 `菜单 → 页内查找` 或者 `菜单 → 工具箱 → 页内查找`；
> 你也可以使用 [百度](https://www.baidu.com) 搜索你所使用的浏览器的页内搜索方法。
>
> Windows：`Ctrl` + `F`
>
> macOS：`⌘command` + `F`

> *2021/08/06* 新增&修改：[更新日志](https://icean.moe/?req=log.html)

## 目录

[TOC]

---

## 变量

### 发言者相关变量

---

#### %QQ%

获取发言者的 *QQ 号*。

备选方案：`%Code%` `%Uin%`

>所有匿名用户的发言，`%QQ%` 为 80000000。

---

#### %昵称%

获取发言者的 *群昵称*。

备选方案：`%UinName%`

>要获取真正的「昵称」，可以参考 [`$群昵称 $`](#群昵称-群号-qq) 函数。

---

#### %Title%

获取群内 *专属头衔*。

>无专属头衔时返回空值。

---

### 发言内容相关变量

#### %群号%

获取本群的 *群号*。（推荐）

备选方案：`%群%` `%Groupid%`

>临时会话中，`%群号%` 为本群群号；
>好友会话中，`%群号%` 为 0。

---

#### %GroupName%

获取本群的 *群名*。

>在 `[系统]` `[撤回]` 与 `[上下管理]` 前缀的代码中**无法正常获取**。

---

#### %参数1%

发言中第一个空格以后，第二个空格或结尾以前的内容，以此类推。

> ~~自从有了 [`%括号1%`](#%括号1%) ，谁还用 `%参数1%` 啊~~

---

#### %参数-1%

获取发言的全部内容。

---

#### %括号1%

触发词中，从左到右第对括号中的内容。括号顺序以前半括号 `(` 的出现顺序为准。

> 你可以尝试以下代码。

> (测试(测测)和(试试))
> %括号1%\\n
> %括号2%\\n
> %括号3%
>
> *发送 测试测测和试试 以触发。*

想要具体了解？请学习 **[正则表达式](#正则表达式基础)-捕获组**。

---

#### %AT0%

获取被@的第一个成员的 QQ 号。

第二个成员的 QQ 号为 `%AT1%`，以此类推。

>获取不到 `%AT0%`，`%AT1%`…时，对应变量值为0；
>
>@全体成员时，`%AT0%`，`%AT1%`…均为0。

---

#### %IMG0%

获取图片代码，可以在发图时使用。

第二张图片的代码为 `%IMG1%`，以此类推。

> `%IMG0%` 的核心是一串 32 位的大写字母 + 数字，即图片的 MD5[^3]。
> 手机、电脑；群聊、私聊发图得到的 `%IMG0%` 有一定差异，***只有<u>部分渠道获取的 `%IMG0%` 无需处理即可插入发图代码***。
>
> 因此，想提取 MD5 放入发图代码，建议使用以下方法处理 `%IMG0%`：
> <small>更新：现在，你也可以通过 [`$图片链接 %IMG0%$`]($图片链接 %IMG0%$) 获取图片链接。</small>
>
> 图转
> $正则 @ %IMG0%@/.*-|\[^\dA-Z]@$
>
> > 将以上代码放入词库，之后发送 *图转+图片*（不需要「+」号、换行、空格等），即可获取图片 MD5。
>
> *（使用了略复杂的正则表达式进行正则替换。萌新无需纠结原理，直接使用即可。）*

---

#### %FACE0%

获取消息中第一个表情的编号。

第二个表情的编号为 `%FACE1%`，以此类推。

> 只能获取较为早期的 QQ 表情，较晚更新的 QQ 表情（如：`/元宝` `/菜狗` 等）无法获取。

#### %FACENEW0%

同上，但只能获取 `%FACE0%` 获取不到的、较新的 QQ 表情。

#### %FACEPRO0%

同上，但只能获取表情页无法找到的、被称为「会员小表情」的 QQ 表情（如：`/流星` `/猫爪` ）。

---

#### %FACENUM%

#### %FACENEWNUM%

#### %FACEPRONUM%

获取消息中对应种类表情的总数量。

---

### 全局变量

---

#### %主人%

获取 QR 词库插件中设置的「主人」QQ 号。

---

#### %管理员%

获取 QR 词库插件中设置的「管理员」，返回**数组形式**。

>不建议萌新使用，萌新可以参考 [`$管理员 $`](#管理员-QQ) 函数。

---

#### %Robot%

获取当前登录的机器人的 QQ 号。

---

#### %RobotAuth%

判断本机器人 QQ 是否在 QR 授权。

>`%RobotAuth%` 为 0，说明未授权；
>
>`%RobotAuth%` 为 1，说明己授权。

---

#### %Time%

获取当前系统 UNIX 时间戳[^1]。

> 本地时间，不联网。修改系统时间会导致 `%Time%` 变化。

---

#### %NDTime%

获取当前系统 *毫秒级* 时间戳。

---

#### %RobotRunTime%

获取QR主程序本次打开时的 *毫秒级* 时间戳。

>可用于计算连续运行时间。

---

#### %随机数x-y%

获取 x 至 y 之间（包括 x、y）的一个随机数。其中 x 小于等于 y。

> 示例：`%随机数1-100%`

>x 和 y 只能为自然数。想要使用变量作为随机数的端点，请参考[`$随机数 $`](#随机数-1-a)函数


---

#### %%随机数x-y%%

获取随机变量（变量名是 x 至 y 之间的自然数）的内容。

> 示例：

> 你好 
> 0:你好
> 1:我好
> 2:早上好
> %%随机数0-2%%

#### %时间%

由于许多 `%时间%` 变量很少用到且规则复杂，这里只介绍一些简单的时间变量。想具体了解，请点击 [时间变量详解](#时间变量详解) 查看。

> 使用示例：
> %时间HHmm%\n
> %时间yyyy年MM月dd日 HH:mm:ss%\n
> %时间现在时间ahh时mm分ss秒%
>
> 你可以将上述代码添加到词库中查看效果。

`yyyy` 年

`MM` 月

`dd` 日

`HH` 时：24 小时制
`hh` 时：12 小时制

`mm` 分

`ss` 秒

`E` 星期

`a` 半日（上午/下午）

> `%时间%` 变量实际上是调用 *Java* *SimpleDateFormat* 类，处理当前时间并输出。

> 由于作者并没有找到足够详尽的 *SimpleDateFormat* 中文介绍，因此在下方按照自己的理解与实践编纂了[详解](#时间变量详解)。
>
> 如果你发现了[详解](#时间变量详解)中的疏漏，或者可以找到完整的中文介绍，希望可以联系作者修正或补充链接。

---

### 「[高级]」中的专用变量 <small><small><font color="848484">`授权专用`</font></small></small>

#### %BUB0%

获取发言者 气泡 ID[^2]。

---

#### %JSON0%

获取 [JSON 卡片](#json-卡片) 代码。代码不存在时为空。

---

#### %XML0%

获取 [XML](#xml-卡片) [^4][卡片](#xml-卡片) 代码。代码不存在时为空。

---

#### %FIMG0%

获取修饰后的闪照的 MD5[^3] 码，类似 `%IMG0%`。

---

> 部分用法示例：

> [高级\][\s\S]*
> 如果:%JSON0%!=
> 捕获到JSON卡片：%JSON0%
> 如果尾
> 如果:%XML0%!=
> 捕获到XML卡片：%XML0%
> 如果尾
> 如果:%FIMG0%!=
> 捕获到闪照：%FIMG0%
> 如果尾

### 其他变量

---

#### %Msgbar%

消息的群内唯一 ID，每群单独计算，每一条消息的 `%Msgbar%` 是上一条消息的 `%Msgbar%` + 1

---

#### %Status%

消息的状态码。

> 常用`%Status%`

> `%Status%`==`33` 进群
> `%Status%`==`34` 被邀请的人进群。
> `%Status%`==`84` 申请进群
> `%Status%`==`87` 被邀请的人申请进群
> `%Status%`==`82` 群聊消息
> `%Status%`==`166` 好友消息
> `%Status%`==`141` 群临时消息

> 关于邀请和进群的 `%Status%` 可能并不准确。

---

#### %Adminuin%

进行群管理操作的管理员的 QQ 号。

---

#### %Adminame%

进行群管理操作的管理员的群昵称。

---

#### %Skey%

获取机器人 Skey。

> 需要在 `QR主程序→插件列表→长按词库插件` 弹出的界面勾选 Skey 授权。

---

#### %Json%

获取机器人 Pskey，[JSON](#QR-中的-JSON) 格式。

> 需要在 `QR主程序→插件列表→长按词库插件` 弹出的界面勾选 Pskey 授权。

---

#### %Value%

在[`[上下管理]`](#[上下管理])中使用。

> `%Value% ` 为 1 时，`%QQ%` 被任命群管理员；
>
> `%Value%` 为 0 时，`%QQ%` 被取消群管理员。

---

#### %Type%

消息类型。

> 词库中很少用到。

---

## 函数

> 函数中的 `%QQ%` `%群号%` 等是作为示例的变量，并非指在参数前后加上%。
>
> 如：
> <big style='color:green'>☑</big> $发送 群 msg %群号% -1 你好！$
> <big style='color:green'>☑</big> $发送 群 msg 12345678 -1 你好！$
> <big style='color:red'>☒</big> $发送 群 msg %12345678% -1 你好！$

### 消息内容操作函数

> 此处的函数只是对消息内容进行特殊操作，不会增加消息内容。
> 因此，这些函数需要搭配文字才能成功发送消息并产生效果。

---

#### ±at %QQ%±

在消息中插入 @ 代码。

> 关于@：
>
> `±at %QQ%±`是「@」代码，可以产生「@」效果，即对方会收到「有人@你」黄字通知，但消息中不会显示「@xxxx」文字。
>
> 而「@昵称 」只会在消息中显示@文本，而没有通知提示。
>
> 因此，QR中正确的「@」方式为：
> `±at %QQ%±@%昵称%`

> 特别地，macOS 版本的 QQ 可以看到 @ 代码，因此会看到两次 @。此问题暂时无法解决。
> 另外，`消息内容操作函数` 部分的其他函数，macOS QQ 也可以看到空消息。

---

#### ±at 0±

@全体成员，同样不显示「@全体成员」的文字。

---

#### ±rep=%Msgbar%±strmsg=%参数-1%±

「回复」ID 为 `%Msgbar%` 的消息。

> **当前版本的 QR 中无法选定消息进行回复，只能回复触发指令的消息。疑似 bug。**

> `±strmsg=%参数-1%±` 中，`%参数-1%` 处为回复框里面的内容，可以自行修改。
>
> `±strmsg=%参数-1%±` 非必选，若不写则回复框引用内容为空。

---

#### ±anony 匿名±

使本条消息匿名发送。

---

#### ±face 187±

发送编号为 187 的普通（以 `%FACE0%` 获取）表情。

#### ±facenew 277±

发送编号为 277 的新（以 `%FACENEW0%` 获取）表情。

#### ±facepro 4194325±

发送编号为 4194325 的会员（以 `%FACEPRO0%` 获取）小表情。

---

### 文件操作函数

---

#### $写 教程/%群号%/测试 m 0$

向 `/sdcard/QR/QRDic/data/教程/%群号%/测试` 中写入 `m=0`

> 我们将这里的「m」称为「key」。key 可以为任意数目的任意字符。
>
> 一个文件中，可以写入多个 key 不同的数据。
>
> 示例：，你可以使用 `$写 教程/%群号%/测试 mass 100$` 和 `$写 教程/%群号%/测试 火锅 100$` 在文件「测试」中写入两个数据。
>
> 之后，你可以使用下方的[`$读 $`](#$读 教程/%群号%/测试 m 0$)函数读取这些数据。

---

#### $读 教程/%群号%/测试 m 0$

读取 /sdcard/QR/QRDic/data/教程/%群号%/测试 中 m 对应的值，不存在则返回默认值 0。

>你可以修改默认值「0」。
>
>若将代码修改成 `$读 教程/%群号%/测试 m 100$` 
>
>则对应值不存在时返回默认值「100」。

---

#### $下载 /QR/路径 链接$

将 [`$访问 链接$`](#访问函数) 得到的结果下载到 `/sdcard/QR/路径`。路径需要精确到文件名。

> 示例：
> `$下载 /QR/QRDic/data/百度.html https://www.baidu.com$`
> `$下载 /QR/QRDic/data/backup.txt file:///sdcard//QR/QRDic/dic.txt$`

> 无法自动创建文件夹，需要使用已有文件夹或手动创建路径文件夹才能成功下载文件。

---

#### $下载 /QR/路径 链接 {JSON格式请求头} A$

和[上一个函数](#$下载-qr路径-链接$)类似。可以自定义请求头。返回头将存储于变量 `A`。

---

#### $删除 /QR/QRDic/data/……$

删除 `/sdcard/QR` 路径下的任意文件或空文件夹。

> 不能删除含有文件的文件夹。
>
> 若想删除文件夹，可以自行写代码或参考群文件，使用[递归](#$删除 /QR/QRDic/data/……$)删除的方式删除文件夹。

> ***注意！`$删除 /QR/QRDic/dic.txt$` 将会直接删除你的词库。***
>
> ***请不要在代码中留下被删除词库的隐患。***

---

### 文本处理函数

---

#### $替换 𒑜 文本𒑜原内容𒑜新内容$

将「文本」中的「原内容」全部替换为「新内容」。

---

#### $正则 𒑜 文本𒑜正则内容𒑜新内容$

以[正则表达式](#正则表达式基础)匹配「文本」中的「正则内容」，并将匹配结果全部全部替换为「新内容」。

> 注意：`$正则 ` 函数中，`[0-9]` 将不会匹配数字 0 - 9 中的任意一个，而是被当作 [*计算格式*](#数学运算符) 运算后匹配 **-9**

---

#### $取中间 𒑜 文本𒑜开头𒑜结尾$

---

### 消息发送函数

---

#### $发送$

将上方运算完的消息直接发送。

> 示例：
>
> 测试发送
> 123
> $发送$
> 456

---

#### $发送 群 msg %群号% -1 内容$

向指定群发送文本，无法带图。

#### $发送 临时 msg %群% %QQ% 内容$

向指定群的群成员发送文本临时消息。

> 临时会话权限可能被群主关闭。

---

#### ±ptt=音频路径或链接±

向当前群发送语音消息。

> 大于 1MB 的音频文件无法发送。

> ~~Arcaea 玩家，把你的 ptt 数据填写到 `±ptt= ±` 中是发不出来语音的。~~

#### $发送 群 ptt %群号% -1 音频路径或链接$

向指定群发送语音消息。

> 无法向单独的某人（好友、临时消息）发送语音消息。

---

#### card:1 xml卡片代码 <small><small><font color="848484">`授权专用`</font></small></small>

向当前聊天发送  [XML](#xml-卡片)[^4] [卡片](#xml-卡片)。

#### $发送 群 xml %群号% %QQ% xml卡片代码$ <small><small><font color="848484">`授权专用`</font></small></small>

向指定群发送 XML 卡片。

#### $发送 临时 xml %群号% %QQ% xml卡片代码$ <small><small><font color="848484">`授权专用`</font></small></small>

向指定群成员发送 XML 卡片。

---

#### json: JSON卡片代码<small><small><font color="848484">`授权专用`</font></small></small>

向当前聊天发送 [JSON 卡片](#json-卡片)。

#### $发送 群 json %群号% %QQ% json卡片代码$ <small><small><font color="848484">`授权专用`</font></small></small>

向指定群发送 JSON 卡片。

#### $发送 临时 json %群号% %QQ% json卡片代码$ <small><small><font color="848484">`授权专用`</font></small></small>

向指定群成员发送 JSON 卡片。

---

#### ±img=图片路径或链接或MD5±

向当前群发送图片消息。

> 可以搭配文字。

> 私聊发图为 `授权专用` 功能。

#### $发送 群 img %群号% 图片路径或链接或MD5$

向指定群发送图片消息。

#### $发送 临时 img %群号% %QQ% 图片路径或链接或MD5$ <small><small><font color="848484">`授权专用`</font></small></small>

向指定群的群成员发送图片临时消息。

---

#### ±ximg=图片路径/链接/md5±

向当前群发送秀图。

[//]:(`±ximgtype=%随机数40000-40005%±` 指随机六种秀图中的一种。
当然，你也可以指定某一种秀图，如 `±ximgtype=40002±` 或 `±ximgtype=%括号1%±`
`±ximgtype= ±` 非必选，不选时默认 40001 普通秀图。)

---

#### ±fimg=图片路径或链接或MD5±

向当前群发送闪照。

#### $发送 群 fimg %群号% 图片路径或链接或MD5$

向指定群发送闪照。

---

#### ±shake 1±

发送窗口抖动。

---

### QQ/QQ群操作函数

---

#### $点赞 %QQ% 10$

点赞 `%QQ%` 10 次。只能给机器人的好友点赞。

> 当然，如果你的机器人拥有 SVIP，你可以将 10 改为 20。

---

#### $禁 %群号% %QQ% 禁言时间$

禁言群成员。机器人需有 QQ 群管理员权限。

> 禁言时间以「秒」为单位。

> 禁言时间为 0 时，表示解除禁言。

---

#### $改 %群号% %QQ% 新群昵称$

修改群成员的群昵称。修改他人群昵称时，机器人需有 QQ 群管理员权限。

> 即使没有管理员权限，机器人也可以修改自己的群昵称。

---

#### $踢 %群号% %QQ%$

移除群成员。机器人需有 QQ 群管理员权限。

---

#### $全体禁言 开 %群号%$

开启指定群的全员禁言。

#### $全体禁言 关 %群号%$

关闭指定群的全员禁言。

---

#### $撤回 %群号% %Msgbar%$

撤回 ID 为 `%Msgbar%` 的消息。

---

#### $申请群 申请群号 理由$<small><small><font color="848484">`授权专用`</font></small></small>

申请加入群。

> 由于 腾讯风控[^6] 的原因，机器人发出的入群申请可能被 *屏蔽* 或 *过滤*。

---

#### $退出群 退出群号$<small><small><font color="848484">`授权专用`</font></small></small>

退出群。

---

#### $设置群状态 %群号% 开$

#### $设置群状态 %群号% 关$

设置 QR 主程序中的开关。

> 这样一来，你无法在当前群触发任何消息。因此，你将难以在当前群内重新打开此开关。

#### $获取群状态 %群号%$

获取 `%群号%` 在 QR 主程序中的开关状态，返回 `开` 或 `关`。

---

#### $进群审核 %群号% %QQ% 31 12 拒绝理由$

拒绝 `%QQ%` 入群。

> 很可能仅在 `[系统]` 前缀的触发词代码中有效。

#### $进群审核 %群号% %QQ% 2001 11 0$

同意 `%QQ%` 入群。

> 很可能仅在 `[系统]` 前缀的触发词代码中有效。

---

### 代码相关函数

#### $调用 1000 内容$

延迟 1000 毫秒后，触发关键词「内容」

> 示例：
>
> 说话
> $调用 1000 说你好$
> $调用 2000 说再见$
> $调用 3000 说走开走开$
>
> [内部]说(.*)
> %括号1%

> 1 秒 = 1000 毫秒

---

#### $回调 内容$

触发关键词「内容」，并将执行结果返回到 `$回调 内容$` 处。

> 示例：
>
> 说话
> a:$回调 说你好$
> 我说了个「%a%」\n
> 我又说了个「$回调 说再见$」\n
> $回调 说走开走开$
>
> [内部]说(.*)
> %括号1%

---

#### $回调内部 内容$

在触发词中使用的回调。

> 会一定程度上影响运行速度。

---

#### $执行 %括号1%$

将一段文字作为 QRSpeed 词库代码执行。

> 无法执行多行语句；无法执行条件语句。
>
> 你可以自行编写代码，以循环的方式执行多行语句中的每一行。但是仍然不能执行条件语句。

> 建议不要在私聊中执行，否则可能会出现 bug。

> ***如果你需要用到它，记得加上权限或防范措施，以免被恶意执行（如被[删除词库](#删除-qrqrDicdata……)）。***

---

#### $变量 A 123456$

将变量A赋值为123456，支持多字变量。

> 示例：
>
> $变量 金币 10000$
> 你现在有%金币%枚金币。

---

#### $jump -7$

> 当前版本中，你可以使用 跳 代替 jump，就像这样：`$跳 -7$`

代码跳行。

以下一行为基准（即 `$jump 0$` 相当于不跳行），向上跳行为负数，向下为正数。

> 无法跳行到第一行；无法跳行到其他代码块；注释不算行数。

> 示例：
>
> 循环示例
> a:0
> a:[%a%+1]
> 如果:%a%!=11
> %a%\n
> $jump -4$

#### :lable

#### $jump :lable$

`:lable` 指定一个跳行标签。你可以使用 `$jump :lable$` 跳行到对应标签处。

你可以指定多个标签，且lable可以改为其他字符串。

> 示例：
>
> 循环示例
> 1$jump :lable3$
> 2
> :lable1
> 3$jump :lable2$
> :lable3
> 4$jump :lable1$
> :lable2
> 5

**看晕了对吗？请尽量不要在一段代码中使用过多跳行，除非你确认以后不会再更改它。**

---

### 类变量函数

#### $随机数 1-%a%$

可以用变量指定随机数范围的随机数。

> 示例：
>
> a:100
> b:999
> $随机数 %a%-%b%$

> 注意：与 `%随机数x-y%` 变量不同，此函数「随机数」三个字后留有一个空格

---

#### $群昵称 %群号% %QQ%$

获取%QQ%在%群号%的群名片。

> 当然，`%QQ%` 和 `%群号%` 可以换成任意 QQ 号或群号。
>
> 当机器人或 `%QQ%` 不在所查询群时，返回 `%QQ%` 的真实昵称。
>
> 因此，可以使用 `$群昵称 0 %QQ%$` 获取某人真实昵称。

---

#### $管理员 %QQ%$

检测 `%QQ%` 是否为词库插件中设置的管理员

>若是，返回 `%QQ%`；否则，返回 0。

> 示例：
> 如果:$管理员 %QQ%$==%QQ%
> 是管理员

---

#### $图片链接 %IMG0%$

将代码为 `%IMG0%` 的图片上传到 QR 服务器并获取链接。

---

### 访问函数

> 访问结果以 UTF-8 编码。如果不懂，可以忽略这句话。

---

#### $访问 file://路径$  

访问本机文件，获取文件内容。

---

#### $访问 链接$

向链接发送 GET 请求，可以理解为普通的访问链接。

---

> 以下的访问方法，如果看不懂可以忽略。

---

#### $访问 SETGET {JSON格式请求头} 链接$

向链接发送自定义请求头的 GET 请求。

---

#### $访问 SETGETFT {JSON格式请求头} A 链接$

向链接发送自定义请求头的 GET 请求，并将返回头赋值给变量 A。

---

#### $访问 POST 网址 post参数$

向链接发送 POST 请求。

---

#### $访问 SETPOST {JSON格式请求头} 链接 post参数$

向链接发送自定义请求头的 POST 请求。

---

#### $访问 SETPOSTFT {JSON格式请求头} A 链接 post参数$

向链接发送自定义请求头的 POST 请求，并将返回头赋值给变量 A。

---

### 运算函数

---

#### $字符长度 %括号1%$

获取文本中的字符长度。

> 以 UTF-16 BE 编码后的长度。因此，少部分生僻字、特殊符号可能会判断为 2 个字符。

---

#### $URLEncoder %括号1%$

URL 编码：将文本使用 UTF-8 百分号编码方式进行转码。

> QR 的 URL 编码中，除了数字 `0-9`、大小写形式的 26 字母 `a-z` `A-Z`、句点 `.`、减号/连字符 `-` 以及下划线 `_` 之外，其他符号都会被编码。

#### $URLDecoder %括号1%$

URL 解码：将 UTF-8 百分号编码转换为文本。

---

#### $HexEncoder %括号1%$

Hex 编码：将文本使用 UTF-8 十六进制编码方式进行转码。

> ~~实际上就是将 **所有** 字符 URL 编码之后去掉百分号~~

#### $HexDecoder %括号1%$

Hex 解码：将 UTF-8 十六进制编码转换为文本。

---

#### $时间格式 %NDTime% yyyy-MM-dd HH:mm:ss.SSS E$

将毫秒级时间戳 `%NDTime%` 转换为一般时间格式。时间格式的定义请参考 [时间变量](#%时间%)。

---

#### $MD5 内容$

取一段文字的 MD5[^3]。

> 可以用来校验文件是否被更改。

---

#### $GTK %Skey%$

#### $BKN %Skey%$

这两个函数完全相同，将 `%Skey%` 转换为 bkn/gtk[^5]。

---

#### $SIG 内容$

固定的数字签名算法。

----

### JSON 操作函数

> 注意，QR中所有JSON操作中都直接使用变量名，如「A」而不是「%A%」。

---

#### @A[1]

- 获取 JSON 数组 `A` 中索引 `1` 对应的值;
- 获取 JSON 对象 `A` 中，键 `"1"` 对应的值。

---

#### $JSON 添加 A 1 100$

- 将 JSON 数组 `A` 中索引 `1` 对应的值修改为字符串 `"100"` ，如果前方有索引没有对应值，将会补充空值 `null` ；
- 将 JSON 对象 `A` 中键 `"1"` 对应的值修改为字符串 `"100"` ，如果不存在键 `"1"` ，则创建一个新的键值对 `"1":"100"` 。

---

#### $JSON 添加 A 100$

- 在 JSON 数组 `A` 的末尾添加字符串 `"100"` 。

---

#### $JSON 删除 A 1$

- 删除 JSON 数组 `A` 中索引为 `1` 的值；

- 删除 JSON 对象 `A` 中键为 `"1"` 的键值对。

---

#### $JSON 长度 A$

- 获取 JSON 数组 `A` 中元素的数量。
- 获取 JSON 对象 `A` 中元素的数量。

---

#### $JSON 获取 A 1$

> 建议在 `@A[1]` 函数无法成功获取时使用

- 获取 JSON 数组 `A` 中索引为 `1` 的值；

- 获取 JSON 对象 `A` 中键 `"1"` 对应的值。

---

### 外部Java调用

---

#### $BSH xxxx.java %a%$

调用 `/sdcard/QR/QRDic/BSH/xxxx.java`中的函数「%a%」。

---

#### $BSH xxxx.java %a% %b%$

调用 `/sdcard/QR/QRDic/BSH/xxxx.java`中的函数「%a%」，参数为「%b%」。

---

## 其他代码

`\r` `\n` `\r\n` 换行符

`\%0A` 换行符
`\%25` 百分号
`\%20` 空格

> 「\%xx」为 UTF-8 百分号编码的字符。

---

## 特殊关键词前缀

> 注:

> \[xx\]xxx
> 表示前缀后需要加触发词;

> \[xx\]
> 表示单独使用前缀即可.

---

### 特殊事件

---

#### [系统]

进群等系统通知触发。

---

#### [退群]

成员退群触发。

---

#### [撤回]xxx <small><small><font color="848484">`授权专用`</font></small></small>

有人（包括机器人自己）撤回消息时触发。

#### [红包]

有人发送红包时触发。

> QR 甚至可以撤回红包。（不过好像还是可以在群未领红包里领到？）

---

#### [转账]xxx

有人向机器人转账时触发。

---

#### [初始化]

*QRSpeed词库插件*每次开始运行（重启、重连）时触发一次。

> 因为不是在特定群执行，所以许多函数、变量无法使用。

---

#### [上下管理]

检测QQ群管理变动。

> 示例:

> [上下管理]
> 如果:%Value%==1
> %昵称% 成为了管理员。
> 返回
> 如果尾
> 如果:%Value%==0
> %昵称% 不再是管理员了。

---

### 其他前缀

#### [内部]xxx

只能通过调用/回调触发，不会被 QQ 消息触发。

---

#### [高级]xxx <small><small><font color="848484">`授权专用`</font></small></small>

能使用部分[特殊变量](#「[高级]」中的专用变量)。

---

## 运算符

### 数学运算符

可以进行混合运算，小数结果四舍五入取整数

> 示例：

> [1+2]
> [3-2]
> [2*(2+3)/2]

#### 基础运算符

`+` 加法

`-` 减法

`*` 乘法

`/` 除法

#### 其他运算符

> *取模* 约等于*取余数*，其他三个运算符很少会用到。
>
> 如果想了`&` `|`与 `^` 的运算方式，请 [百度搜索位运算](https://www.baidu.com/s?wd=位运算)
>
> > 请注意，此处 `&` `|` 与[逻辑运算符](#逻辑运算符)中的`&` `|` 意义并不完全相同。

`&` 按位与

`|` 按位或

`^` 按位异或

`%` 取模

> 取模运算符后不能接变量。
>
> <big style='color:red'>☒</big>**错误**示例：[62%%a%]

---

### 逻辑运算符与条件语句

#### 关系运算符

`<` 小于
`> ` 大于
`<=` 小于等于
`>= ` 大于等于
`==` 等于
`!=` 不等于

#### 逻辑运算符

`|` 逻辑或
`&` 逻辑与

> QR 中，逻辑运算从左到右依次运行，不支持括号。
>
> 因此
> `%a%==1&%b%==2|%c%==3&%d%==4`
> 运算顺序为
> `((%a%==1&%b%==2)|%c%==3)&%d%==4`

> 不知道什么是逻辑运算?请查阅高中数学课本或 [`百度一下`](https://www.baidu.com/)。

---

## 其他知识

### <a id="regex"></a>正则表达式基础

#### 简介

QR 中的触发词使用正则表达式进行匹配。即使你不知道什么是正则表达式，你也很可能在 QR 中使用过它。

如：`.*早上好.*` `我想.*`
你可能已经知道，`.*` 指代 *任意数量的任意字符* <sup>①</sup> 。实际上，它就是简单的正则表达式。

> <small>① 严格来说并非如此。我们将在下面学到，`.*` 并不能匹配换行符 `\n`。</small>

在正则表达式中，具有特殊意义的字符被称为「元字符」。接下来将简单介绍常用的元字符的用法。

#### 元字符

##### 匹配某些字符

`\w`	匹配 *文字、数字、下划线*。
`\W`	匹配 `\w` 不能匹配的字符。

`\d`	匹配 *数字*。
`\D`	匹配 `\d` 不能匹配的字符。

`\s`	匹配 *空白字符*（包括空格、换行等）。
`\S`	你猜得没错，匹配 `\s` 不能匹配的字符。

`\n`	匹配 *换行符*。
`\r`	匹配 *回车符*。

> QQ 中，手机发送的换行为换行符 `\n` ，而电脑发送的换行为回车符 `\r`。
> 因此，防止电脑端无法触发指令，我们更建议使用 `[\n\r]` 来匹配换行。

`[]` 根据方括号的内容匹配 *部分字符*。

> 如：
>
> `[abcde]`	匹配 `a` `b` `c` `d` `e`中的任意一个字符。它可以匹配 `a` `b` `c` `d` 或 `e`，而不能匹配 `f` `abc`。
> `[^xyz]`	匹配除 `x` `y` `z` 之外的任意一个字符。它可以匹配 `a` `3` `/` `之` 或 `こ` 等，而不能匹配 `x` `abc`。



`. `	匹配除换行符 `\n` 外的 *任意字符*。

> `. ` 与数量限制元字符 `*` 组合成 `.*` 或许可以称为「通配符」，它可以匹配任意不带换行的文本
> 但是，更加通配的明显是 `[\s\S]*`  `[\d\D]*` 或 `[\w\W]*` 等，它们可以匹配任意文本。

> 当单独出现的「通配符」如 `.*` `[\s\S]*` 等作为触发词时，该触发词下方的触发词几乎都不会被触发。
> 因此，词库中最好只出现至多一次的「通配符」且仅将它放在词库的最下方。

##### 数量限制

`{4}`	限制前方元素出现 4 次。如：`\d{4}` 匹配 4 个数字；`(abc){2}` 匹配 `abcabc`。
`{1,4}`	限制出现 1-4 次。如：`\d{1,4}` 匹配 1-4 个数字；`[abc]{2}` 匹配 `aa` `bb` `ac` `bc` 等。
`{4,}`	限制出现 4 次或更多次。如：`\d{4,}` 四位及以上数字；`(苹果|apple){2,}` 匹配 `apple苹果` `appleapple苹果` `苹果apple苹果苹果apple` 等。

`? `	限制出现 0 次或 1 次。相当于 `{0,1}`
`+`	限制出现 1 次或更多次。相当于 `{1,}`
`*`	限制出现 0 次或更多次。相当于 `{0,}`

#### 正则表达式触发词实例

你可以尝试以下代码：

(无路赛){2,}
测试成功了，你个傲娇。

(\w)\n是\n笨\n蛋
如果:%括号1%==你
虽然很不情愿，但是
如果尾
测试成功了。

([你我他]不?)是笨蛋\W*
如果:%括号1%==你不|%括号1%==我|%括号1%==他
那当然！
返回
如果尾
这怎么可能呢？

戳了你(\d+)次(\W*)
捶了你%括号1%天%括号2%

点歌\s*(.+)
你点了一首「%括号1%」

#### 转义符 `\`

转义符本应放在 *元字符* 中介绍的。但是为了不打断学习的连续性，我们把转义符从 *元字符* 中独立了出来。

我们先来看一个例子：

> 一只小可爱 A 想写一个骰子。他选择了 `.r` 来作为掷骰子的触发词。
>
> 测试之后，他发现骰子没有问题，便在群内开放使用了。
>
> 第二天，大家在群里聊天：
>
> > B：「A 劳斯您好，您家崽人设是您自己画的对叭？！太神仙了呜呜呜，请问您接单吗？」
> >
> > A：「接。」
> >
> > B：「多少钱呀？」
> >
> > <span style="color:#FF6464;">A：「1r」</span>
> >
> > <span style="color:#FF6464;">机器人：「@A 1d100 = 32」</span>
> >
> > A：？
>
> ***内容完全虚构，若有雷同，纯属我太聪明了wwwwwww***

在正则表达式中， `.` 表示的是一个任意非换行字符。因此，`1r` 可以被 `.r` 匹配，触发了指令。

一些字符（如 `.` `(` `+` 等）由于成为了 *元字符* 而被赋予了特殊含义，从而不再代表这些字符本身。

那么如何匹配这些字符本身呢？答案很简单，我们需要在元字符前加上 *转义符* `\` 来表示它本身。

在这个例子中，如果将词库中的触发词改为 `\.r`，就只有 *.r* 才可以触发骰子了。

#### 完整的正则表达式教程

***[点我](https://www.runoob.com/regexp/regexp-tutorial.html)查看***

---

### QR 中的 JSON

#### 关于 JSON

https://baike.baidu.com/item/JSON/2462549

 JSON 在线解析格式化工具：https://m.sojson.com/

> 当你拿到一串 JSON 代码时，它一般是没有换行与空格的一个字符串，给人的直观感受就是「乱糟糟的一团」。
> 这时，你可以使用 JSON 格式化工具将其格式化，以直观地看到 JSON 的层次结构。
>
> 同时，你也可以用 JSON 格式化工具来检查自己的长串 JSON 是否包含语法错误。

---

#### JSON 操作代码示例

##### $JSON 添加 DATAName 1$

> JSON添加1
> A:[1,2,3]
> $JSON 添加 A 9$
> %A%

----

##### $JSON 添加 DATAName 1 1$

> JSON添加2
> A:[1,2,3]
> B:{"玖":"1","安":"an"}
> $JSON 添加 A 1 a$
> $JSON 添加 B 玖 9$
> $JSON 添加 B 玖玖 安安$
> A：%A%\n
> B：%B%

---

##### $JSON 获取 DATAName 1$

> JSON获取
> A:[1,"8",3]
> B:{"玖":"9","安":"an","玖玖":"安安"}
> $JSON 获取 A 1$\n
> $JSON 获取 B 玖$

---

##### $JSON 删除 DATAName 1$

> JSON删除
> A:[1,"8",3]
> B:{"玖":"9","安":"an","玖玖":"安安","an":"annie"}
> $JSON 删除 A 1$
> $JSON 删除 B an$
> A：%A%\n
> B：%B%

----

##### $JSON 长度 DATAName$

> JSON长度
> A:[1,"8",3]
> B:{"玖":"9","安":"an","玖玖":"安安","an":"annie"}
> $JSON 长度 A$\n
> $JSON 长度 B$

---

## QQ 官方 API

---

#### ±img=http://q2.qlogo.cn/headimg_dl?dst_uin=%QQ%&spec=5±

获取发言人头像

---

#### ±img=[http://p.qlogo.cn/gh/%群号%/%群号%/](http://p.qlogo.cn/gh/%群号%/%群号%/)±

获取群头像

---

## 时间变量详解

> *从 `%时间%` 过来却看晕了？[点我](#%时间%)返回 `%时间%` 变量。*（劝退?）

`%时间%` 变量里有很多保留字符。使用 `%时间%` 变量时，保留字符会被替换为对应值，而其他字符保持不变。

>这样说可能有些抽象，这里先放示例。
>你可以通过尝试下方的代码，了解 `%时间%` 变量的用法。
>
>时间变量测试
>%时间HHmm%\n
>%时间yyyy年MM月dd日 HH:mm:ss%\n
>%时间现在时间ah时m分s秒%

接下来将具体说明 `%时间%` 变量中的的保留字符。

> ***如果 `%时间%` 变量中带有保留字符之外的 英文字母（如：`%时间AAHHmmss%`），会报错并使整段代码不可用。***
>
> ***在这种情况下，你可以使用单引号 `'` 包裹住不想被转换为时间的部分，以期其不会被格式化解释；而连续的两个单引号 `''` 则会被转换为一个单引号 `'`。这种方法也适用于保留字符。（如：`%时间'AA'HH''mm'ss'%`）***

#### 基础时间变量

参考 [`%时间%`](#%时间%) 变量。（二次劝退?）

#### 进阶时间变量

> 部分时间变量存在 *补 0 规则*。
>
> 你可以通过以下示例来了解补 0 规则：
>
> `%时间y%` `%时间yyy%` `%时间yyyy%` 值为 2021
> `%时间yyyyy%` 值为 02021
> `%时间yyyyyy%` 值为 002021
>
> 除了少部分特殊字符组，大部分结果为 *纯数字* 的时间变量均具有 *补 0 规则* 。
> 为方便学习，具有 *补 0 规则* 的时间变量，将在「结果示例」中标注`补0`。
>
> 未标注 `补0` 的变量，无论重复多少次字母均不会使结果变化
>
> 如：`%时间EEEE%` `%时间EEEEE%` 甚至 `%时间EEEEEEEEEEEEEEEE%`  结果均为 *星期五*。

> 以下所有 *结果示例* 使用的示例时间为：
> 2021 年 2 月 19 日 18:03:25.876 GMT+8:00

`G` 历法

`yy` 年

> 结果示例：21

`y`  年

> 结果示例：2021 `补0`

`M` `L` 月

> 结果示例：2 `补0`

`d` 日 `补0`

`H` 小时：24 小时制（午夜为 0 点，没有 24 点）

> 结果示例：18 `补0`

`k` 小时：24 小时制（午夜为 24 点，没有 0 点）

> 结果示例：18 `补0`

`h` 小时：12小时制（午夜为 0 点，正午为 12 点）

> 结果示例：6 `补0`

`K` 小时：12小时制（午夜为 12 点，正午为 0 点）

> 结果示例：6 `补0`

`m` 分

> 结果示例：3 `补0`

`s` 秒

> 结果示例：25 `补0`

`a` 上午/下午

> 结果示例：下午

`cccc` `EEEE` 星期

> 结果示例：星期五

`c` `E` 星期

> 结果示例：周五

`u` 星期

> 结果示例：5 `补0`

`D` 今年第x天

> 结果示例：50 `补0`

`w` 今年第x个星期 日/一/二 …

> 结果示例：8 `补0`

`W` 本月第x个星期 日/一/二 …

> 结果示例：3 `补0`

`F` 本月的第x个七天

> 结果示例：3 `补0`

`G` 历法

> 结果示例：公元

`S` 十分之一秒

> 结果示例：8

`SS` 百分之一秒

> 结果示例：87

`SSS` 千分之一秒（毫秒）

> 结果示例：876 `补0`

**`z` `Z` `X` 系列：当前时区**

> `z` 结果示例：+0800
> `zz` `zzz` 结果示例：GMT+08:00
> `zzzz` `更多z` 结果示例：中国标准时间
>
> `Z` `ZZ` `ZZZ` 结果示例：+0800
> `ZZZZ` 结果示例：GMT+08:00
> `更多Z` 结果示例：+08:00
>
> `X` 结果示例：+08 
> `XX` 结果示例：+0800 
> `XXX` 结果示例：+08:00
> `XXXX` `更多X` ***会！报！错！***
>
> > z、Z 和 X 似乎是 *一般时区*、*RFC 822 时区* 和 *ISO 8601 时区* 的区别。
> > 其中「一般时区」原文为*「General time zone」*，翻译可能有误。
> > 虽然我也不知道他们之间有什么区别，但我先把它写在这。

---

## 未整理&杂项

### 闪字

(乱舞|多变|嗨爆|输入|放大)闪字 ?(.+)
a:{"E4B9B1E8889E":"2000","E5A49AE58F98":"2001","E597A8E78886":"2002","E8BE93E585A5":"2003","E694BEE5A4A7":"2004"}
T:{"a":"com.tencent.randomwords","desc":"500","resid":@a[$HexEncoder %括号1%$],"m":"main","v":"1.0.0.16","prompt":"闪字"}
±fmsg %T%±
±%括号2%±

---

### 红包/转账相关

#### 转账检测

\[转账\]([\S\s]+)
如果:%Tfuin%!=
%Tfuin%\n
%Tfurl%\n
%Tftip%\n
%Tftitle%\n
%Tftext%\n
%TfAmounts%\n
如果尾

---

#### 抢红包

$抢红包 %Groupid% %Skey% %Authkey% %Listid% %Number% Data$

---

#### 查红包

$查红包 %群% %Skey% %Authkey% %Listid% A$
%A%

---

### 卡片示例

#### JSON 卡片

```json
json: {"app":"com.tencent.miniapp","view":"notification","meta":{"notification":{"appInfo":{"appName":"优质解答","iconUrl":"http://8.131.89.211/s/0.png"},"button":[{"name":"一种植物"}]}}}
```

---

#### XML 卡片

```xml
card:1 <?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg servicetemplateaction="viewMultiMsg" brief="[聊天记录]" m_resm_fileName="6931536343294312393" tSum="1" sourceMsgurl="" flag="3" adverSign="0" multiMsgFlag="0"><item layout="1" advertiser_amaxLines="2" lineSpace="12">群聊的聊天记录</title><title size="26" color="#777777" maxLines="2" lineSpace="12">An!:  这是一张卡片</title><hr hidden="false" style="0" /><summary size="26" color="#777777">查看1条转发消息</summary></item><source name="聊天记录" icon="" action="" app/></msg>
```



---

## 废弃&失效&不明意义部分

#### ~~±ximgtype=%随机数40000-40005%±~~

~~定义秀图类型；已失效~~

#### ~~%Number%~~

~~目前已知在红包消息中为 1，其他消息中为 0。官方解释是红包金额，可能已废弃。~~

#### ~~%Pid%~~

~~未知~~

#### ~~%Reqid%~~

~~未知~~

#### ~~%Strmsg%~~

~~废弃~~

#### ~~±nick 测试昵称±~~

~~废弃~~

#### ~~±title 测试±~~

自定义头衔为「测试」，仅作用于当前一条消息。

失效。

> 与群主设置的专属头衔不同，QR 设置的头衔可以超过 6 字限制。

---

#### ~~±bub 1± <small><small><font color="848484">`授权专用`</font></small></small>~~

使用气泡 ID[^2] 为 1 的气泡发言。

失效。

> 不受 VIP 限制；仅作用于当前一条消息，后续消息仍为原气泡。

---

#### ~~%Inviteename%~~

~~字面意思是被邀请人的昵称，但是完全没有反应~~

---

#### ~~发红包~~

~~##指定专属红包 8不指定 32口令红包 1024指定 65536语音红包~~
~~A:1024~~
~~##红包类型 1普通红包 2拼手气红包~~
~~B:2~~
~~##发送类型 1好友 3群 4非好友~~
~~C:3~~
~~##红包金额 分为单位~~
~~D:%随机数5-10%~~
~~##红包数量~~
~~E:1~~
~~##接收红包 群号或好友QQ号~~
~~F:%群号%~~
~~##红包标题 或 口令~~
~~G:我是红包~~
~~##指定发红包用|分割~~
~~H:%Code%~~

~~$红包 %A% %B% %C% %D% %E% %F% %G% %H%$~~

~~示例:~~

~~我要红包~~
~~$红包 1024 1 3 1 1 %群号% 你的红包 %QQ%$~~

---

## 关于

### 关于变量大全编写

#### 作者

* `An!` 

* `阿玖`

#### 编辑工具

[`Typora`](https://www.typora.io)

---

### 关于共享

#### 许可协议 🄯

本作品采用 <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">知识共享 署名-相同方式共享 4.0 国际许可协议</a> 进行许可。

> 如果你认为本文有不妥之处，可以对下载后的文件进行适当修改。修改后的文章仍应以 [此许可协议](http://creativecommons.org/licenses/by-sa/4.0/) 发布。
>
> 感谢你对知识共享的支持与对 QR 新人的帮助。

#### 想要制作 `变量大全安♡玖特别版` 的网页镜像？

你可以 <a href="https://icean.moe/?req=index.html" download="bldq.html">点此下载 HTML 文件</a>，并在稍后上传到你的服务器。

如果想用其他 Markdown 编辑器重新渲染网页，你也可以 <a href="https://icean.moe/?req=变量大全安♡玖特别版.md" download="变量大全安♡玖特别版.md">点此下载 Markdown 文件</a>。

#### 想要以文件形式分享 `变量大全安♡玖特别版`？

你可以选择下载以下一个或多个文档并上传到任何平台：

<a href="https://icean.moe/?req=变量大全安♡玖特别版.pdf" download="变量大全安♡玖特别版.pdf">`PDF 文档（推荐）`</a> <a href="https://icean.moe/?req=index.html" download="变量大全安♡玖特别版.html">`HTML 文档（推荐）`</a> <a href="https://icean.moe/?req=变量大全安♡玖特别版.docx" download="变量大全安♡玖特别版.docx">`Word 文档`</a> <a href="https://icean.moe/?req=变量大全安♡玖特别版.epub" download="变量大全安♡玖特别版.epub">`Epub 文档`</a> <a href="https://icean.moe/?req=变量大全安♡玖特别版.rtf" download="变量大全安♡玖特别版.rtf">`RTF 文档`</a>

> HTML 以外格式的文档不保证最新版本；其中 PDF 格式的文档较常更新，但仍可能会落后于最新版本1-2次修改。

---

[^1]: UNIX 时间戳：1970-01-01 00:00:00 GMT 至当前的总秒数。
[^2]: 气泡 ID 手动获取方法：`在聊天界面双击想要获取 ID 的气泡→点按右下角「装扮」→点按气泡名称→点击右上角的「···」展开菜单→手指放在菜单第三行向左轻扫→轻触「复制链接」` 成功复制链接后，找合适的输入框粘贴刚刚复制的内容，可以在链接文本找到 `itemid=` ，其后紧跟的数字就是气泡 ID。
[^3]: 一种摘要算法。
[^4]: 一种标记语言。
[^5]: QQ 网页 cookie 的一部分，由 skey 通过某种摘要算法计算得出。
[^6]: 腾讯对「风险」QQ 号的一系列限制。