Skip to content

MudFeishu

📖 项目简介

MudFeishu 是一套现代化的企业级 .NET 飞书 API 集成 SDK,提供完整的 HTTP API 调用、WebSocket 实时事件订阅和 Webhook 事件处理能力。SDK 采用策略模式和工厂模式设计,内置自动令牌管理、智能重试、高性能缓存等企业级特性,大幅简化飞书应用的开发难度。

✨ 核心优势

  • 🚀 极简API - 一行代码完成服务注册,开箱即用
  • 🏗️ 类型安全 - 强类型数据模型,编译时类型检查
  • 🔄 自动令牌管理 - 智能缓存和刷新,无需手动维护
  • 🛡️ 企业级稳定 - 统一异常处理、智能重试、详细日志
  • 🎯 事件驱动 - 策略模式事件处理,灵活扩展
  • 📊 多框架支持 - .NET Standard 2.0、.NET 6.0、.NET 8.0、.NET 10.0

🏗️ 项目架构

整体架构图

mermaid
graph TB
    %% 简化的节点命名
    App["业务应用<br/>(Web/移动/微服务)"]
    Core["Mud.Feishu<br/>核心API客户端"]
    WebSocket["Mud.Feishu.WebSocket<br/>实时事件"]
    Webhook["Mud.Feishu.Webhook<br/>HTTP回调"]
    RedisExt["Mud.Feishu.Redis<br/>分布式去重"]
    Abstraction["Mud.Feishu.Abstractions<br/>事件抽象层"]
    Feishu[飞书开放平台]
    Config[配置]
    Logging[日志]

    %% 主要关系
    App --> Core
    App --> WebSocket
    App --> Webhook
    Webhook --> RedisExt

    %% SDK内部依赖
    Core --> Abstraction
    WebSocket --> Abstraction
    Webhook --> Abstraction
    RedisExt --> Abstraction

    %% 通信关系
    Core --> Feishu
    WebSocket --> Feishu
    Feishu --> Webhook

    %% 公共依赖
    Config -.-> Core
    Config -.-> WebSocket
    Config -.-> Webhook
    Config -.-> RedisExt

    Core -.-> Logging
    WebSocket -.-> Logging
    Webhook -.-> Logging
    RedisExt -.-> Logging

    %% 布局调整
    classDef app fill:#f9f,stroke:#333,stroke-width:2px;
    classDef sdk fill:#bbf,stroke:#333,stroke-width:2px;
    classDef infra fill:#bfb,stroke:#333,stroke-width:2px;

    class App app;
    class Core,WebSocket,Webhook,RedisExt,Abstraction sdk;
    class Feishu,Config,Logging infra;

模块功能对比

模块核心功能通信方式实时性适用场景
Mud.FeishuHTTP API 调用HTTP 请求低 (主动查询)数据查询、操作管理
Mud.Feishu.WebSocket实时事件订阅WebSocket 长连接高 (实时推送)实时通知、即时响应
Mud.Feishu.WebhookHTTP 回调处理HTTP 回调中 (被动接收)事件触发、异步处理
Mud.Feishu.Redis分布式去重Redis-多实例部署、防重复

📦 项目概览

组件描述NuGet下载
Mud.Feishu.Abstractions事件订阅抽象层,提供策略模式和工厂模式的事件处理架构NugetNuget
Mud.Feishu核心 HTTP API 客户端库,支持组织架构、消息、群聊等完整飞书功能NugetNuget
Mud.Feishu.WebSocket飞书 WebSocket 客户端,支持实时事件订阅和自动重连NugetNuget
Mud.Feishu.Webhook飞书 Webhook 事件处理组件,支持 HTTP 回调事件接收和处理NugetNuget
Mud.Feishu.RedisRedis 分布式去重扩展,支持多实例部署场景的事件去重NugetNuget

🚀 快速开始

1️⃣ 安装 NuGet 包

bash
# HTTP API 客户端 (核心模块)
dotnet add package Mud.Feishu

# 事件处理抽象层 (核心模块,Mud.Feishu/WebSocket/Webhook 依赖)
dotnet add package Mud.Feishu.Abstractions

