Python實(shí)現(xiàn)文檔自動(dòng)上傳至飛書(shū)云盤(pán)
在完成文章分析后,需要將生成的報(bào)告自動(dòng)備份到飛書(shū)云盤(pán),避免手動(dòng)傳輸?shù)姆爆崱?/p>
整體架構(gòu)
上傳流程的架構(gòu)設(shè)計(jì):

核心流程
整個(gè)上傳過(guò)程分為四個(gè)步驟:
步驟 1:初始化
- 輸入:環(huán)境變量(APP_ID、APP_SECRET、FEISHU_FOLDER_TOKEN)
- 處理:
FeishuUploader.__init__()從環(huán)境變量讀取憑證 - 輸出:配置完成的上傳器實(shí)例
步驟 2:身份認(rèn)證
- 輸入:APP_ID + APP_SECRET
- 處理:調(diào)用
POST /auth/v3/tenant_access_token/internal - 輸出:
tenant_access_token(有效期 2 小時(shí))
步驟 3:文件上傳
- 輸入:文件路徑 + folder_token + tenant_access_token
- 處理:使用
MultipartEncoder流式上傳到POST /drive/v1/files/upload_all - 輸出:成功時(shí)返回
file_token
步驟 4:結(jié)果處理
- 輸入:API 響應(yīng)
- 處理:檢查響應(yīng)碼,記錄成功/失敗日志
- 輸出:布爾結(jié)果(True/False)
關(guān)鍵代碼實(shí)現(xiàn)
FeishuUploader 類(lèi)
這個(gè)類(lèi)封裝了所有與飛書(shū) API 的交互邏輯。
獲取訪問(wèn)憑證
def _get_tenant_access_token(self) -> Optional[str]:
url = f"{self.BASE_URL}/auth/v3/tenant_access_token/internal"
payload = {"app_id": self.app_id, "app_secret": self.app_secret}
response = requests.post(url, json=payload, timeout=10)
# 成功時(shí)返回 tenant_access_token
邏輯說(shuō)明:將 App ID 和 App Secret 發(fā)送到飛書(shū)認(rèn)證接口,從響應(yīng)中提取訪問(wèn)憑證。
文件上傳
def upload_file(self, file_path: Path) -> bool:
token = self._get_tenant_access_token()
# 使用 MultipartEncoder 構(gòu)建表單
form = {
'file_name': file_name,
'parent_type': 'explorer',
'parent_node': self.folder_token,
'size': str(file_size),
'file': (file_name, f)
}
multi_form = MultipartEncoder(form)
response = requests.post(url, headers=headers, data=multi_form, timeout=60)
邏輯說(shuō)明:
- 驗(yàn)證文件存在且 folder_token 已配置
- 獲取身份認(rèn)證憑證
- 構(gòu)建包含文件元數(shù)據(jù)的表單
- 流式上傳到飛書(shū)云盤(pán) API
上傳觸發(fā)點(diǎn)
在 main.py 中,分析完成后自動(dòng)觸發(fā)上傳:
if results and any(r.success for r in results):
report_path = reporter.generate_summaries_report(results, grouped_urls)
logger.info("匯總分析成功,正在上傳報(bào)告...")
uploader = FeishuUploader()
if uploader.upload_file(report_path):
logger.info("自動(dòng)上傳飛書(shū)成功。")
else:
logger.error("自動(dòng)上傳飛書(shū)失敗。")
飛書(shū)平臺(tái)配置詳解
這是整個(gè)流程中最容易出錯(cuò)的環(huán)節(jié)。很多開(kāi)發(fā)者代碼寫(xiě)好了,卻在權(quán)限配置上卡住。
前置條件
- 擁有飛書(shū)賬號(hào),且具有管理員權(quán)限(用于審批應(yīng)用)
- 飛書(shū)云盤(pán)中已有目標(biāo)文件夾(用于存放上傳的報(bào)告)
配置流程概覽

