github.com/Mrs4s/go-cqhttp@v1.2.0/docs/EventFilter.md (about) 1 # 事件过滤器 2 3 在配置文件填写对应通信方式的 `middlewares.filter` 即可开启事件过滤器,启动时会读取该文件中定义的过滤规则(使用 JSON 编写),若文件不存在,或过滤规则语法错误,则不会启用事件过滤器。 4 事件过滤器会处理所有事件(包括心跳事件在内的元事件),请谨慎使用!! 5 6 注意: 与客户端建立连接的握手事件**不会**经过事件过滤器 7 8 > 注意, 最新文档已经移动到 [go-cqhttp-docs](https://github.com/ishkong/go-cqhttp-docs), 当前文档只做兼容性保留, 所以内容可能有不足. 9 10 ## 示例 11 12 这节首先给出一些示例,演示过滤器的基本用法,下一节将给出具体语法说明。 13 14 ### 过滤所有事件 15 16 ```json 17 { 18 ".not": {} 19 } 20 ``` 21 22 ### 只上报以「!!」开头的消息 23 24 ```json 25 { 26 "raw_message": { 27 ".regex": "^!!" 28 } 29 } 30 ``` 31 32 ### 只上报群组的非匿名消息 33 34 ```json 35 { 36 "message_type": "group", 37 "anonymous": { 38 ".eq": null 39 } 40 } 41 ``` 42 43 ### 只上报私聊或特定群组的非匿名消息 44 45 ```json 46 { 47 ".or": [ 48 { 49 "message_type": "private" 50 }, 51 { 52 "message_type": "group", 53 "group_id": { 54 ".in": [ 55 123456 56 ] 57 }, 58 "anonymous": { 59 ".eq": null 60 } 61 } 62 ] 63 } 64 ``` 65 66 ### 只上报群组 11111、22222、33333 中不是用户 12345 发送的消息,以及用户 66666 发送的所有消息 67 68 ```json 69 { 70 ".or": [ 71 { 72 "group_id": { 73 ".in": [11111, 22222, 33333] 74 }, 75 "user_id": { 76 ".neq": 12345 77 } 78 }, 79 { 80 "user_id": 66666 81 } 82 ] 83 } 84 ``` 85 86 ### 一个更复杂的例子 87 88 ```json 89 { 90 ".or": [ 91 { 92 "message_type": "private", 93 "user_id": { 94 ".not": { 95 ".in": [11111, 22222, 33333] 96 }, 97 ".neq": 44444 98 } 99 }, 100 { 101 "message_type": { 102 ".regex": "group|discuss" 103 }, 104 ".or": [ 105 { 106 "group_id": 12345 107 }, 108 { 109 "raw_message": { 110 ".contains": "通知" 111 } 112 } 113 ] 114 } 115 ] 116 } 117 ``` 118 119 ## 进阶指南 120 121 1. 对于嵌套的值,可以使用 `.` 进行简化,如 122 123 ```json 124 { 125 "sender": { 126 "sex": "male" 127 } 128 } 129 ``` 130 131 与下面的配置文件作用相同 132 133 ```json 134 { 135 "sender.sex": "male" 136 } 137 ``` 138 139 2. 对于数组,可以使用数字索引,如 140 ```json 141 { 142 "message.0.type": "text" 143 } 144 ``` 145 146 更多进阶语法请参考[GJSON语法](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) 147 148 ## 语法说明 149 150 过滤规则最外层是一个 JSON 对象,其中的键,如果以 `.`(点号)开头,则表示运算符,其值为运算符的参数,如果不以 `.` 开头,则表示对事件数据对象中相应键的过滤。过滤规则中任何一个对象,只有在它的所有项都匹配的情况下,才会让事件通过(等价于一个 `and` 运算);其中,不以 `.` 开头的键,若其值不是对象,则只有在这个值和事件数据相应值相等的情况下,才会通过(等价于一个 `eq` 运算符)。 151 152 下面列出所有运算符(「要求的参数类型」是指运算符的键所对应的值的类型,「可作用于的类型」是指在过滤时事件对象相应值的类型): 153 154 | 运算符 | 要求的参数类型 | 可作用于的类型 | 155 | ----------- | -------------------------- | ----------------------------------------------------- | 156 | `.not` | object | 任何 | 157 | `.and` | object | 若参数中全为运算符,则任何;若不全为运算符,则 object | 158 | `.or` | array(数组元素为 object) | 任何 | 159 | `.eq` | 任何 | 任何 | 160 | `.neq` | 任何 | 任何 | 161 | `.in` | string/array | 若参数为 string,则 string;若参数为 array,则任何 | 162 | `.contains` | string | string | 163 | `.regex` | string | string | 164 165 166 ## 过滤时的事件数据对象 167 168 过滤器在go-cqhttp构建好事件数据后运行,各事件的数据字段见[OneBot标准]( https://github.com/botuniverse/onebot-11/blob/master/event/README.md )。 169 170 这里有几点需要注意: 171 172 - `message` 字段在运行过滤器时和上报信息类型相同(见 [消息格式]( https://github.com/botuniverse/onebot-11/blob/master/message/array.md )) 173 - `raw_message` 字段为未经**CQ码**处理的原始消息字符串,这意味着其中可能会出现形如 `[CQ:face,id=123]` 的 CQ 码