# WebSocket 实时事件订阅 (可选)
dotnet add package Mud.Feishu.WebSocket

# Webhook HTTP 回调事件处理 (可选)
dotnet add package Mud.Feishu.Webhook

# Redis 分布式去重扩展 (可选)
dotnet add package Mud.Feishu.Redis

💡 提示:根据实际需求安装对应包,Mud.Feishu 是核心包,Mud.Feishu.Abstractions 已作为 Mud.Feishu\WebSocket\Webhook 的依赖自动安装。

2️⃣ 配置文件 (appsettings.json)

json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Mud.Feishu": "Debug"
    }
  },
  "FeishuApps": [
    {
      "AppKey": "default",
      "AppId": "your_feishu_app_id",
      "AppSecret": "your_feishu_app_secret",
      "BaseUrl": "https://open.feishu.cn",
      "TimeOut": 30,
      "RetryCount": 3,
      "RetryDelayMs": 1000,
      "EnableLogging": true
    }
  ],
  "WebSocket": {
    "AutoReconnect": true,
    "MaxReconnectAttempts": 5,
    "ReconnectDelayMs": 5000,
    "HeartbeatIntervalMs": 30000,
    "EnableLogging": true
  },
  "Webhook": {
    "GlobalRoutePrefix": "feishu",
    "EnableRequestLogging": true,
    "MaxConcurrentEvents": 10,
    "Apps": {
      "app1": {
        "AppKey": "cli_a1b2c3d4e5f6g7h8",
        "VerificationToken": "your_app1_verification_token",
        "EncryptKey": "your_app1_encrypt_key_32_bytes_long"
      },
      "app2": {
        "AppKey": "cli_h8g7f6e5d4c3b2a1",
        "VerificationToken": "your_app2_verification_token",
        "EncryptKey": "your_app2_encrypt_key_32_bytes_long"
      }
    }
  }
}

3️⃣ 服务注册 (Program.cs)

csharp
using Mud.Feishu;
using Mud.Feishu.WebSocket;
using Mud.Feishu.Webhook;

var builder = WebApplication.CreateBuilder(args);

// 注册多应用模式(方式一:从配置文件加载)
builder.Services.AddFeishuApp(builder.Configuration);

// 注册多应用模式(方式二:代码配置)
builder.Services.AddFeishuApp(configure =>
{
    config.AddDefaultApp("default", "cli_xxx", "dsk_xxx");
    config.AddApp("hr-app", "cli_yyy", "dsk_yyy", opt =>
    {
        opt.TimeOut = 45;
        opt.RetryCount = 5;
        opt.RetryDelayMs = 2000; // 新增:自定义重试延迟
    });
});

// 注册多应用模式(方式三:使用预构建的配置列表)
var configs = new List<FeishuAppConfig>
{
    new FeishuAppConfig { AppKey = "default", AppId = "cli_xxx", AppSecret = "dsk_xxx" }, // IsDefault 自动推断
    new FeishuAppConfig { AppKey = "hr-app", AppId = "cli_yyy", AppSecret = "dsk_yyy" }
};
builder.Services.AddFeishuApp(configs);

// 注册 HTTP API 服务(懒人模式 - 注册所有服务)
builder.Services.AddFeishuHttpClient();

// 注册 HTTP API 服务(构造者模式 - 按需注册)
builder.Services.CreateFeishuServicesBuilder()
    .AddOrganizationApi()
    .AddMessageApi()
    .AddChatGroupApi()
    .AddApprovalApi()
    .AddTaskApi()
    .AddCardApi()
    .Build();

// 注册 HTTP API 服务(按模块注册)
builder.Services.AddFeishuHttpClient(new[] {
    FeishuModule.Organization,
    FeishuModule.Message,
    FeishuModule.ChatGroup,
    FeishuModule.Approval
});

// 注册 WebSocket 事件订阅服务
builder.Services.CreateFeishuWebSocketServiceBuilder(builder.Configuration)
    .AddHandler<MessageEventHandler>()
    .Build();

