Skip to content

et 用户任务清单动态订阅 - (IFeishuUserV2TaskActivitySubscriptions)

功能描述

任务清单动态订阅功能,允许用户为任务清单创建和管理个人订阅,当清单发生相应事件时会向订阅者发送通知消息。该接口使用用户令牌进行认证,适用于个人用户对自己关注任务清单的订阅管理。

参考文档

https://open.feishu.cn/document/task-v2/tasklist-activity_subscription/create

函数列表

函数名称功能描述认证方式HTTP 方法
CreateActivitySubscriptionsAsync为一个清单创建一个个人订阅,包含1个或多个订阅者用户令牌POST
GetActivitySubscriptionsByIdAsync获取指定个人订阅的详细信息,包括名称、订阅者、可通知的event key列表等用户令牌GET
GetActivitySubscriptionsListByIdAsync获取指定清单的所有个人订阅信息,按照订阅的创建时间排序用户令牌GET
UpdateActivitySubscriptionsByIdAsync更新指定清单的个人动态订阅信息用户令牌PATCH
DeleteActivitySubscriptionsByIdAsync删除指定的个人动态订阅,删除后的数据不可恢复用户令牌DELETE

函数详细内容

创建动态订阅

函数签名

csharp
Task<FeishuApiResult<TasklistActivitySubscriptionResult>?> CreateActivitySubscriptionsAsync(
    [Path] string tasklist_guid,
    [Body] CreateActivitySubscriptionsRequest createActivitySubscriptionsRequest,
    [Query("user_id_type")] string user_id_type = Consts.User_Id_Type,
    CancellationToken cancellationToken = default);

认证:用户令牌

参数

  • tasklist_guid (string): 任务清单全局唯一GUID,示例值:"d300a75f-c56a-4be9-80d1-e47653028ceb"
  • createActivitySubscriptionsRequest (CreateActivitySubscriptionsRequest): 创建动态订阅请求体
  • user_id_type (string): 用户ID类型,默认值为Consts.User_Id_Type
  • cancellationToken (CancellationToken): 取消操作令牌对象

响应

json
{
  "code": 0,
  "data": {
    "activity_subscription": {
      "activity_subscription_guid": "33991879-704f-444f-81d7-55a6aa7be80c",
      "name": "我的项目订阅",
      "tasklist_guid": "d300a75f-c56a-4be9-80d1-e47653028ceb",
      "subscribers": [
        {
          "subscriber_id": "chat_personal",
          "subscriber_type": "chat",
          "name": "个人群聊"
        }
      ],
      "event_keys": ["task.created", "task.completed"]
    }
  },
  "msg": "success"
}

说明:为一个清单创建一个个人订阅。每个订阅可以包含1个或多个订阅者(目前只支持普通群组)。订阅创建后,如清单发生相应的事件,则会向订阅里的订阅者发送通知消息。一个清单最多可以创建50个订阅。每个订阅最大支持50个订阅者。

代码示例

typescript
const createActivitySubscriptionsRequest = {
  name: "个人工作订阅",
  subscribers: [
    {
      subscriber_id: "chat_my_work_group",
      subscriber_type: "chat"
    },
    {
      subscriber_id: "chat_notifications",
      subscriber_type: "chat"
    }
  ],
  event_keys: [
    "task.created",
    "task.completed",
    "task.due_date_changed",
    "task.assigned"
  ]
};

const response = await feishuUserClient.createActivitySubscriptions(
  "d300a75f-c56a-4be9-80d1-e47653028ceb",
  createActivitySubscriptionsRequest
);

console.log("个人动态订阅创建成功:", response.data.activity_subscription);

获取动态订阅详情

函数签名

csharp
Task<FeishuApiResult<TasklistActivitySubscriptionResult>?> GetActivitySubscriptionsByIdAsync(
   [Path] string tasklist_guid,
   [Path] string activity_subscription_guid,
   [Query("user_id_type")] string user_id_type = Consts.User_Id_Type,
   CancellationToken cancellationToken = default);

认证:用户令牌

参数

  • tasklist_guid (string): 任务清单全局唯一GUID,示例值:"d300a75f-c56a-4be9-80d1-e47653028ceb"
  • activity_subscription_guid (string): 订阅GUID,示例值:"33991879-704f-444f-81d7-55a6aa7be80c"
  • user_id_type (string): 用户ID类型,默认值为Consts.User_Id_Type
  • cancellationToken (CancellationToken): 取消操作令牌对象

响应

