前言
在企业开发中,经常需要同步飞书组织架构,例如:
- 获取所有部门
- 获取子部门信息
- 同步员工组织结构
- 做 OA / ERP / HR 系统集成
本文将使用 Python 调用飞书开放平台 API,实现:
- 获取 Tenant Access Token
- 获取子部门列表
- 递归获取所有部门
- 分页处理
- 导出 Excel 表格
一、飞书开放平台准备
首先进入:
飞书开放平台
https://open.feishu.cn?utm_source=chatgpt.com
创建:
- 企业自建应用
二、申请权限
进入应用后台--->权限管理--->添加通讯录相关权限--->发布版本

三、安装依赖
执行:
pip install requests pandas openpyxl python-dotenv
依赖说明:
| 库 | 作用 |
|---|---|
| requests | 请求 API |
| pandas | 表格处理 |
| openpyxl | 导出 Excel |
| python-dotenv | 读取 .env |
四、配置 .env
项目根目录创建.env文件,在文件中配置App ID、App Secret
FEISHU_APP_ID=cli_xxxxxxxxx
FEISHU_APP_SECRET=xxxxxxxxxxxxxxxx
注意:
- 不要加引号
- 不要有空格
五、获取 Tenant Access Token
项目结构
project/
│
├── .env
├── requirements.txt
└── feishuAPI/
└── dept/
└── department_list.py
python
from dotenv import load_dotenv
from pathlib import Path
import os
import requests
# =========================
# 自动定位 .env 文件
# =========================
# 当前 py 文件所在目录
BASE_DIR = Path(__file__).resolve().parent
# 上两级目录找到 .env
ENV_PATH = BASE_DIR.parent.parent / ".env"
# 加载环境变量
load_dotenv(ENV_PATH)
# 请求token信息
# 测试
app_id=os.getenv("FEISHU_APP_ID")
app_secret=os.getenv("FEISHU_APP_SECRET")
def token_request():
token_json = {
"app_id": app_id,
"app_secret": app_secret
}
token_res = requests.post(token_url, json=token_json)
token_json = token_res.json()
if token_res.status_code == 200 and token_json.get("code") == 0:
return token_json.get('tenant_access_token')
else:
return None
if __name__ == "__main__":
info=token_request()
print('access_token:',info)
六、获取子部门列表接口
设置默认分页50条
python
# 分页获取部门子部门列表
def get_children_depts(access_token, department_id):
all_children = []
page_token = None
while True:
url = f"https://open.feishu.cn/open-apis/contact/v3/departments/{department_id}/children"
headers = {"Authorization": f"Bearer {access_token}"}
params = {"page_size": 50} # 每页最多 50 条
if page_token:
params["page_token"] = page_token
resp = requests.get(url, headers=headers, params=params).json()
if resp.get("code") != 0:
raise Exception(f"获取部门 {department_id} 子部门失败: {resp}")
items = resp.get("data", {}).get("items", [])
all_children.extend(items)
page_token = resp.get("data", {}).get("page_token")
if not page_token:
break
return all_children
七、递归获取所有部门
企业组织架构通常:
总公司
├── 技术部
│ ├── 后端组
│ └── 前端组
└── 财务部
因此需要递归获取。
python
# 递归获取所有部门,并显示抓取进度
def get_all_departments(access_token, root_id="0"):
all_depts = []
def traverse(dept_id):
children = get_children_depts(access_token, dept_id)
for c in children:
dept_info = {
"department_id": c.get("department_id"),
"name": c.get("name"),
"parent_department_id": c.get("parent_department_id"),
"chat_id": c.get("chat_id"),
"leader_user_id": c.get("leader_user_id"),
}
all_depts.append(dept_info)
print(f"正在抓取部门: {dept_info['name']} (ID: {dept_info['department_id']})")
# 递归获取子部门
traverse(c.get("open_department_id"))
traverse(root_id)
return all_depts
八、导出 Excel 表格
python
import pandas as pd
departments = get_all_departments(token)
df = pd.DataFrame(departments)
df.to_excel(
"feishu_departments.xlsx",
index=False
)
print("Excel 导出成功")
表格内容:
| department_id | name | parent_department_id |
|---|---|---|
| od-xxxx | 技术部 | 0 |
| od-xxxx | 后端组 | od-bXXXXXXXXXXXXXXXXXXXXXXXXXX |
| od-xxxx | 前端组 | od-6XXXXXXXXXXXXXXXXXXXXXXXXXX |
