Skip to content

批量消息管理 -(FeishuTenantV1BatchMessage)

功能描述

用于管理给多个用户或者多个部门发送消息,支持发送文本、富文本、卡片、群名片、个人名片、图片、视频、音频、文件、表情包等类型。提供批量发送、撤回、查询已读状态、查询发送进度等功能。

适用场景:

  • 企业向多个员工批量发送通知公告
  • 向多个部门群发系统消息
  • 批量消息的发送状态追踪和撤回管理

参考文档

函数列表

函数名称功能描述认证方式HTTP 方法
BatchSendTextMessageAsync批量发送文本消息租户令牌POST
BatchSendRichTextMessageAsync批量发送富文本消息租户令牌POST
BatchSendImageMessageAsync批量发送图片消息租户令牌POST
BatchSendGroupShareMessageAsync批量发送群分享消息租户令牌POST
RevokeMessageAsync撤回批量消息租户令牌DELETE
GetUserReadMessageInfosAsync获取消息已读用户信息租户令牌GET
GetBatchMessageProgressAsync获取批量消息发送/撤回进度租户令牌GET

函数详细内容

批量发送文本消息

函数签名

csharp
Task<FeishuApiResult<BatchMessageResult>?> BatchSendTextMessageAsync(
    [Body] BatchSenderTextMessageRequest sendMessageRequest,
    CancellationToken cancellationToken = default);

认证:租户令牌 (TenantAccessToken)

参数

参数名类型必填说明
sendMessageRequestBatchSenderTextMessageRequest批量发送文本消息请求体
├─ UserIdsList<string>用户 user_id 列表,示例:["7cdcc7c2","ca51d83b"]
├─ UnionIdsList<string>用户 union_id 列表
├─ OpenIdsList<string>用户 open_id 列表
├─ DepartmentIdsList<string>部门 ID 列表
├─ MsgTypestring消息类型,固定为 "text"
└─ ContentMessageTextContent文本内容,包含 text 字段
cancellationTokenCancellationToken取消操作令牌

注意:至少需要填写一种用户标识(UserIds/UnionIds/OpenIds/DepartmentIds 之一)

响应

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "message_id": "om_dc13264520392913993dd051dba21dcf",
    "invalid_user_ids": ["invalid_id_1"],
    "invalid_open_ids": [],
    "invalid_union_ids": [],
    "invalid_department_ids": []
  }
}

说明

  • 消息将异步发送,返回的 message_id 可用于后续查询和撤回
  • 响应中 invalid_* 字段包含无效的用户/部门标识
  • 消息内容长度限制参考飞书官方文档

代码示例

csharp
// 批量发送文本通知给多个员工
public class NotificationService
{
    private readonly IFeishuTenantV1BatchMessage _batchMessageClient;

    public NotificationService(IFeishuTenantV1BatchMessage batchMessageClient)
    {
        _batchMessageClient = batchMessageClient;
    }

    public async Task SendHolidayNoticeAsync(List<string> employeeOpenIds)
    {
        var request = new BatchSenderTextMessageRequest
        {
            OpenIds = employeeOpenIds,
            Content = new MessageTextContent
            {
                Text = "【放假通知】全体员工请注意,国庆节放假时间为10月1日至10月7日,共7天。祝大家节日愉快!"
            }
        };

        var result = await _batchMessageClient.BatchSendTextMessageAsync(request);
        
        if (result?.Data != null)
        {
            Console.WriteLine($"消息ID: {result.Data.MessageId}");
            if (result.Data.InvalidOpenIds?.Any() == true)
            {
                Console.WriteLine($"无效用户: {string.Join(",", result.Data.InvalidOpenIds)}");
            }
        }
    }
}

批量发送富文本消息

函数签名

csharp
Task<FeishuApiResult<BatchMessageResult>?> BatchSendRichTextMessageAsync(
    [Body] BatchSenderRichTextMessageRequest sendMessageRequest,
    CancellationToken cancellationToken = default);

认证:租户令牌 (TenantAccessToken)

参数

参数名类型必填说明
sendMessageRequestBatchSenderRichTextMessageRequest批量发送富文本消息请求体
├─ UserIdsList<string>用户 user_id 列表
├─ UnionIdsList<string>用户 union_id 列表
├─ OpenIdsList<string>用户 open_id 列表
├─ DepartmentIdsList<string>部门 ID 列表
├─ MsgTypestring消息类型,固定为 "post"
└─ ContentMessagePostContent富文本内容,支持图文混排
cancellationTokenCancellationToken取消操作令牌

响应

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "message_id": "om_dc13264520392913993dd051dba21dcf",
    "invalid_user_ids": [],
    "invalid_open_ids": [],
    "invalid_union_ids": [],
    "invalid_department_ids": []
  }
}

代码示例

csharp
// 批量发送富文本通知
public async Task SendRichTextNoticeAsync(List<string> departmentIds)
{
    var request = new BatchSenderRichTextMessageRequest
    {
        DepartmentIds = departmentIds,
        Content = new MessagePostContent
        {
            Post = new PostContent
            {
                Title = "重要通知",
                Content = new List<List<PostItem>>
                {
                    new List<PostItem>
                    {
                        new PostItem { Tag = "text", Text = "全体员工请注意:" }
                    },
                    new List<PostItem>
                    {
                        new PostItem { Tag = "a", Text = "点击查看详情", Href = "https://example.com" }
                    }
                }
            }
        }
    };

    var result = await _batchMessageClient.BatchSendRichTextMessageAsync(request);
    Console.WriteLine($"发送结果: {result?.Data?.MessageId}");
}

