Python 使用飞书 API 获取子部门列表接口信息


前言

在企业开发中,经常需要同步飞书组织架构,例如:

  • 获取所有部门
  • 获取子部门信息
  • 同步员工组织结构
  • 做 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
相关推荐
李高杰9961 小时前
Claudecode如何接入飞书呢?
飞书
zhoupenghui1681 小时前
如何设置PyTorch程序在 GPU上运行
人工智能·pytorch·python·gru·cuda
li_Jiejun1 小时前
小智AI支持飞书&企业微信控制
飞书·企业微信
极客老王说Agent1 小时前
实在Agent跨平台表格自动化实战:钉钉表格与飞书多维表数据无缝同步
自动化·钉钉·飞书
Betelgeuse763 小时前
Django 中间件 4 大钩子 & CBV vs FBV 对比实战
python·中间件·django
92year9 小时前
用Google ADK从零搭一个能调工具的AI Agent:Python实操全过程
python·ai·mcp
woxihuan12345610 小时前
SQL删除数据时存在依赖关系_设置外键级联删除ON DELETE
jvm·数据库·python
Jetev10 小时前
如何确定SQL字段是否为空_使用IS NULL与IS NOT NULL
jvm·数据库·python
蛐蛐蛐10 小时前
昇腾910B4上安装新版本CANN的正确流程
人工智能·python·昇腾