飞书API 2-1:如何通过 API 创建文件夹?

news2025/1/12 6:00:18

本文探讨如何通过飞书的 API 来创建文件夹。
通过 API 创建的文件夹,一般是放在共享空间,如果要放在个人空间,建议手动创建。

查看 API 文档

API 路径,可在飞书开放平台的服务端 API,依次查找云文档>云空间>文件夹>新建文件夹,或者直接点击新建文件夹API。
使用该 API 需要申请新的权限:创建云空间文件夹
image.png

申请权限

到应用中心找到对应的应用,我的应用叫:飞书多维表数据传输,点击进入应用后台,进行权限申请。
image.png

在权限管理>API权限>搜索:文件夹>找到“创建云空间文件夹”,点击“开通权限”。
Tips:我开通不需要审核,所以开通即发布。不用审批的权限,其实可以不用到应用后台申请,可以直接在接口文档的右侧 API 调试窗口或者在 API 调试台直接勾选权限,然后点击批量开通。而在企业中,一般是需要审核的。如果需要审核,则就需要到应用后台操作:勾选申请开通的权限,然后创建一个新的版本发布,等待审核。
image.png

创建文件夹

有权限之后,发起调试便可成功创建文件夹。
image.png

响应体信息:

{
  "code": 0,
  "data": {
    "token": "PFGpfPdFclWaEAdVUXFciHqKnxf",
    "url": "https://xxx.feishu.cn/drive/folder/PFGpfPdFclWaEAdVUXFciHqKnxf"
  },
  "msg": "success"
}

发起请求代码参考如下:

import requests
import json

url = "https://open.feishu.cn/open-apis/drive/v1/files/create_folder"
payload = json.dumps({
    "folder_token": "",
    "name": "测试项目"
})

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer 【your_access_token】'
}

response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

文件夹创建好了,但是刷新我的云文档空间,看不到新建的文件夹???
通过响应体返回的链接进去看看,竟然还得申请权限!!文件夹归属应用所有,作为空间所有者,还需要向应用申请权限才能够查看?
image.png

应用不是一个实体的号,申请完谁来审批?试试看。
没有意外,在飞书客户端没有任何提醒,在应用后台也没有任何提醒。

添加协作者

直接申请权限时走不通,那应该会有添加协作者的 API。
在云文档的权限的常见问题中,找到了答案,可以通过调用增加协作者权限给个人 email 用户授予文档的访问权限。
image.png

不过这个是文档,文件夹呢?先看看增加协作者权限文档,发现这是一个大而全的接口,包含了文档、电子表格、云空间文件、知识库节点、多维表格、新版文档、文件夹、思维笔记、妙记、幻灯片等节点的权限开通。
使用该接口给自己的账号开权限,配置参考如下:
image.png

发起调试,执行成功。
image.png

刷新我的空间,发现在共享空间多了一个测试项目,没错就是刚刚应用创建的。
image.png

请求代码示例如下:

import requests
import json

url = "https://open.feishu.cn/open-apis/drive/v1/permissions/PFGpfPdFclWaEAdVUXFciHqKnxf/members?need_notification=true&type=folder"
payload = json.dumps({
    "member_id": "your_openid",
    "member_type": "openid",
    "perm": "full_access",
    "type": "user"
})

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer 【your_access_token】'
}

response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

如何获取openid?

找到“通过手机号或邮箱获取用户 ID”的 API,user_id_type 选择 openid,在“选择成员”界面勾选对应的用户可以复制成员 ID。
image.png

如果要通过调接口获取,需要申请对应的权限:通过手机号或邮箱获取用户 ID。
image.png

如果是创建之后直接给开发者开通管理权限,可以固定使用指定的开发人员的唯一标识(可以是openid、union_id、user_id),如果是需要传递一个名单进行开通,则需要调用该接口获取用户的唯一标识进行开通协作权限。

发起请求示例代码如下:

import requests
import json

url = "https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id?user_id_type=open_id"
payload = json.dumps({
    "include_resigned": false,
    "mobiles": [
        "your_mobile"
    ]
})

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer 【your_access_token】'
}

response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

流程总结

创建文件夹之后需要增加协作者,增加协作者需要协作者的唯一标识,所以需要通过手机号或邮箱获取用户的唯一标识,最终的结构如下:

将三个 API 的请求代码封装成一个函数,传递关键参数,然后返回需要值。

import requests
import json

def cre_folder(access_token,folder_name,folder_token=''):
    url = "https://open.feishu.cn/open-apis/drive/v1/files/create_folder"
    payload = json.dumps({
        "folder_token": folder_token,
        "name": folder_name
    })
    
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {access_token}'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload)
    code = response.json()['code']
    if code == 0:
        token = response.json().get("data").get("token")
        print(f"成功新建文件夹!文件夹 token 为:{token}。关联函数:cre_folder。")
        return token
    else:
        msg = response.json().get("msg")
        raise f"创建文件夹失败,失败信息:{msg}。关联函数:cre_folder。"