json
{
  "code": 0,
  "data": {
    "activity_subscription": {
      "activity_subscription_guid": "33991879-704f-444f-81d7-55a6aa7be80c",
      "name": "个人项目订阅",
      "tasklist_guid": "d300a75f-c56a-4be9-80d1-e47653028ceb",
      "subscribers": [
        {
          "subscriber_id": "chat_personal",
          "subscriber_type": "chat",
          "name": "个人群聊"
        }
      ],
      "event_keys": ["task.created", "task.completed"],
      "created": "2024-01-01T10:00:00Z",
      "updated": "2024-01-01T15:30:00Z"
    }
  },
  "msg": "success"
}

说明:提供一个清单的GUID和一个订阅的GUID,获取该个人订阅的详细信息,包括名称,订阅者,可通知的event key列表等。

代码示例

typescript
const response = await feishuUserClient.getActivitySubscriptionsById(
  "d300a75f-c56a-4be9-80d1-e47653028ceb",
  "33991879-704f-444f-81d7-55a6aa7be80c"
);

const subscription = response.data.activity_subscription;
console.log("个人订阅详情:", subscription);
console.log("订阅者信息:", subscription.subscribers);
console.log("监听事件类型:", subscription.event_keys);
console.log("创建时间:", subscription.created);
console.log("最后更新时间:", subscription.updated);

// 检查是否监听特定事件
const hasTaskCreatedEvent = subscription.event_keys.includes("task.created");
console.log("是否监听任务创建事件:", hasTaskCreatedEvent);

获取动态订阅列表

函数签名

csharp
Task<FeishuApiListResult<TasklistActivitySubscriptionInfo>?> GetActivitySubscriptionsListByIdAsync(
   [Path] string tasklist_guid,
   [Query("limit")] int limit = 50,
   [Query("user_id_type")] string user_id_type = Consts.User_Id_Type,
   CancellationToken cancellationToken = default);

认证:用户令牌

参数

  • tasklist_guid (string): 任务清单全局唯一GUID,示例值:"d300a75f-c56a-4be9-80d1-e47653028ceb"
  • limit (int): 返回结果的最大数量,默认值:50
  • user_id_type (string): 用户ID类型,默认值为Consts.User_Id_Type
  • cancellationToken (CancellationToken): 取消操作令牌对象

响应

json
{
  "code": 0,
  "data": {
    "items": [
      {
        "activity_subscription_guid": "33991879-704f-444f-81d7-55a6aa7be80c",
        "name": "个人工作订阅",
        "tasklist_guid": "d300a75f-c56a-4be9-80d1-e47653028ceb",
        "subscriber_count": 2,
        "event_count": 4,
        "created": "2024-01-01T10:00:00Z",
        "updated": "2024-01-01T15:30:00Z"
      },
      {
        "activity_subscription_guid": "44992980-815g-555g-92e8-66b7bb8cf91d",
        "name": "学习计划订阅",
        "tasklist_guid": "d300a75f-c56a-4be9-80d1-e47653028ceb",
        "subscriber_count": 1,
        "event_count": 2,
        "created": "2024-01-02T09:15:00Z",
        "updated": "2024-01-02T09:15:00Z"
      }
    ]
  },
  "msg": "success"
}

说明:给定一个清单的GUID,获取该清单下所有的个人订阅信息。结果按照订阅的创建时间排序。

代码示例

typescript
// 获取个人在清单中的所有订阅
const response = await feishuUserClient.getActivitySubscriptionsListById(
  "d300a75f-c56a-4be9-80d1-e47653028ceb",
  {
    limit: 100 // 获取最多100个个人订阅
  }
);

const subscriptions = response.data.items;
console.log("个人订阅列表:", subscriptions);

// 分析个人订阅情况
const totalSubscriptions = subscriptions.length;
const totalSubscribers = subscriptions.reduce((sum, sub) => sum + sub.subscriber_count, 0);
const avgEventsPerSubscription = subscriptions.reduce((sum, sub) => sum + sub.event_count, 0) / totalSubscriptions;

console.log(`个人共有 ${totalSubscriptions} 个订阅`);
console.log(`涉及 ${totalSubscribers} 个订阅者`);
console.log(`平均每个订阅监听 ${avgEventsPerSubscription.toFixed(1)} 个事件`);

// 按创建时间分组统计
const subscriptionsByDate = subscriptions.reduce((acc, sub) => {
  const date = new Date(sub.created).toLocaleDateString();
  if (!acc[date]) acc[date] = [];
  acc[date].push(sub);
  return acc;
}, {});

console.log("按创建日期统计的订阅:", subscriptionsByDate);

// 找出最近创建的订阅
const recentSubscriptions = subscriptions
  .filter(sub => {
    const createdDate = new Date(sub.created);
    const threeDaysAgo = new Date();
    threeDaysAgo.setDate(threeDaysAgo.getDate() - 3);
    return createdDate > threeDaysAgo;
  })
  .sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime());

