飞书机器人开发-单聊与群聊

1,699 阅读4分钟

用户反馈完整链路

  1. 飞书机器人及消息推送
  2. 群内机器人消息推送流程图

流程图.jpeg

机器人在群内可以通过工号推送text类型的消息,并@指定用户,但是当消息类型为富文本、消息卡片时@ 固定同学需要拥有单聊的发送和接收权限

  1. 系统流程图

系统流程图.jpeg

  1. 消息卡片DEMO

image.png 5. ##### 反馈流程

反馈流程.jpeg

  1. 飞书消息模版
{

  "config": {

    "wide_screen_mode": true

  },

  "header": {

    "template": "yellow",

    "title": {

      "content": "ABM用户反馈通知",

      "tag": "plain_text"

    }

  },

  "elements": [

  ...

  ]

}
  1. 飞书机器人开发详细步骤

  • 进入应用首页,获取校验信息,将在后续的开发中用于获取token

  • 根据凭证调用接口获取tenant_access_token

官方说明文档

url:https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal



body:

{

    "app_id": "XXXX",

    "app_secret": "XXXX"

}



res:

{

    "code": 0,

    "msg": "success",

    "tenant_access_token": "t-XXX",

    "expire": 7140

}
  • 应用权限限制及解决方案

出于安全因素考量,如果飞书机器人需要向指定用户发送飞书消息,需要满足如图7.1所示的条件,而更改应用权限需要发版并审核如图7.2,这边可以联系公司的审核大大。

为提升开发效率,减轻审核成本,飞书官方提供了测试企业入口,开发人员在测试企业中将获得所有权限,并且拥有全体用户组。测试企业创建入口如图7.3 值得注意的是,在创建完后需要采用手机号登录的方式进入飞书才能看到测试企业,并且需要采用无痕浏览或另一浏览器的方式区别原先的飞书登录。 官方参考文档

后续操作步骤均建立在测试企业环境或正式环境且已获取相应权限的基础上进行说明, 用户反馈系统涉及机器人名义对用户的消息推送以及对群消息的推送,这边将以用户反馈应用为例介绍消息发送的详细步骤

首先介绍用户单聊消息的推送 官方文档

消息发送接口

url:https://open.feishu.cn/open-apis/im/v1/messages



params:

{

    "receive_id_type":open_id(应用内id)/user_id(工号)/union_id/email/chat_id(群聊ID)

}



body:

{

    "receive_id": "XXX",

    "content": "{"text":"<at user_id=\"XXX\">Tom</at> test content"}",

    "msg_type": "text"

}

res:

{

    "code": 0,

    "msg": "success",

    "data": {

        "message_id": "XXX",

        "root_id": "XXX",

        "parent_id": "XXX",

        "msg_type": "card",

        "create_time": "1615380573411",

        "update_time": "1615380573411",

        "deleted": false,

        "updated": false,

        "chat_id": "oc_5ad11d72b830411d72b836c20",

        "sender": {

            "id": "cli_9f427eec54ae901b",

            "id_type": "app_id",

            "sender_type": "app",

            "tenant_key": "736588c9260f175e"

        },

        "body": {

            "content": "text:测试消息"

        },

        "mentions": [

            {

                "key": "@_user_1",

                "id": "ou_155184d1e73cbfb8973e5a9e698e74f2",

                "id_type": "open_id",

                "name": "Tom",

                "tenant_key": "736588c9260f175e"

            }

        ],

        "upper_message_id": "om_40eb06e7b84dc71c03e009ad3c754195"

    }

}

msg_type 消息类型 包括:text、post、image、file、audio、media、sticker、interactive、share_chat、share_user等

其中通知群常用的是富文本类型和text类型,用户反馈应用将构造消息卡片作为消息类型,构造消息卡片可以通过消息卡片搭建工具实现。

消息发送表单的content部分需要时string类型,因此,采用node.js在编辑完JSON对象后需要 JSON.stringify(content)

项目。随后调用接口即可完成单聊。目前content的JSON对象支持字符串拼接""+"",但是自测貌似不支持模版字符串的使用。因此,@成员的字符串构建也采用如下方法

body.manager.forEach((ele: { jobNumber: any; }) => {

    managerStr+=`<at id=${ele.jobNumber}></at>`;

  });

  

"content": "**反馈进度**\n您在应用**"+body.name+"**中反馈的问题已通知到该系统责任人\n"+managerStr+"\n反馈进度将持续通知到您",

如果需要发送机器人群消息,需要先把机器人拉近群聊

随后调用接口,获得机器人所在群列表,并将消息发送接口中的将receive_id_type改为chat_id

chat_id获取接口

url:https://open.feishu.cn/open-apis/im/v1/chats



body:

{

}

res:

{

    "code": 0,

    "msg": "success",

    "data": {

        "items": [

            {

                "chat_id": "XXX",

                "avatar": "https://p3-lark-file.byteimg.com/img/lark-avatar-staging/default-avatar_44ae0ca3-e140-494b-956f-78091e348435~100x100.jpg",

                "name": "测试群名称",

                "description": "测试群描述",

                "owner_id": "4d7a3c6g",

                "owner_id_type": "user_id",

                "external": false,

                "tenant_key": "736588c9260f175e"

            }

        ],

        "page_token": "XXX",

        "has_more": false

    }

}
  1. 改进点
  • 目前未能实现图片的上传,飞书消息的图片上传需要调用接口(固定),根据二进制流获取图片key,并在消息用key实现图片显示,该需求优先级较低,后续可做。
  • 受限于公司应用的网关拦截及环境隔离,飞书方对单个应用发起的接口url是单一的,消息卡片的更新难以实现,影响了一定的交互能力。