def get_userid(access_token,mobile):
    """
    mobile 可以是单个手机号,或者一个手机号的列表,手机号必须是字符串,不带区号。
    """
    url = "https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id?user_id_type=open_id"
    if isinstance(mobile, str):
        mobile = [mobile]
    payload = json.dumps({
        "include_resigned": False,
        "mobiles": mobile
    })
    
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {access_token}'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload)
    code = response.json()['code']
    if code == 0:
        userid = response.json().get("data").get("user_list")
        print(f"成功通过手机号获取用户的唯一标识:{userid}。关联函数:get_userid。")
        return userid
    else:
        msg = response.json().get("msg")
        raise f"创建文件夹失败,失败信息:{msg}。关联函数:get_userid。"

def add_folder_permission(access_token,folder_token,userid,permission_type='full_access'):
    """
    permission_type:view(阅读)、edit(编辑)、full_access(管理)
    """

    url = f"https://open.feishu.cn/open-apis/drive/v1/permissions/{folder_token}/members?need_notification=true&type=folder"
    
    payload = json.dumps({
        "member_id": userid,
        "member_type": "openid",
        "perm": "full_access",
        "type": "user"
    })
    
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {access_token}'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload)
    code = response.json()['code']
    if code == 0:
        print(f"成功为 {userid} 开通权限。关联函数:add_folder_permission。")
    else:
        msg = response.json().get("msg")
        raise f"创建文件夹失败,失败信息:{msg}。关联函数:add_folder_permission。"

def get_tenant_access_token(app_id, app_secret):
    url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
    payload = json.dumps({
        "app_id": app_id,
        "app_secret": app_secret
    })
    headers = {'Content-Type': 'application/json'}
    response = requests.request("POST", url, headers=headers, data=payload)
    tenant_access_token = response.json()['tenant_access_token']
    print(f'成功获取tenant_access_token:{tenant_access_token}。关联函数:get_table_params。')
    return tenant_access_token

def main():
    app_id = 'your_app_id'
    app_secret = 'your_app_secret'
    access_token = get_tenant_access_token(app_id, app_secret)
    folder_token = ''
    folder_name = '一个测试项目'
    new_folder_token = cre_folder(access_token,folder_name,folder_token)
    mobile = '157xxxxxxxx'
    user_infos = get_userid(access_token,mobile)
    for user_info in user_infos:
        userid = user_info['user_id']
        print(f"为用户:{user_info['mobile']}{userid})开权限。")
        add_folder_permission(access_token,new_folder_token,userid,permission_type='full_access')

if __name__ == '__main__':
    main()

小结

本文探讨了如何通过 API 创建文件夹并且给指定的用户开通协作权限。
具体操作如下:

  • 申请权限:创建云空间文件夹、通过手机号或邮箱获取用户 ID
  • 调用获取 access_token 的 API
  • 调用创建文件夹的 API
  • 调用获取用户 ID 的 API
  • 调用添加协作者的 API

思路相对比较简单,但实际操作比较繁琐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多种方案图文并茂分分钟教你解决Kubernetes(k8s)容器安全问题(不断更新中)

文章目录 Kubernetes(k8s)Secrets in clear text environment variables 明文中的秘密环境变量问题详解 解决方案一STEP1: 创建Kubernetes Secret - 编写一个yaml文件STEP2: 部署执行上述yamlSTEP3: 将Secret作为卷挂载到Pod中-在项目部署K8S.yaml中挂载…

【Perl】与【Excel】

引言 perl脚本语言对于文本的处理、转换很强大。对于一些信息量庞大的文本文件,看起来不直观,可以将信息提取至excel表格中,增加数据分析的可视化。perl语言的cpan提供了大量模块。对于excel文件的操作主要用到模块: Spreadshee…

1970python高校教室管理系统mysql数据库Django框架bootstrap布局计算机软件工程网页

一、源码特点 python Django 高校教室管理系统是一套完善的web设计系统mysql数据库 ,对理解python编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 python Django 高校教室管理系统 开发环境pycharm mys…

2.华为配置静态路由