批量发送图片消息

函数签名

csharp
Task<FeishuApiResult<BatchMessageResult>?> BatchSendImageMessageAsync(
    [Body] BatchSenderMessageImageRequest sendMessageRequest,
    CancellationToken cancellationToken = default);

认证:租户令牌 (TenantAccessToken)

参数

参数名类型必填说明
sendMessageRequestBatchSenderMessageImageRequest批量发送图片消息请求体
├─ UserIdsList<string>用户 user_id 列表
├─ UnionIdsList<string>用户 union_id 列表
├─ OpenIdsList<string>用户 open_id 列表
├─ DepartmentIdsList<string>部门 ID 列表
├─ MsgTypestring消息类型,固定为 "image"
└─ ContentMessageImageContent图片内容,包含 image_key 字段
cancellationTokenCancellationToken取消操作令牌

说明

  • image_key 需先通过上传图片接口获取

批量发送群分享消息

函数签名

csharp
Task<FeishuApiResult<BatchMessageResult>?> BatchSendGroupShareMessageAsync(
    [Body] BatchSenderMessageGroupShareRequest sendMessageRequest,
    CancellationToken cancellationToken = default);

认证:租户令牌 (TenantAccessToken)

参数

参数名类型必填说明
sendMessageRequestBatchSenderMessageGroupShareRequest批量发送群分享消息请求体
├─ UserIdsList<string>用户 user_id 列表
├─ UnionIdsList<string>用户 union_id 列表
├─ OpenIdsList<string>用户 open_id 列表
├─ DepartmentIdsList<string>部门 ID 列表
├─ MsgTypestring消息类型,固定为 "share_chat"
└─ ContentMessageGroupShareContent群分享内容,包含 chat_id 字段
cancellationTokenCancellationToken取消操作令牌

撤回批量消息

函数签名

csharp
Task<FeishuNullDataApiResult?> RevokeMessageAsync(
    [Path] string batch_message_id,
    CancellationToken cancellationToken = default);

认证:租户令牌 (TenantAccessToken)

参数

参数名类型必填说明
batch_message_idstring待撤回的批量消息任务 ID,即批量发送消息接口返回值中的 message_id
cancellationTokenCancellationToken取消操作令牌

响应

json
{
  "code": 0,
  "msg": "success"
}

说明

  • 只能撤回通过批量发送接口发送的消息
  • 撤回操作是异步的,需要通过 GetBatchMessageProgressAsync 查询撤回进度

代码示例

csharp
// 撤回已发送的批量消息
public async Task RevokeBatchMessageAsync(string messageId)
{
    var result = await _batchMessageClient.RevokeMessageAsync(messageId);
    if (result?.Code == 0)
    {
        Console.WriteLine("撤回请求已提交,正在异步处理");
        
        // 查询撤回进度
        var progress = await _batchMessageClient.GetBatchMessageProgressAsync(messageId);
        Console.WriteLine($"撤回进度: {progress?.Data?.BatchMessageRecallProgress?.SuccessCount}");
    }
}

获取消息已读用户信息

函数签名

csharp
Task<FeishuApiResult<BatchMessageReadStatusResult>?> GetUserReadMessageInfosAsync(
    [Path] string batch_message_id,
    CancellationToken cancellationToken = default);

认证:租户令牌 (TenantAccessToken)

参数

参数名类型必填说明
batch_message_idstring批量消息任务 ID
cancellationTokenCancellationToken取消操作令牌

响应

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "read_user": {
      "total_count": 100,
      "read_count": 85
    }
  }
}

代码示例

csharp
// 查询消息阅读统计
public async Task CheckReadStatusAsync(string messageId)
{
    var result = await _batchMessageClient.GetUserReadMessageInfosAsync(messageId);
    if (result?.Data?.ReadUser != null)
    {
        var readUser = result.Data.ReadUser;
        double readRate = (double)readUser.ReadCount / readUser.TotalCount * 100;
        Console.WriteLine($"已读人数: {readUser.ReadCount}/{readUser.TotalCount} ({readRate:F1}%)");
    }
}

获取批量消息进度

函数签名

csharp
Task<FeishuApiResult<BatchMessageProgressResult>?> GetBatchMessageProgressAsync(
    [Path] string batch_message_id,
    CancellationToken cancellationToken = default);

认证:租户令牌 (TenantAccessToken)

参数

参数名类型必填说明
batch_message_idstring批量消息任务 ID
cancellationTokenCancellationToken取消操作令牌

响应

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "batch_message_send_progress": {
      "total_count": 100,
      "success_count": 95,
      "fail_count": 5
    },
    "batch_message_recall_progress": {
      "total_count": 100,
      "success_count": 90,
      "fail_count": 10
    }
  }
}

说明

  • 可用于查询批量发送消息的发送进度
  • 也可用于查询批量撤回消息的撤回进度

代码示例

csharp
// 轮询查询批量消息发送进度
public async Task MonitorSendProgressAsync(string messageId)
{
    while (true)
    {
        var result = await _batchMessageClient.GetBatchMessageProgressAsync(messageId);
        var progress = result?.Data?.BatchMessageSendProgress;
        
        if (progress != null)
        {
            Console.WriteLine($"进度: {progress.SuccessCount}/{progress.TotalCount}");
            
            if (progress.SuccessCount + progress.FailCount >= progress.TotalCount)
            {
                Console.WriteLine("发送完成");
                break;
            }
        }
        
        await Task.Delay(2000); // 等待2秒后再次查询
    }
}