階段一:創(chuàng)建飛書(shū)應(yīng)用
進(jìn)入開(kāi)發(fā)者后臺(tái)
- 打開(kāi) 飛書(shū)開(kāi)放平臺(tái)
- 使用飛書(shū)賬號(hào)登錄
- 點(diǎn)擊「創(chuàng)建企業(yè)自建應(yīng)用」
填寫(xiě)應(yīng)用信息
| 字段 | 說(shuō)明 |
|---|---|
| 應(yīng)用名稱(chēng) | 應(yīng)用的顯示名稱(chēng) |
| 應(yīng)用描述 | 功能簡(jiǎn)介 |
| 應(yīng)用圖標(biāo) | 上傳圖標(biāo)(可選) |
填寫(xiě)完成后點(diǎn)擊「創(chuàng)建」。
記錄應(yīng)用憑證
創(chuàng)建成功后,進(jìn)入「憑證與基礎(chǔ)信息」頁(yè)面:
| 憑證 | 說(shuō)明 | 特征 |
|---|---|---|
App ID | 應(yīng)用唯一標(biāo)識(shí) | 以 cli_ 開(kāi)頭 |
App Secret | 應(yīng)用密鑰 | 點(diǎn)擊查看 |
重要:請(qǐng)妥善保管這些憑證,后續(xù) API 認(rèn)證需要使用。
階段二:配置 API 權(quán)限
進(jìn)入權(quán)限管理
- 在應(yīng)用管理頁(yè)面,進(jìn)入「開(kāi)發(fā)配置」→「權(quán)限管理」
- 點(diǎn)擊「開(kāi)通權(quán)限」按鈕
搜索并添加所需權(quán)限
在「API 權(quán)限」標(biāo)簽頁(yè)下,搜索并添加以下權(quán)限:
| 權(quán)限名稱(chēng) | 權(quán)限標(biāo)識(shí) | 類(lèi)型 | 用途 |
|---|---|---|---|
| 上傳、下載文件到云空間 | drive:file:upload | 租戶(hù)級(jí) | 上傳文件到云盤(pán) |
| 查看、評(píng)論、編輯和管理云空間中所有文件 | drive:file | 租戶(hù)級(jí) | 完整文件訪問(wèn)(備選) |
推薦:使用 drive:file:upload,遵循最小權(quán)限原則。
階段三:發(fā)布應(yīng)用
創(chuàng)建版本
進(jìn)入「應(yīng)用發(fā)布」→「版本管理與發(fā)布」
點(diǎn)擊「創(chuàng)建版本」
填寫(xiě)版本信息:
| 字段 | 值 |
|---|---|
| 版本號(hào) | 1.0.0 |
| 更新說(shuō)明 | 初始版本,支持云盤(pán)文件上傳功能 |
| 可用范圍 |
點(diǎn)擊「保存」
階段四:配置文件夾訪問(wèn)權(quán)限
還需要配置文件夾權(quán)限,應(yīng)用才能上傳文件。
啟用機(jī)器人能力
- 返回「開(kāi)發(fā)者后臺(tái)」→ 選擇你的應(yīng)用
- 進(jìn)入「應(yīng)用功能」→「機(jī)器人」
- 點(diǎn)擊「啟用機(jī)器人」
- 配置機(jī)器人信息(名稱(chēng)、描述、頭像)
- 發(fā)布新版本以激活機(jī)器人功能
添加應(yīng)用為文件夾協(xié)作者
有兩種方法可以授權(quán):
方法 A:直接添加應(yīng)用到文件夾
- 在瀏覽器或客戶(hù)端打開(kāi)飛書(shū)云盤(pán)
- 進(jìn)入目標(biāo)文件夾
- 點(diǎn)擊右上角「 ... 」→「更多」→「添加文檔應(yīng)用」
- 搜索你的應(yīng)用名稱(chēng)
- 選擇應(yīng)用,設(shè)置權(quán)限為「可編輯」
- 點(diǎn)擊「確認(rèn)」
前提條件:應(yīng)用必須已開(kāi)通至少一個(gè)云文檔 API 權(quán)限并已發(fā)布。
方法 B:通過(guò)群組添加應(yīng)用
- 在飛書(shū)中創(chuàng)建一個(gè)新群組
- 將應(yīng)用作為「機(jī)器人」添加到群組
- 打開(kāi)目標(biāo)文件夾 → 點(diǎn)擊「分享」
- 邀請(qǐng)?jiān)撊航M作為協(xié)作者,權(quán)限設(shè)為「可編輯」
獲取文件夾 Token
1.在飛書(shū)云盤(pán)中打開(kāi)目標(biāo)文件夾
2.從瀏覽器地址欄復(fù)制 URL:https://feishu.cn/drive/folder/fldcnXXXXXXXXXXXX
3. 提取 folder_token(/folder/ 后面的部分):
folder_token = fldcnXXXXXXXXXXXX
階段五:配置環(huán)境變量
在項(xiàng)目根目錄創(chuàng)建或更新 .env 文件:
# 飛書(shū)配置 APP_ID=cli_xxxxxxxxxxxxx APP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx FEISHU_FOLDER_TOKEN=fldcnXXXXXXXXXXXX
| 變量 | 來(lái)源 | 示例 |
|---|---|---|
APP_ID | 開(kāi)發(fā)者后臺(tái) → 憑證與基礎(chǔ)信息 | cli_a1b2c3d4e5f6g7h8 |
APP_SECRET | 開(kāi)發(fā)者后臺(tái) → 憑證與基礎(chǔ)信息 | aB1cD2eF3gH4iJ5kL6mN7oP8 |
FEISHU_FOLDER_TOKEN | 飛書(shū)云盤(pán) URL | fldcnAbCdEfGhIjKlMnO |
常見(jiàn)問(wèn)題排查
| 錯(cuò)誤碼 | 描述 | 解決方案 |
|---|---|---|
1061004 | 權(quán)限不足 | 將應(yīng)用添加為文件夾協(xié)作者,權(quán)限設(shè)為可編輯 |
1061073 | 未開(kāi)通權(quán)限 | 在開(kāi)發(fā)者后臺(tái)申請(qǐng) drive:file:upload 權(quán)限 |
1061044 | 文件夾不存在 | 檢查 FEISHU_FOLDER_TOKEN 是否正確 |
99991663 | 應(yīng)用未找到 | 確認(rèn)應(yīng)用已發(fā)布且機(jī)器人已啟用 |
以上就是Python實(shí)現(xiàn)文檔自動(dòng)上傳至飛書(shū)云盤(pán)的詳細(xì)內(nèi)容,更多關(guān)于Python文檔上傳飛書(shū)云盤(pán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python實(shí)現(xiàn)自動(dòng)上傳文件到百度網(wǎng)盤(pán)
- 使用Python實(shí)現(xiàn)大文件切片上傳及斷點(diǎn)續(xù)傳的方法
- Python實(shí)現(xiàn)Excel數(shù)據(jù)同步到飛書(shū)文檔
- Python如何使用FastAPI玩轉(zhuǎn)文件上傳功能
- Python使用FastAPI實(shí)現(xiàn)大文件分片上傳與斷點(diǎn)續(xù)傳功能
- Python使用FastAPI實(shí)現(xiàn)文件上傳接口的最佳方案
- 基于Python開(kāi)發(fā)一個(gè)百度網(wǎng)盤(pán)管理工具
- Python使用DrissionPage實(shí)現(xiàn)上傳文件的實(shí)戰(zhàn)指南
相關(guān)文章
Python使用asyncio實(shí)現(xiàn)異步操作的示例
本文主要介紹了Python使用asyncio實(shí)現(xiàn)異步操作的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
python實(shí)現(xiàn)括號(hào)匹配的思路詳解
這篇文章主要介紹了python實(shí)現(xiàn)括號(hào)匹配及匹配格式的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
Python命令行參數(shù)解析工具 docopt 安裝和應(yīng)用過(guò)程詳解
這篇文章主要介紹了Python命令行參數(shù)解析工具 docopt 安裝和應(yīng)用過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
python實(shí)現(xiàn)自動(dòng)化之文件合并
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)化文件合并,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Django中的DateTimeField和DateField實(shí)現(xiàn)
這篇文章主要介紹了Django中的DateTimeField和DateField實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
對(duì)numpy中的transpose和swapaxes函數(shù)詳解
今天小編就為大家分享一篇對(duì)numpy中的transpose和swapaxes函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Python使用pickle模塊存儲(chǔ)數(shù)據(jù)報(bào)錯(cuò)解決示例代碼
這篇文章主要介紹了Python使用pickle模塊存儲(chǔ)數(shù)據(jù)報(bào)錯(cuò)解決示例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
python爬蟲(chóng)添加請(qǐng)求頭代碼實(shí)例
這篇文章主要介紹了python爬蟲(chóng)添加請(qǐng)求頭代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

