尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python调用飞书机器人自动写表并导出PDF实战

Python调用飞书机器人自动写表并导出PDF实战 简介本资源是一份面向Python开发者与飞书自动化实践者的实战案例文档聚焦于通过Python调用飞书开放API实现共享表格的程序化编辑。内容涵盖机器人鉴权、数据增删、单元格合并/拆分、样式设置及手机号转OpenID等核心功能代码结构清晰、方法封装规范适合中高级开发者快速集成到内部办公自动化或数据同步场景中。资源为单文件PDF文档43KB完整呈现了Bot类的8个关键方法实现逻辑与调用示例含详细注释与接口参数说明便于理解飞书表格API的请求方式与响应处理。目前已有1564人学习下载读者可直接复用该脚本框架结合自身config配置快速部署表格管理能力显著提升跨平台数据协同效率。1. 飞书机器人真能直接编辑 PDF 表格别被标题误导——它实际在操作飞书多维表格再导出为 PDF看到“Python飞书机器人编辑表格.pdf”这个标题很多刚接触飞书开放平台的开发者第一反应是机器人居然能像 Acrobat 一样打开 PDF、定位单元格、修改内容、再保存这不符合 PDF 的不可编辑本质。真相是所谓“编辑表格.pdf”本质是用 Python 调用飞书机器人 API先写入/更新飞书多维表格Feishu Base中的数据再通过飞书官方导出能力或自动化流程将该表格快照生成 PDF 文件。整个链路里PDF 是结果而非操作对象。这个模式适用于日报自动归档、销售数据周报生成、HR 入职信息同步后一键导出确认单等场景——核心诉求不是“改 PDF”而是“让结构化数据自动落表、自动成册”。适合已有飞书组织权限、熟悉 Python 基础语法、需对接内部业务系统但不想自建 Web 后端的中小团队开发者。如果你正卡在“怎么让 Python 脚本往飞书里填数据”“导出 PDF 怎么触发”“为什么改了表但 PDF 没更新”这三个问题上这篇就是为你写的实操路径。2. 用 Python 调用飞书机器人 API 写入多维表格从创建机器人到发送第一条记录飞书机器人不是万能钥匙它必须绑定到具体多维表格并拥有对应权限。整个流程分三步注册机器人 → 绑定表格 → 构造请求体。跳过任一环节都会返回403 Forbidden或404 Not Found。2.1 在飞书管理后台创建自定义机器人并获取凭证登录飞书管理员后台https://admin.feishu.cn进入「应用管理」→「创建应用」→ 选择「自建应用」→ 填写应用名称如daily-report-bot→ 提交。进入应用详情页后点击左侧「机器人」→「添加机器人」→ 选择「群机器人」或「自定义机器人」推荐后者权限更可控。关键步骤来了在「安全设置」中开启「API 调用权限」并复制「App ID」和「App Secret」。这两个值后续用于换取 access_token绝不能泄露。注意此时机器人尚未关联任何表格它只是一个“有身份但没工牌”的员工。提示App Secret 只在首次生成时可见关闭页面后无法再次查看。务必立即存入环境变量或密钥管理工具不要硬编码在脚本里。2.2 获取 access_token 并验证机器人身份飞书所有 API 调用均需 bearer token而该 token 由 App ID/Secret 换取有效期 2 小时。以下 Python 代码完成认证import requests import os # 从环境变量读取凭证强烈建议 APP_ID os.getenv(FEISHU_APP_ID, cli_xxx) APP_SECRET os.getenv(FEISHU_APP_SECRET, xxx) def get_access_token(): url https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal payload { app_id: APP_ID, app_secret: APP_SECRET } headers {Content-Type: application/json} response requests.post(url, jsonpayload, headersheaders) if response.status_code 200: return response.json()[app_access_token] else: raise Exception(fToken 获取失败: {response.text}) # 测试调用 token get_access_token() print(f成功获取 access_token: {token[:10]}...) # 打印前10位防泄漏这段代码的核心逻辑是向auth/v3/app_access_token/internal接口 POST 凭证返回 JSON 中的app_access_token字段即为后续所有请求的认证凭据。若返回错误请检查 App ID/Secret 是否复制完整、是否已开启 API 权限、网络是否能访问open.feishu.cn。2.3 将数据写入指定多维表格定位 table_id 和 view_id 是成败关键飞书多维表格的 API 地址格式为https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records。其中app_token是多维表格所在「应用」的唯一标识table_id是该表格内具体数据表的 IDview_id可选指定视图筛选条件。这三个 ID无法在 UI 界面直接看到必须通过 API 获取def list_tables(access_token, app_token): 列出指定 app 下所有表格 url fhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables headers { Authorization: fBearer {access_token}, Content-Type: application/json } response requests.get(url, headersheaders) return response.json() # 示例假设已知 app_token 为 basc_xxx app_token basc_xxx tables list_tables(token, app_token) for t in tables[data][tables]: print(f表名: {t[name]}, table_id: {t[table_id]})运行后你会看到类似输出表名: 销售日报, table_id: tbl_xxx 表名: 客户信息, table_id: tbl_yyy拿到table_id后即可构造写入请求。注意字段名field_name必须与表格中「列名」完全一致区分大小写且类型匹配。例如若表格有一列名为「成交金额」类型为数字则 payload 中对应 key 必须是成交金额value 必须是int或float。def create_record(access_token, app_token, table_id, data): url fhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records headers { Authorization: fBearer {access_token}, Content-Type: application/json } payload { fields: data # data 是 dictkey 为列名value 为值 } response requests.post(url, jsonpayload, headersheaders) return response.json() # 写入一条测试记录 test_data { 日期: 2024-06-15, 客户名称: 上海某某科技有限公司, 成交金额: 128000, 负责人: 张三 } result create_record(token, app_token, tbl_xxx, test_data) print(写入结果:, result)若返回code: 0说明记录已成功创建若提示field not found请核对列名拼写若提示invalid type请检查数值类型是否匹配如文本列不能传数字。3. 从多维表格导出 PDF两种可靠路径及参数详解写入数据只是第一步生成 PDF 才是业务闭环。飞书官方不提供直接“导出 PDF”的 API但可通过两种成熟路径实现① 利用飞书「导出为 PDF」功能的手动触发 自动化轮询② 使用飞书开放平台的「文档导出」能力将多维表格嵌入飞书文档后再导出。前者简单但依赖人工配置后者全自动但需额外建文档模板。3.1 方案一配置多维表格自动导出链接用 Python 抓取 PDF适合固定周期导出飞书多维表格支持「分享链接」并设置「导出为 PDF」权限。操作路径打开目标表格 → 右上角「⋯」→「分享」→ 设置「可导出为 PDF」→ 复制链接。该链接形如https://base.feishu.cn/base/xxx?tabletbl_xxxviewvw_xxxexport_typepdf。关键参数tabletbl_xxx指定数据表viewvw_xxx指定视图可选不填则导出全部export_typepdf声明导出格式此链接无需登录即可访问前提是分享权限设为「任何人可查看」因此可用 requests 直接下载def download_pdf_from_share_link(share_url, output_path): 从飞书分享链接下载 PDF # 飞书 PDF 导出链接需添加 header否则返回 403 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } response requests.get(share_url, headersheaders, streamTrue) if response.status_code 200: with open(output_path, wb) as f: for chunk in response.iter_content(chunk_size8192): f.write(chunk) print(fPDF 已保存至: {output_path}) else: raise Exception(fPDF 下载失败状态码: {response.status_code}) # 示例使用你配置好的分享链接 share_url https://base.feishu.cn/base/abc123?tabletbl_xxxviewvw_yyyexport_typepdf download_pdf_from_share_link(share_url, sales_report_20240615.pdf)注意此方案要求表格分享链接长期有效且权限开放。生产环境务必设置「仅组织内成员可查看」并通过飞书登录态 Cookie 或 OAuth2 Token 传递认证而非公开链接。此处为演示简化真实部署需集成飞书登录态。3.2 方案二用飞书文档 API 嵌入表格并导出全自动、可定制样式更健壮的做法是新建一个飞书文档 → 插入「多维表格」组件 → 绑定到目标表格 → 调用文档导出 API。这样导出的 PDF 支持页眉页脚、公司 Logo、自定义标题等排版。首先创建文档并插入表格def create_doc_with_table(access_token, app_token, table_id): # 1. 创建空白文档 doc_url https://open.feishu.cn/open-apis/docx/v1/documents headers {Authorization: fBearer {access_token}} payload {title: 销售日报 PDF} doc_resp requests.post(doc_url, jsonpayload, headersheaders) doc_token doc_resp.json()[data][document_id] # 2. 在文档中插入多维表格组件 block_url fhttps://open.feishu.cn/open-apis/docx/v1/documents/{doc_token}/blocks block_payload { children: [ { block_type: 2, # 文本块标题 elements: [{text_run: {content: 2024年6月15日销售日报}}] }, { block_type: 11, # 多维表格块 bitable: { app_token: app_token, table_id: table_id, view_id: vw_yyy # 可选指定视图 } } ] } requests.post(block_url, jsonblock_payload, headersheaders) return doc_token # 调用 doc_token create_doc_with_table(token, app_token, tbl_xxx) print(文档已创建token:, doc_token)然后调用文档导出接口def export_doc_to_pdf(access_token, doc_token): url fhttps://open.feishu.cn/open-apis/docx/v1/documents/{doc_token}/export/pdf headers {Authorization: fBearer {access_token}} payload {file_type: pdf} resp requests.post(url, jsonpayload, headersheaders) if resp.status_code 200: task_id resp.json()[data][task_id] # 轮询任务状态 while True: status_url fhttps://open.feishu.cn/open-apis/docx/v1/export_tasks/{task_id} status_resp requests.get(status_url, headersheaders) status status_resp.json()[data][status] if status success: pdf_url status_resp.json()[data][result][export_url] # 下载 PDF pdf_resp requests.get(pdf_url) with open(report_auto.pdf, wb) as f: f.write(pdf_resp.content) print(PDF 导出完成) break elif status failed: raise Exception(导出失败) time.sleep(2) # 每2秒查一次 export_doc_to_pdf(token, doc_token)此方案优势在于PDF 样式完全可控支持插入文字说明、图表、公司水印导出过程全 API 化无需人工干预适合集成进定时任务如每天凌晨 2 点自动生成昨日报表。4. 飞书多维表格字段类型与 Python 数据映射避免 400 错误的 5 个关键规则写入失败最常见的原因是字段类型不匹配。飞书多维表格支持 12 种字段类型但 Python 侧只需关注以下 5 类高频场景。每种类型都有严格的数据结构要求违反即返回400 Bad Request。4.1 单行文本、多行文本直接传字符串但需处理特殊字符# 正确 {产品名称: iPhone 15 Pro, 备注: 首批到货含赠品} # 错误包含未转义的换行符多行文本列会报错 {备注: 首批到货\n含赠品} # ❌ # 正确用 \n 表示换行飞书会渲染为多行 {备注: 首批到货\n含赠品} # ✅多行文本列4.2 数字、货币、百分比必须为 int/float禁止字符串# 正确 {成交金额: 128000.0, 利润率: 0.235} # 错误字符串会被拒绝 {成交金额: 128000, 利润率: 23.5%} # ❌ # 正确百分比列传小数0.235 表示 23.5% {利润率: 0.235} # ✅4.3 日期、时间、日期时间严格 ISO 8601 格式带时区飞书要求日期字段必须为YYYY-MM-DD日期时间字段为YYYY-MM-DDTHH:MM:SSHH:MMUTC 时间。from datetime import datetime, timezone # 正确日期列 {日期: 2024-06-15} # 正确日期时间列转为 UTC now_utc datetime.now(timezone.utc).isoformat().split(.)[0] Z {创建时间: now_utc} # 如 2024-06-15T08:30:45Z # 错误本地时间字符串无时区 {创建时间: 2024-06-15 08:30:45} # ❌4.4 成员、部门、联系人必须传 user_id / department_id / email这些字段不接受姓名字符串必须是飞书系统内的唯一标识。# 正确通过飞书通讯录 API 查询到的 user_id {负责人: [ou_xxx]} # 错误传中文名 {负责人: [张三]} # ❌ # 获取 user_id 示例需另调通讯录 API # url fhttps://open.feishu.cn/open-apis/contact/v3/users?user_id_typeuser_idemailzhangsancompany.com4.5 单选、多选、下拉选项值必须与后台配置完全一致多维表格的选项是预设的API 写入时必须用「选项名称」非 ID且大小写、空格、标点全部匹配。# 假设后台配置的单选选项为[待审核, 已通过, 已驳回] # 正确 {状态: 已通过} # 错误多空格、大小写不符、用了 ID {状态: 已通过 } # ❌尾部空格 {状态: 已通过} # ❌英文引号 {状态: passed} # ❌ID 不是名称字段类型Python 数据类型示例值常见错误单行文本striPhone 15包含控制字符\x00数字int/float128000字符串128000日期str(YYYY-MM-DD)2024-06-1515/06/2024成员list[str](user_id)[ou_xxx][张三]单选str已通过1选项序号5. 实战技巧用 Python 自动化生成带水印的 PDF 报表生成 PDF 后常需添加公司水印、页码、保密等级等。飞书原生导出不支持水印但可在下载 PDF 后用PyPDF2或reportlab进行二次加工。以下是一个轻量级水印添加脚本无需安装复杂依赖from PyPDF2 import PdfReader, PdfWriter from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter import io def add_watermark(input_pdf_path, output_pdf_path, watermark_textCONFIDENTIAL): 为 PDF 添加半透明文字水印 # 读取原 PDF reader PdfReader(input_pdf_path) writer PdfWriter() # 创建水印 PDF一页 packet io.BytesIO() can canvas.Canvas(packet, pagesizeletter) can.setFont(Helvetica, 80) can.setFillColorRGB(0.8, 0.8, 0.8, alpha0.3) # 浅灰半透明 can.rotate(45) can.drawString(100, 400, watermark_text) can.save() packet.seek(0) watermark PdfReader(packet) # 将水印叠加到每页 for page in reader.pages: page.merge_page(watermark.pages[0]) writer.add_page(page) # 写出新文件 with open(output_pdf_path, wb) as f: writer.write(f) print(f已添加水印: {output_pdf_path}) # 使用示例 add_watermark(sales_report.pdf, sales_report_confidential.pdf, INTERNAL USE ONLY)此脚本核心逻辑用reportlab生成一页纯水印 PDF旋转 45°、浅灰色、低透明度再用PyPDF2将其逐页合并到源 PDF 上。效果是文字水印铺满整个页面不影响正文阅读。部署时可将此步骤加入导出流程末尾形成「数据写入 → 文档生成 → PDF 导出 → 水印添加」全自动流水线。若需添加页眉页脚如“第 X 页共 Y 页”reportlab的PageTemplate可完美支持只需扩展canvas绘制逻辑即可。本文还有配套的精品资源点击获取
返回列表