openclaw-home-pc/workspace/update_feishu_doc.mjs
2026-03-21 15:31:06 +08:00

132 lines
3.6 KiB
JavaScript

// Node.js 22 has built-in fetch
const APP_ID = 'cli_a93eb0f160399cc5';
const APP_SECRET = 'dRzJKrJ46j2Y1DKneyC33dQUNmsLwHCj';
const DOC_ID = 'YerQd8GomoDWQ6xA1zTc31xfnwb';
// 表格内容 (Markdown 格式)
const TABLE_CONTENT = `
| 日期 | 规格 | 数量 |
|------|------|------|
| 24 年 12 月 | 细和润 | 2 |
| 24 年 12 月 | 金细 | 1 |
| 24 年 12 月 | 红中支 | 3 |
| 25 年 | 细和润 | 2 |
| 25 年 | 双支 | 5 |
**总计**: 13
`;
async function getTenantAccessToken() {
const response = await fetch('https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
app_id: APP_ID,
app_secret: APP_SECRET,
}),
});
const data = await response.json();
if (data.code !== 0) {
throw new Error(`Failed to get access token: ${data.msg}`);
}
return data.tenant_access_token;
}
async function updateDocument(token, docId, content) {
// 飞书云文档 API - 更新文档内容
// 使用 docx/v1 API (新版的云文档)
const response = await fetch(`https://open.feishu.cn/open-apis/docx/v1/documents/${docId}/content`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
},
body: JSON.stringify({
content: content,
content_type: 'markdown',
}),
});
const data = await response.json();
return { response, data };
}
async function appendToDocument(token, docId, content) {
// 飞书云文档 API - 追加内容到文档末尾
// 首先需要获取文档的当前内容,然后追加
// 但更简单的方法是使用 block API 在文档末尾添加块
// 先获取文档的根块
const getRootResponse = await fetch(`https://open.feishu.cn/open-apis/docx/v1/documents/${docId}/blocks/root`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
},
});
const rootData = await getRootResponse.json();
if (rootData.code !== 0) {
throw new Error(`Failed to get root block: ${rootData.msg}`);
}
const rootBlockId = rootData.data.block_id;
// 在根块后添加新块
const response = await fetch(`https://open.feishu.cn/open-apis/docx/v1/documents/${docId}/blocks/${rootBlockId}/children`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
},
body: JSON.stringify({
blocks: [
{
block_type: 1, // 1 = text
text: {
elements: [
{
text_run: {
content: content,
},
},
],
},
},
],
}),
});
const data = await response.json();
return { response, data };
}
async function main() {
try {
console.log('正在获取访问令牌...');
const token = await getTenantAccessToken();
console.log('✓ 获取访问令牌成功');
console.log('正在更新文档...');
// 使用 append 模式 - 追加到文档末尾
const result = await appendToDocument(token, DOC_ID, TABLE_CONTENT);
if (result.response.ok) {
console.log('✓ 文档更新成功!');
console.log('响应:', JSON.stringify(result.data, null, 2));
} else {
console.error('✗ 文档更新失败');
console.error('状态码:', result.response.status);
console.error('错误:', JSON.stringify(result.data, null, 2));
}
} catch (error) {
console.error('✗ 发生错误:', error.message);
process.exit(1);
}
}
main();