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
相关推荐
zzzzzz3103 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐4 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱15 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot17 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽1 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码1 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵2 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学