// 注册 Webhook HTTP 回调事件服务
builder.Services.CreateFeishuWebhookServiceBuilder(builder.Configuration)
    .AddHandler<MessageReceiveEventHandler>()
    .AddHandler<DepartmentCreatedEventHandler>()
    .Build();

var app = builder.Build();

// 添加 Webhook 中间件
app.UseFeishuWebhook();

app.Run();

4️⃣ 验证配置

csharp
// 获取用户信息测试
public class TestController : ControllerBase
{
    private readonly IFeishuTenantV3User _userApi;

    public TestController(IFeishuTenantV3User userApi)
    {
        _userApi = userApi;
    }

    [HttpGet("test")]
    public async Task<IActionResult> TestConnection()
    {
        var result = await _userApi.GetUserInfoByIdAsync("test_user_id");
        return Ok(new { code = result.Code, message = result.Msg });
    }
}

🎯 核心功能

🏛️ Mud.Feishu.Abstractions - 事件处理抽象层

统一的事件处理架构,WebSocket 和 Webhook 共享相同的处理器接口

mermaid
graph LR
    A[事件源] --> B{事件类型}
    B -->|用户事件| C[UserEventHandler]
    B -->|部门事件| D[DepartmentEventHandler]
    B -->|消息事件| E[MessageEventHandler]
    B -->|未知事件| F[DefaultEventHandler]
功能特性说明
策略模式可扩展的事件处理器架构
工厂模式动态注册和发现处理器
类型安全强类型数据模型,编译时检查
自动去重内置事件 ID 去重机制
事件拦截器支持事件处理前后的拦截逻辑
基类处理器简化开发的专用基类

支持的基类处理器

  • DepartmentCreatedEventHandler - 部门创建
  • DepartmentDeleteEventHandler - 部门删除
  • DefaultFeishuEventHandler<T> - 通用处理器

新增工具类

  • UrlValidator - URL 白名单验证和 SSRF 防护
  • HttpRetryPolicyBuilder - HTTP 重试策略构建器(支持指数退避和抖动)

🌐 Mud.Feishu - HTTP API 客户端

完整的飞书 API 覆盖,自动令牌管理

模块分类API版本主要功能
🔐 认证授权V3应用令牌、租户令牌、用户令牌、OAuth 2.0
👥 组织架构V1/V3用户、部门、员工、用户组、职级、职务、角色
💬 消息服务V1文本/图片/卡片消息、批量发送、群聊管理
📋 审批流程V4审批定义、审批实例、审批操作
📝 任务管理V2任务创建、更新、分组、附件、评论
📅 日程会议V4日程事件、会议管理
.........

企业级特性

  • ✅ 自动令牌缓存和刷新
  • ✅ 智能重试机制(可配置重试次数和延迟)
  • ✅ 高性能缓存(解决缓存击穿)
  • ✅ 统一异常处理
  • ✅ 连接池管理
  • ✅ 详细日志记录
  • ✅ 多应用上下文切换支持

💡 提示查看完整 API 文档

🔄 Mud.Feishu.WebSocket - 实时事件订阅

基于 WebSocket 长连接的实时事件推送,支持智能连接管理和错误分类处理

mermaid
sequenceDiagram
    participant Client as 你的应用
    participant WS as Mud.Feishu.WebSocket
    participant Feishu as 飞书服务器

    Client->>WS: 1. 订阅事件
    WS->>Feishu: 2. 建立 WebSocket 连接
    Feishu-->>WS: 3. 认证成功
    loop 实时推送
        Feishu-->>WS: 4. 事件消息
        WS->>WS: 5. 路由到处理器
        WS->>Client: 6. 处理完成
    end
功能分类特性
连接管理自动重连、心跳检测、连接监控、错误分类处理
事件处理策略模式、多处理器并行、事件重放
消息类型ping/pong、heartbeat、event、auth
监控运维连接状态、处理统计、健康检查、审计日志

错误分类处理

  • 可恢复错误 - 网络波动、临时故障等
  • 不可恢复错误 - 认证失败、权限不足等
  • 详细的错误日志和错误类型标识 - 帮助快速定位问题

认证失败处理

  • 按错误码分类认证失败原因
  • 统计总失败次数和失败时间
  • 提供针对性修复建议

