# 步骤二：配置消息处理业务逻辑

当用户在飞书会话中向应用机器人发送消息时，应用会向服务端请求地址发送 **接收消息** 事件。服务收到事件数据后，需要根据消息内容匹配并返回命中的百科信息。本教程仅介绍服务端代码的处理逻辑，并提供 JavaScript 示例代码。你需要根据本地服务的实际情况，自行完善代码以实现事件处理与消息发送。

## 代码逻辑说明

1. 接收开放平台应用发送的事件回调数据。

数据内容示例如下，包含消息发送者以及消息内容相关信息。

```JSON
    {
        "schema": "2.0",
        "header": {
            "event_id": "5e3702a84e847582be8db7fb73283c02", // 事件ID
            "event_type": "im.message.receive_v1", // 事件类型
            "create_time": "1608725989000",// 事件创建时间
            "token": "rvaYgkND1GOiu5MM0E1rncYC6PLtF7JV", //事件 Token
            "app_id": "cli_9f5343c580712544", // 应用 ID
            "tenant_key": "2ca1d211f64f6438" // 租户 Key
        },
        "event": {
            "sender": {
                "sender_id": { // 用户 ID 信息集
                    "union_id": "on_8ed6aa67826108097d9ee143816345",
                    "user_id": "e33ggbyz",
                    "open_id": "ou_84aad35d084aa403a838cf73ee18467"
                },
                "sender_type": "user", // 消息发送者类型
                "tenant_key": "736588c9260f175e" // 租户在飞书上的唯一标识
            },
            "message": {
                "message_id": "om_5ce6d572455d361153b7cb51da133945", // 消息 ID
                "root_id": "om_5ce6d572455d361153b7cb5xxfsdfsdfdsf", // 根消息 ID
                "parent_id": "om_5ce6d572455d361153b7cb5xxfsdfsdfdsf", // 父消息的 ID
                "create_time": "1609073151345", // 消息发送时间
                "chat_id": "oc_5ce6d572455d361153b7xx51da133945", // 消息所在的群组 ID
                "chat_type": "group", // 消息所在的群组类型
                "message_type": "text", // 消息类型
                "content": "{\"text\":\"@_user_1 hello\"}", //消息内容
                "mentions": [ // 被提及用户的信息
                    {
                        "key": "@_user_1",
                        "id": { // 用户 ID 信息集
                            "union_id": "on_8ed6aa67826108097d9ee143816345",
                            "user_id": "e33ggbyz",
                            "open_id": "ou_84aad35d084aa403a838cf73ee18467"
                        },
                        "name": "Tom", // 用户名称
                        "tenant_key": "736588c9260f175e" // 租户在飞书上的唯一标识
                    }
                ]
            }
        }
    }
   ```

2. 识别数据中的事件内容。

由于订阅的事件可能不止一个，因此需要通过 **接收消息** 事件的特征，识别该事件。根据 [接收消息](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/events/receive) 事件文档，获取该事件的关键特征：事件类型（`header.event_type`）为`im.message.receive_v1`。

3. 提取用户发送消息的内容与 ID。

- 在接收消息事件参数中，用户发送的内容包含在`event.message.content`字段，该字段是一个序列化的 JSON 字符串，因此需要反序列化后再使用。

后续需要根据用户发送的内容进行业务处理，搜索与内容相关的百科信息。

- 在接收消息事件参数中，用户发送消息的 ID 对应`event.message.message_id`字段。

后续通过`message_id`定位并回复用户。

4. 进行业务逻辑处理。

例如，基于用户消息内容，在企业内网搜索并保存相匹配的百科信息。

5. 调用开发平台的[回复消息](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/reply)接口，将保存的百科信息通过`message_id`回复给用户。

## 示例代码

整体逻辑用 JavaScript 代码描述如下。

```JavaScript
const axios = require('axios')
// 假设data为回调过来的事件体原始内容
function keywords_search(data) {
    if (data.header.event_type !== 'im.message.receive_v1') {
        return
    }
    // 获取消息内容和message id
    const {content, message_id} = data.event.message
    // 反序列化，得到用户输入的内容
    const {text} = JSON.parse(content)
    // 这里是自定义业务逻辑处理
    const resp = await custom_business_logic(text)
    if (resp.code !== 0) {
        return resp
    }
    // 拿到业务处理结果
    const result = resp.data
    const card = `{
  "header": {
    "title": {
      "tag": "lark_md",
      "i18n": {
        "zh_cn": "🔍 抓手"
      }
    },
    "template": "blue"
  },
  "i18n_elements": {
    "zh_cn": [
      {
        "tag": "div",
        "fields": [
          {
            "is_short": false,
            "text": {
              "tag": "lark_md",
              "content": "result",
            }
          }
        ]
      }
    ]
  }
}`
    try {
        const resp = await axios.post("https://open.feishu.cn/open-apis/im/v1/messages/${message_id}/reply", {
            msg_type: "interactive",
            content: "${JSON.stringify({card})}",
        })
        return {
            code: resp.data.code,
            msg: resp.data.msg
        }
    } catch(e) {
        return {
            code: -1,
            msg: "${e}"
        }
    }
}
```