| Crates.io | open-lark |
| lib.rs | open-lark |
| version | 0.13.2 |
| created_at | 2024-04-25 11:04:06.603574+00 |
| updated_at | 2025-09-07 14:29:54.444213+00 |
| description | Enterprise-grade Lark/Feishu Open API SDK with comprehensive Chinese documentation and advanced error handling |
| homepage | https://github.com/foxzool/open-lark |
| repository | https://github.com/foxzool/open-lark |
| max_upload_size | |
| id | 1220094 |
| size | 5,685,667 |
支持自定义机器人、长连接机器人、云文档、飞书卡片、消息、群组、招聘管理等API调用。
从 v0.12.0 开始,open-lark 支持按需编译,你可以只启用需要的服务模块,显著减少编译时间和二进制文件大小。
[dependencies]
open-lark = "0.13.1" # 包含: im, cloud-docs, contact, group, authentication, search
[dependencies]
open-lark = { version = "0.13.1", default-features = false, features = ["cloud-docs"] }
[dependencies]
open-lark = { version = "0.13.1", default-features = false, features = ["im"] }
[dependencies]
open-lark = { version = "0.13.1", features = ["full"] }
im - 即时消息cloud-docs - 云文档 (包含 drive, sheets, bitable 等)contact - 通讯录group - 群组管理authentication - 认证服务search - 搜索功能hire - 招聘管理calendar - 日历服务approval - 审批流程attendance - 考勤管理vc - 视频会议ai - AI 服务helpdesk - 服务台Cargo.toml将.env-example文件重命名为.env,并填写相关配置。
use open_lark::prelude::*;
use open_lark::service::hire::models::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = LarkClient::builder("your_app_id", "your_app_secret")
.with_app_type(AppType::SelfBuild)
.build();
// 获取职位列表
let job_request = JobListRequest {
page_size: Some(50),
page_token: None,
status: Some("active".to_string()),
..Default::default()
};
let jobs = client.hire.recruitment_config.job.list_jobs(job_request, None).await?;
println!("职位列表: {:?}", jobs.data);
// 获取人才库列表
let pool_request = TalentPoolListRequest {
page_size: Some(20),
..Default::default()
};
let pools = client.hire.candidate_management.talent_pool.list_pools(pool_request, None).await?;
println!("人才库列表: {:?}", pools.data);
// 创建人才
let talent_request = TalentCreateRequest {
name: "张三".to_string(),
email: Some("zhangsan@example.com".to_string()),
phone: Some("13800138000".to_string()),
..Default::default()
};
let talent = client.hire.candidate_management.talent.create_talent(talent_request, None).await?;
println!("创建人才: {:?}", talent.data);
// 获取内推列表
let referral_request = ReferralListRequest {
page_size: Some(30),
..Default::default()
};
let referrals = client.hire.get_candidates.referral.list_referrals(referral_request, None).await?;
println!("内推列表: {:?}", referrals.data);
// 查询内推账户余额
let user_id = "user_123456";
let balance = client.hire.referral_account.get_balance(user_id, None).await?;
println!("账户余额: {:?}", balance.data);
Ok(())
}
use open_lark::prelude::*;
use open_lark::core::{
error_helper::ErrorHelper,
error_metrics::ErrorMonitor,
retry_middleware::{RetryMiddleware, RetryConfig},
error_logger::{ErrorLogger, LoggerBuilder, LogLevel},
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 设置监控和日志
let monitor = ErrorMonitor::default();
let logger = LoggerBuilder::new()
.min_level(LogLevel::Info)
.json_format()
.build();
// 设置智能重试策略
let retry_middleware = RetryMiddleware::new(
RetryConfig::new()
.enabled(true)
.server_errors_only()
);
let client = LarkClient::builder("your_app_id", "your_app_secret").build();
// 执行API调用(带自动重试)
let result = retry_middleware.execute(|| async {
client.im.v1.message.create(&request).await
}).await;
// 智能错误处理
match result {
Ok(response) => println!("✅ 成功: {:?}", response),
Err(error) => {
// 记录错误
monitor.record_error(error.clone());
logger.log_api_error(&error);
// 智能错误分析
println!("❌ {}", error.user_friendly_message());
let advice = ErrorHelper::handle_error(&error);
for action in &advice.actions {
println!(" 💡 {}", action);
}
}
}
// 查看错误统计
let stats = monitor.get_statistics();
stats.print_detailed();
Ok(())
}
use open_lark::prelude::*;
use open_lark::service::directory::v1::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = LarkClient::builder("your_app_id", "your_app_secret")
.with_app_type(AppType::SelfBuild)
.build();
// 创建部门
let dept_request = CreateDepartmentRequest::builder()
.name("技术部")
.en_name("Technology Department")
.user_id_type(UserIdType::UserId)
.department_id_type(DepartmentIdType::DepartmentId)
.build();
let dept = client.directory.v1.department.create(dept_request, None).await?;
println!("创建部门: {:?}", dept.data);
// 创建员工
let emp_request = CreateEmployeeRequest::builder()
.name("张三")
.email("zhangsan@example.com")
.job_title("软件工程师")
.user_id_type(UserIdType::UserId)
.build();
let emp = client.directory.v1.employee.create(emp_request, None).await?;
println!("创建员工: {:?}", emp.data);
// 搜索员工
let search_request = SearchEmployeeRequest::builder("张")
.page_size(10)
.user_id_type(UserIdType::UserId)
.build();
let employees = client.directory.v1.employee.search(search_request, None).await?;
println!("搜索结果: {:?}", employees.data);
Ok(())
}
use open_lark::prelude::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建客户端
let client = LarkClient::builder("your_app_id", "your_app_secret").build();
// 查询所有班次
let shifts_req = ListShiftsRequest {
employee_type: "employee_id".to_string(),
page_size: Some(20),
..Default::default()
};
let shifts_resp = client.attendance.v1.shift.list(shifts_req, None).await?;
println!("班次列表: {:?}", shifts_resp.data);
// 查询打卡记录
let user_task_req = QueryUserTaskRequest {
employee_type: "employee_id".to_string(),
user_ids: vec!["employee_123".to_string()],
check_date_from: "2024-06-01".to_string(),
check_date_to: "2024-06-30".to_string(),
..Default::default()
};
let user_task_resp = client.attendance.v1.user_task.query(user_task_req, None).await?;
println!("打卡记录: {:?}", user_task_resp.data);
Ok(())
}
use open_lark::event::EventDispatcherHandler;
let handler = EventDispatcherHandler::builder()
.register_p2_attendance_user_task_updated_v1(|event| {
println!("收到打卡流水事件: {:?}", event);
})
.register_p2_attendance_user_task_status_change_v1(|event| {
println!("收到任务状态变更事件: {:?}", event);
})
.build();
use open_lark::prelude::*;
use open_lark::service::ai::models::{
FileRecognizeRequest, LanguageDetectRequest, TranslateRequest,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = LarkClient::builder("your_app_id", "your_app_secret").build();
// 智能文档处理 - 简历解析
let resume_request = FileRecognizeRequest {
file: "resume_file_token_or_base64".to_string(),
};
let resume_result = client.ai.document_ai.parse_resume(resume_request, None).await?;
println!("简历解析结果: {:?}", resume_result.data);
// OCR文字识别
let ocr_request = FileRecognizeRequest {
file: "image_file_token_or_base64".to_string(),
};
let ocr_result = client.ai.optical_char_recognition.basic_recognize(ocr_request, None).await?;
println!("OCR识别结果: {:?}", ocr_result.data);
// 语种检测
let detect_request = LanguageDetectRequest {
text: "Hello, how are you?".to_string(),
};
let detect_result = client.ai.translation.detect(detect_request, None).await?;
println!("语种检测结果: {:?}", detect_result.data);
// 文本翻译
let translate_request = TranslateRequest {
source_language: Some("en".to_string()),
target_language: "zh".to_string(),
text: "Hello, how are you?".to_string(),
};
let translate_result = client.ai.translation.translate(translate_request, None).await?;
println!("翻译结果: {:?}", translate_result.data);
Ok(())
}
我们在v0.11.0+版本中全面升级了API设计,引入了现代化Builder模式和StandardResponse统一错误处理机制:
StandardResponse.into_result()提供一致的错误处理ExecutableBuilder特征实现现代化异步模式let request = CreateUserRequest {
user: user.clone(),
user_id_type: Some("open_id".to_string()),
department_id_type: Some("open_department_id".to_string()),
};
let response = client.contact.v3.user.create(&request).await?;
use open_lark::core::trait_system::ExecutableBuilder;
let response = client
.contact
.v3
.user
.create_user_builder()
.user(user.clone())
.user_id_type("open_id")
.department_id_type("open_department_id")
.execute(&client.contact.v3.user)
.await?;
use open_lark::core::trait_system::ExecutableBuilder;
// 文件上传
let upload_result = client
.im
.v1
.file
.upload_builder()
.file_type("pdf")
.file_name("document.pdf")
.file_data(file_data)
.execute(&client.im.v1.file)
.await?;
println!("文件上传成功: {}", upload_result.file_key);
// 文件下载
let download_result = client
.im
.v1
.file
.download_builder()
.file_key(&upload_result.file_key)
.execute(&client.im.v1.file)
.await?;
println!("文件下载成功,大小: {} 字节", download_result.data.len());
// 图片上传
let image_upload = client
.im
.v1
.image
.upload_builder()
.image_type("png")
.image_data(image_bytes)
.execute(&client.im.v1.image)
.await?;
// 图片下载
let image_download = client
.im
.v1
.image
.download_builder()
.image_key(&image_upload.image_key)
.execute(&client.im.v1.image)
.await?;
// 条件构建示例
let mut builder = client
.contact
.v3
.user
.create_user_builder()
.user(user.clone());
// 条件性添加参数
if use_open_id {
builder = builder.user_id_type("open_id");
}
if include_department {
builder = builder.department_id_type("open_department_id");
}
let response = builder.execute(&client.contact.v3.user).await?;
// 批量文件上传示例
let files = [("txt", "file1.txt", data1), ("pdf", "file2.pdf", data2)];
for (file_type, file_name, file_data) in files {
let result = client
.im
.v1
.file
.upload_builder()
.file_type(file_type)
.file_name(file_name)
.file_data(file_data)
.execute(&client.im.v1.file)
.await?;
println!("上传成功: {} -> {}", file_name, result.file_key);
}
StandardResponse机制提供详细的错误信息和智能处理建议:
use open_lark::core::error::LarkAPIError;
match result {
Ok(response) => {
println!("✅ 操作成功: {:?}", response);
}
Err(e) => {
match &e {
LarkAPIError::APIError { code, msg, .. } => {
println!("API错误 - 代码: {}, 消息: {}", code, msg);
// 根据错误码提供具体建议
match *code {
429 => println!("💡 建议: 请求频率过高,建议稍后重试"),
403 => println!("💡 建议: 权限不足,请检查应用权限配置"),
413 => println!("💡 建议: 文件太大,请压缩后重试"),
415 => println!("💡 建议: 不支持的文件类型"),
_ => println!("💡 建议: 检查网络连接和API配置"),
}
}
LarkAPIError::DataError(msg) => {
println!("数据错误: {}", msg);
println!("💡 建议: 检查输入数据格式和内容");
}
_ => {
println!("其他错误: {}", e);
println!("💡 建议: 查看详细日志获取更多信息");
}
}
}
}
查看以下示例了解完整的使用方法:
StandardResponse.into_result()获得一致的错误体验.execute()方法获得现代化异步体验| 模块 | API数量 | 完成状态 | 说明 |
|---|---|---|---|
| 🔐 认证与授权 | 1 | ✅ 100% | 应用身份验证 |
| 🏢 企业信息 | 2 | ✅ 100% | 企业基础信息与席位管理 |
| 🛡️ 认证信息 | 1 | ✅ 100% | 应用认证状态与权限信息 |
| 🤖 自定义机器人 | 2 | ✅ 100% | 消息发送与签名验证 |
| 🔗 长连接机器人 | 1 | ✅ 100% | 事件推送接收 |
| ☁️ 云文档-云空间 | 7 | ✅ 100% | 文件夹管理、上传下载 |
| 🛡️ 云文档-权限 | 2 | ✅ 100% | 权限设置管理 |
| 📊 云文档-电子表格 | 33 | ✅ 100% | 完整表格操作功能 |
| 📋 云文档-多维表格 | 6 | ✅ 100% | 数据表操作 |
| 👥 通讯录 | 1 | ✅ 100% | 用户搜索 |
| 🏢 组织架构 | 15 | ✅ 100% | v0.12.0 新增 - 完整员工与部门管理 |
| 🎨 飞书卡片 | 25 | ✅ 100% | 完整卡片组件系统 |
| 💬 消息 | 4 | ✅ 100% | 消息发送与接收 |
| 👥 群组 | 1 | ✅ 100% | 群组管理 |
| 🔍 搜索 | 14 | ✅ 100% | 套件搜索与搜索连接器管理 |
| 🏢 考勤管理 | 43 | ✅ 100% | 完整考勤解决方案 |
| ⚙️ 个人设置 | 7 | ✅ 100% | 系统状态管理 |
| 🤖 AI能力 | 22 | ✅ 100% | v0.8.0 新增 - 智能文档处理、OCR、语音识别、机器翻译 |
| 🎯 招聘管理 | 100+ | ✅ 100% | v0.11.0 新增 - 完整招聘管理系统 |
| 🛡️ 错误处理系统 | 5 | ✅ 100% | v0.6.0 新增 - 企业级错误管理 |
| 📈 总计 | 291+ | ✅ 100% | 覆盖企业应用核心功能 |
SDKResult<T>类型目前主要功能模块均已完成,后续计划:
欢迎提交 Issue 和 Pull Request!
MIT OR Apache-2.0