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 码