通过配置静态路由让PC1和PC2互通 AR1 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]ip add 1.1.1.1 24 [Huawei]ip route-static 192.168.2.0 24 1.1.1.2AR2 [Huawei]int g0/0/0 [Huawei-Gig…

ARM Linux 设备树详细介绍(2)共二篇

承接上文,第一篇 3. Device&Tree 引发的 BSP 和驱动变更 有了 Device Tree 后,大量的板级信息都不再需要,譬如过去经常在 arch/arm/plat-xxx 和 arch/arm/mach-xxx 实施的如下事情: 1. 注册 platform_device,绑定 …

《人生海海》读后感

麦家是写谍战的高手,《暗算》《风声》等等作品被搬上荧屏后,掀起了一阵一阵的收视狂潮。麦家声名远扬我自然是知道的,然而我对谍战似乎总是提不起兴趣,因此从来没有拜读过他的作品。这几天无聊时在网上找找看看,发现了…

从xxl-job源码中学习Netty的使用

1. 启动与Spring实例化 com.xxl.job.core.executor.impl.XxlJobSpringExecutor.java类 继承SmartInitializingSingleton 类,在afterSingletonsInstantiated 实例化后方法中 调用initJobHandlerMethodRepository 把所有的xxljob任务管理起来; private…

ARM Linux 设备树详细介绍(1)

1. ARM&Device&Tree 起源 Linus Torvalds 在 2011 年 3 月 17 日的 ARM Linux 邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发 ARM Linux 社区的地震,随后 ARM 社区进行了一系列 的重大修正。 在过去的 ARM Linux 中&…

电子电气架构 --- 智能座舱功能应用

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

springCloudAlibaba之分布式网关组件---gateway

gateway-网关 网关spring cloud gatewaygateway初体验gateway整合nacos简写方式 网关 在微服务架构中一个系统会被拆分成多个微服务。那么作为客户端(前端)要如何去调用这么多的微服务?如果没有网关的存在,我们只能在客户端记录每个微服务的地址&#xf…

工程设计问题---多盘离合器制动器设计问题

这个问题的主要目的是使多片式离合器制动器的质量最小化。在这个问题中,使用了五个整数决策变量,它们是内半径(x1)、外半径(x2)、盘厚度(x3)、致动器的力(x4)…

【Mybatis-Plus】根据自定义注解实现自动加解密

背景 我们把数据存到数据库的时候,有些敏感字段是需要加密的,从数据库查出来再进行解密。如果存在多张表或者多个地方需要对部分字段进行加解密操作,每个地方都手写一次加解密的动作,显然不是最好的选择。如果我们使用的是Mybati…

基于WPF技术的换热站智能监控系统13--控制设备开关

1、本节目的 本次工作量相对有点大,有点难度,需要熟悉MVVM模式,特别是属性绑定和命令驱动,目标是点击水泵开关,让风扇转动或停止,风扇连接的管道液体流动或静止。 ,具体对应关系是:…

单向散列函数解析

目录 1. 概述 2. 单向散列函数的性质 2.1 根据任意长度的消息计算出固定长度的散列值 2.2 能够快速计算出散列值 2.3 消息不同散列值也不同 2.4 具备单向性 3. 单向散列函数的算法 3.1 MD5 3.2 SHA序列 3.3 SM3 1. 概述 针对计算机所处理的消息,有时候我们…

【设计模式深度剖析】【9】【行为型】【访问者模式】| 以博物馆的导览员为例加深理解

👈️上一篇:备忘录模式 设计模式-专栏👈️ 文章目录 访问者模式定义英文原话直译如何理解呢? 访问者模式的角色类图代码示例 访问者模式的应用优点缺点使用场景 示例解析:博物馆的导览员代码示例 访问者模式 访问者模式(Visito…

计算机毕业设计hadoop+spark+hive知识图谱酒店推荐系统 酒店数据分析可视化大屏 酒店爬虫 高德地图API 酒店预测系统 大数据毕业设计

流程: 1.Python爬取去哪儿网全站旅游数据约10万,存入mysql; 2.使用pandasnumpy/hadoopmapreduce对mysql中旅游数据进行数据清洗,使用高德API计算地理信息,最终转为.csv文件上传hdfs; 3.hive建库建表导入.csv文件作为数据集&#x…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考吧

结合最近几年的活动安排,预计2024年第11届汉字小达人比赛还有4个多月就启动,那么孩子们如何利用这段时间有条不紊地准备汉字小达人比赛呢? 我的建议是充分利用即将到来的暑假:①把小学1-5年级的语文课本上的知识点熟悉&#xff0…

Windows11和Ubuntu22双系统安装指南

一、需求描述 台式机电脑,已有Windows11操作系统,想要安装Ubuntu22系统(版本任意)。其中Windows安装在Nvme固态上,Ubuntu安装在Sata固态上,双盘双系统。开机时使用Grub控制进入哪个系统,效果图…

直接选择排序-C语言版本

前言 直接选择排序也是一个比较简单的排序,所以这里放在第二个进行讲解,这里和冒泡排序是有一点相似。直接选择排序和冒泡排序一样,也是具备一定的教学意义,但是没有什么实际操作的意义,因为直接选择排序的时间复杂度比…

云原生 Docker Swarm 使用详解

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…