🌐 Mud.Feishu.Webhook - HTTP 回调事件处理

基于中间件模式的事件接收和分发,具备企业级安全防护和性能优化

mermaid
sequenceDiagram
    participant Feishu as 飞书服务器
    participant Webhook as Mud.Feishu.Webhook
    participant Middleware as 中间件
    participant Handler as 事件处理器

    Feishu->>Middleware: 1. POST /feishu/{AppKey}
    Middleware->>Middleware: 2. 验证签名
    Middleware->>Middleware: 3. 解密内容
    Middleware->>Webhook: 4. 路由事件
    Webhook->>Handler: 5. 调用处理器
    Handler-->>Middleware: 6. 处理完成
    Middleware-->>Feishu: 7. 返回响应
功能分类特性
安全验证签名验证、时间戳验证、AES-256-CBC 解密、IP 白名单、Content-Type 验证、SSRF 防护、URL 白名单验证
事件处理中间件模式、自动路由、策略模式、异步处理、事件拦截器、失败事件重试
高级功能多机器人支持、后台处理、并发控制(支持热更新)、断路器模式
监控运维性能监控、健康检查、请求日志、异常处理、安全审计日志
安全加固滑动窗口限流、威胁检测、安全审计、密钥验证、JSON 深度限制、私网 IP 检测
性能优化流式请求体读取、源生成器序列化、内存管理优化、信号量并发控制

安全增强特性

  • Content-Type 验证 - 仅接受 application/json 请求
  • JSON 深度限制 - 防止深度嵌套 JSON 导致 DoS 攻击
  • 流式请求体读取 - 防止伪造 Content-Length 的 DoS 攻击
  • Nonce 过期清理 - 防止内存泄漏
  • 断路器模式 - 使用 Polly 实现熔断机制
  • 失败事件重试 - 后台自动重试失败事件
  • SSRF 防护 - 自动检测和阻止内网 IP 访问请求
  • URL 白名单验证 - 支持配置允许的 URL 域名和路径
  • 私网 IP 检测 - 自动识别 127.0.0.1、192.168.x.x 等内网地址
  • 安全审计日志 - 记录所有安全相关事件(成功/失败)

性能优化

  • 源生成器序列化 - 提升序列化性能约 20-30%
  • 限流内存管理 - LRU 淘汰机制,最大 10 万条目
  • 日志脱敏 - 自动脱敏敏感字段防止信息泄露
  • 信号量并发控制 - 使用 SemaphoreSlim 控制最大并发数,支持配置热更新
  • HTTP 重试策略 - 智能指数退避和抖动算法

核心服务

  • FeishuWebhookConcurrencyService - 并发控制服务,支持配置热更新
  • FailedEventRetryService - 失败事件重试服务,后台自动重试
  • SecurityAuditService - 安全审计服务,记录安全事件
  • ThreatDetectionService - 威胁检测服务,识别异常请求模式
  • LoggingEventInterceptor - 日志事件拦截器
  • TelemetryEventInterceptor - 遥测事件拦截器

💡 快速开始示例

HTTP API 调用

csharp
// 创建用户
[HttpPost("users")]
public async Task<IActionResult> CreateUser([FromBody] CreateUserRequest request)
{
    _userApi.UseApp("hr-app");// 多应用场景下切换到 hr-app 应用,单应用场景下可省略
    var result = await _userApi.CreateUserAsync(request);
    _userApi.UseDefaultApp();// 多应用场景下切换回默认应用, 单应用场景下可省略
    return result.Code == 0 ? Ok(result.Data) : BadRequest(result.Msg);
}

// 构造函数注入IFeishuAppManager接口。
private readonly IFeishuAppManager _feishuAppManager;

// 使用IFeishuAppManager获取API接口对象,灵活切换飞书应用。
var tenantJobTitleApi = _feishuAppManager.GetFeishuApi<IFeishuTenantV3JobTitle>("hr-app");
var result = await tenantJobTitleApi.GetJobTitlesListAsync(10, null);