console.log("最近3天创建的订阅:", recentSubscriptions);

更新动态订阅

函数签名

csharp
Task<FeishuApiListResult<TasklistActivitySubscriptionResult>?> UpdateActivitySubscriptionsByIdAsync(
      [Path] string tasklist_guid,
      [Path] string activity_subscription_guid,
      [Body] UpdateActivitySubscriptionsRequest updateActivitySubscriptionsRequest,
      [Query("user_id_type")] string user_id_type = Consts.User_Id_Type,
      CancellationToken cancellationToken = default);

认证:用户令牌

参数

  • tasklist_guid (string): 任务清单全局唯一GUID,示例值:"d300a75f-c56a-4be9-80d1-e47653028ceb"
  • activity_subscription_guid (string): 订阅GUID,示例值:"33991879-704f-444f-81d7-55a6aa7be80c"
  • updateActivitySubscriptionsRequest (UpdateActivitySubscriptionsRequest): 更新动态订阅请求体
  • user_id_type (string): 用户ID类型,默认值为Consts.User_Id_Type
  • cancellationToken (CancellationToken): 取消操作令牌对象

响应

json
{
  "code": 0,
  "data": [
    {
      "activity_subscription_guid": "33991879-704f-444f-81d7-55a6aa7be80c",
      "name": "更新后的个人订阅",
      "tasklist_guid": "d300a75f-c56a-4be9-80d1-e47653028ceb",
      "subscribers": [
        {
          "subscriber_id": "chat_updated_group",
          "subscriber_type": "chat",
          "name": "更新后的群聊"
        }
      ],
      "event_keys": ["task.created", "task.completed", "task.due_date_changed", "task.assigned", "task.updated"],
      "created": "2024-01-01T10:00:00Z",
      "updated": "2024-01-02T14:20:00Z"
    }
  ],
  "msg": "success"
}

说明:提供一个清单的GUID和一个个人动态订阅的GUID,对其进行更新。更新时,将update_fields字段中填写所有要修改的字段名,同时在activity_subscription字段中填写要修改的字段的新值即可。

代码示例

typescript
const updateActivitySubscriptionsRequest = {
  update_fields: ["name", "subscribers", "event_keys"],
  activity_subscription: {
    name: "优化后的个人订阅",
    subscribers: [
      {
        subscriber_id: "chat_primary_group",
        subscriber_type: "chat"
      },
      {
        subscriber_id: "chat_backup_group",
        subscriber_type: "chat"
      }
    ],
    event_keys: [
      "task.created",
      "task.completed", 
      "task.due_date_changed",
      "task.assigned",
      "task.updated",
      "task.deleted",
      "task.comment_added"
    ]
  }
};

const response = await feishuUserClient.updateActivitySubscriptionsById(
  "d300a75f-c56a-4be9-80d1-e47653028ceb",
  "33991879-704f-444f-81d7-55a6aa7be80c",
  updateActivitySubscriptionsRequest
);

const updatedSubscription = response.data[0];
console.log("个人订阅更新成功:", updatedSubscription);
console.log("更新后的名称:", updatedSubscription.name);
console.log("更新后订阅者数量:", updatedSubscription.subscribers.length);
console.log("更新后监听的事件数量:", updatedSubscription.event_keys.length);

// 验证特定事件是否被添加
const hasCommentEvent = updatedSubscription.event_keys.includes("task.comment_added");
console.log("是否监听评论事件:", hasCommentEvent);

删除动态订阅

函数签名

csharp
Task<FeishuNullDataApiResult?> DeleteActivitySubscriptionsByIdAsync(
  [Path] string tasklist_guid,
  [Path] string activity_subscription_guid,
  [Query("user_id_type")] string user_id_type = Consts.User_Id_Type,
  CancellationToken cancellationToken = default);

认证:用户令牌

参数

  • tasklist_guid (string): 任务清单全局唯一GUID,示例值:"d300a75f-c56a-4be9-80d1-e47653028ceb"
  • activity_subscription_guid (string): 订阅GUID,示例值:"33991879-704f-444f-81d7-55a6aa7be80c"
  • user_id_type (string): 用户ID类型,默认值为Consts.User_Id_Type
  • cancellationToken (CancellationToken): 取消操作令牌对象

响应

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

说明:给定一个清单的GUID和个人订阅的GUID,将其删除。删除后的数据不可恢复,请谨慎操作。

代码示例

