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}`);
}
}