// 单应用模式下发送消息,无须应用。
var textContent = new MessageTextContent { Text = "Hello World!" };
var result = await messageApi.SendMessageAsync(new SendMessageRequest
{
    ReceiveId = "user_123",
    MsgType = "text",
    Content = JsonSerializer.Serialize(textContent)
}, receive_id_type: "user_id");

WebSocket 事件处理

csharp
// 实现事件处理器
public class MessageHandler : IFeishuEventHandler
{
    public string SupportedEventType => "im.message.receive_v1";

    public async Task HandleAsync(EventData eventData, CancellationToken cancellationToken = default)
    {
        var messageEvent = JsonSerializer.Deserialize<MessageReceiveEvent>(
            eventData.Event?.ToString() ?? "{}");

        Console.WriteLine($"收到消息: {messageEvent.Message.Content}");
    }
}

// 注册处理器
builder.Services.CreateFeishuWebSocketServiceBuilder(builder.Configuration)
    .AddHandler<MessageHandler>()
    .Build();

Webhook 事件处理

csharp
// 部门创建事件处理器(继承基类)
public class DepartmentCreatedHandler : DepartmentCreatedEventHandler
{
    protected override async Task ProcessBusinessLogicAsync(
        EventData eventData,
        DepartmentCreatedResult? departmentData,
        CancellationToken cancellationToken = default)
    {
        // 同步到本地数据库
        await SyncToDatabaseAsync(departmentData);
    }
}

// 注册处理器
builder.Services.CreateFeishuWebhookServiceBuilder(builder.Configuration)
    .AddHandler<DepartmentCreatedHandler>()
    .Build();

// 添加中间件
app.UseFeishuWebhook();

URL 白名单和 SSRF 防护

csharp
// 配置 URL 白名单
var options = new FeishuWebhookOptions
{
    SsrfProtection = new SsrfProtectionOptions
    {
        Enabled = true,
        BlockPrivateIps = true,
        AllowList = new[]
        {
            "https://open.feishu.cn",
            "https://*.example.com"
        }
    }
};

// 验证 URL
UrlValidator.ValidateBaseUrl("https://open.feishu.cn/api", true);

事件拦截器

csharp
// 创建日志拦截器
public class CustomLoggingInterceptor : LoggingEventInterceptor
{
    public CustomLoggingInterceptor(ILogger<CustomLoggingInterceptor> logger)
        : base(logger)
    {
    }

    protected override Task LogBeforeHandleAsync(
        string eventType,
        string? eventId,
        CancellationToken cancellationToken)
    {
        _logger.LogInformation("开始处理事件: {EventType}, EventId: {EventId}", eventType, eventId);
        return Task.CompletedTask;
    }
}

// 注册拦截器
builder.Services.CreateFeishuWebhookServiceBuilder(builder.Configuration)
    .AddInterceptor<CustomLoggingInterceptor>()
    .AddHandler<DepartmentCreatedHandler>()
    .Build();

📖 详细文档


🛠️ 技术栈

框架支持

  • .NET Standard 2.0 - 兼容 .NET Framework 4.6.1+
  • .NET 6.0 - LTS 长期支持版本
  • .NET 8.0 - LTS 长期支持版本(推荐)
  • .NET 10.0 - LTS 长期支持版本

核心依赖

版本说明
Mud.ServiceCodeGeneratorv1.4.6HTTP 客户端代码生成器
System.Text.Jsonv10.0.1高性能 JSON 序列化
Microsoft.Extensions.Httpv8.0.1 / v10.0.1HTTP 客户端工厂
Microsoft.Extensions.Http.Pollyv8.0.2 / v10.0.1弹性和瞬态故障处理
Microsoft.Extensions.DependencyInjectionv8.0.2 / v10.0.1依赖注入
Microsoft.Extensions.Loggingv8.0.3 / v10.0.1日志记录
Microsoft.Extensions.Configuration.Binderv8.0.2 / v10.0.1配置绑定

📄 许可证

本项目遵循 MIT 许可证,允许商业和非商业用途。


🔗 相关链接

📖 官方文档

📦 NuGet 包

🛠️ 开发资源

🤝 社区支持


如果觉得 MudFeishu 对你有帮助,请给个 ⭐Star 支持一下!

Made with ❤️ by MudTools