typescript
const response = await feishuUserClient.deleteActivitySubscriptionsById(
  "d300a75f-c56a-4be9-80d1-e47653028ceb",
  "33991879-704f-444f-81d7-55a6aa7be80c"
);

if (response.code === 0) {
  console.log("个人动态订阅删除成功");
} else {
  console.log("删除失败:", response.msg);
}

// 安全删除:先检查订阅是否存在,确认后再删除
async function safeDeleteSubscription(tasklistGuid, subscriptionGuid, subscriptionName) {
  try {
    // 检查订阅是否存在
    const checkResponse = await feishuUserClient.getActivitySubscriptionsById(
      tasklistGuid,
      subscriptionGuid
    );
    
    const subscription = checkResponse.data.activity_subscription;
    console.log(`确认删除订阅: ${subscription.name}`);
    console.log(`监听事件: ${subscription.event_keys.join(", ")}`);
    
    // 用户确认后删除
    const deleteResponse = await feishuUserClient.deleteActivitySubscriptionsById(
      tasklistGuid,
      subscriptionGuid
    );
    
    if (deleteResponse.code === 0) {
      console.log(`订阅 "${subscriptionName}" 已成功删除`);
    }
    
  } catch (error) {
    console.log(`订阅不存在或已被删除: ${error.message}`);
  }
}

// 使用安全删除
await safeDeleteSubscription(
  "d300a75f-c56a-4be9-80d1-e47653028ceb",
  "33991879-704f-444f-81d7-55a6aa7be80c",
  "个人工作订阅"
);

个人订阅管理场景示例

创建个人订阅生态系统

typescript
const tasklistGuid = "d300a75f-c56a-4be9-80d1-e47653028ceb";

// 1. 创建工作相关订阅
const workSubscription = await feishuUserClient.createActivitySubscriptions(
  tasklistGuid,
  {
    name: "工作任务订阅",
    subscribers: [
      { subscriber_id: "chat_work_notifications", subscriber_type: "chat" }
    ],
    event_keys: ["task.created", "task.completed", "task.due_date_changed", "task.assigned"]
  }
);

// 2. 创建学习相关订阅
const studySubscription = await feishuUserClient.createActivitySubscriptions(
  tasklistGuid,
  {
    name: "学习计划订阅",
    subscribers: [
      { subscriber_id: "chat_study_group", subscriber_type: "chat" }
    ],
    event_keys: ["task.created", "task.completed"]
  }
);

// 3. 创建紧急任务订阅
const urgentSubscription = await feishuUserClient.createActivitySubscriptions(
  tasklistGuid,
  {
    name: "紧急任务订阅",
    subscribers: [
      { subscriber_id: "chat_urgent_alerts", subscriber_type: "chat" }
    ],
    event_keys: ["task.created", "task.due_date_changed"]
  }
);

console.log("个人订阅生态系统创建完成");

订阅优化管理

typescript
// 获取所有个人订阅并进行分析
const allSubscriptions = await feishuUserClient.getActivitySubscriptionsListById(
  tasklistGuid,
  { limit: 100 }
);

// 找出监听事件较少的订阅进行优化
const subscriptionsToOptimize = allSubscriptions.data.items.filter(
  sub => sub.event_count < 3
);

console.log("需要优化的订阅:", subscriptionsToOptimize);

// 批量优化订阅
for (const subscription of subscriptionsToOptimize) {
  await feishuUserClient.updateActivitySubscriptionsById(
    tasklistGuid,
    subscription.activity_subscription_guid,
    {
      update_fields: ["event_keys"],
      activity_subscription: {
        event_keys: [
          "task.created",
          "task.completed",
          "task.due_date_changed",
          "task.assigned",
          "task.updated"
        ]
      }
    }
  );
  
  console.log(`已优化订阅: ${subscription.name}`);
}

console.log("个人订阅优化完成");

订阅清理和维护

typescript
// 清理超过30天未更新的订阅
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);

const oldSubscriptions = allSubscriptions.data.items.filter(
  sub => new Date(sub.updated) < thirtyDaysAgo
);

console.log("超过30天未更新的订阅:", oldSubscriptions);

// 询问是否删除旧订阅
for (const oldSubscription of oldSubscriptions) {
  console.log(`发现旧订阅: ${oldSubscription.name} (最后更新: ${oldSubscription.updated})`);
  
  // 这里可以添加用户确认逻辑
  const shouldDelete = confirm(`是否删除订阅 "${oldSubscription.name}"?`);
  
  if (shouldDelete) {
    await feishuUserClient.deleteActivitySubscriptionsById(
      tasklistGuid,
      oldSubscription.activity_subscription_guid
    );
    console.log(`已删除旧订阅: ${oldSubscription.name}`);
  }
}