feat: 钉钉群聊飞书文档收集与知识图谱系统初始提交
- 通过悟空(dws CLI)拉取dc战略问题研究院+创新组两个群的消息(377条) - 提取190个飞书链接、18个文件附件 - 下载HTML/MD/XLSX等报告文件到output/downloaded-files/ - 构建知识图谱(JSON+HTML可视化) - 生成Obsidian知识库(28个页面,7大主题) - 生成花园世界全量汇总报告 - 所有脚本路径改为相对路径,便于迁移
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env python3
|
||||
"""读取所有飞书链接并生成汇总报告"""
|
||||
|
||||
import json
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
import time
|
||||
from datetime import datetime
|
||||
|
||||
def extract_content(url):
|
||||
"""从飞书链接提取内容"""
|
||||
try:
|
||||
resp = requests.get(url, timeout=10, headers={'User-Agent': 'Mozilla/5.0'})
|
||||
soup = BeautifulSoup(resp.text, 'html.parser')
|
||||
|
||||
# 获取标题
|
||||
title = soup.find('title')
|
||||
title_text = title.text.strip() if title else ''
|
||||
|
||||
# 移除脚本和样式
|
||||
for script in soup(['script', 'style']):
|
||||
script.decompose()
|
||||
|
||||
# 获取文本内容
|
||||
text = soup.get_text(strip=True)
|
||||
|
||||
# 提取关键信息
|
||||
# 查找日报内容(通常在特定区域)
|
||||
content_start = text.find('日报')
|
||||
if content_start == -1:
|
||||
content_start = text.find('工作')
|
||||
if content_start == -1:
|
||||
content_start = 0
|
||||
|
||||
content = text[content_start:content_start + 800]
|
||||
|
||||
return {
|
||||
'title': title_text,
|
||||
'content': content,
|
||||
'success': True
|
||||
}
|
||||
except Exception as e:
|
||||
return {
|
||||
'title': '',
|
||||
'content': str(e),
|
||||
'success': False
|
||||
}
|
||||
|
||||
def main():
|
||||
# 读取链接
|
||||
with open('D:/desktop/feishu_docs_summary/all_feishu_links.json', 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
links = data.get('links', [])
|
||||
print(f'共 {len(links)} 个链接')
|
||||
|
||||
# 按组分类
|
||||
groups = {}
|
||||
for link in links:
|
||||
group = link['group']
|
||||
if group not in groups:
|
||||
groups[group] = []
|
||||
groups[group].append(link)
|
||||
|
||||
# 读取每个组的文档
|
||||
all_docs = []
|
||||
for group_name, group_links in groups.items():
|
||||
print(f'\n=== {group_name} ({len(group_links)} 个链接) ===')
|
||||
|
||||
for i, link in enumerate(group_links[:5], 1): # 每个组读取前5个
|
||||
print(f' [{i}/5] {link["sender"]} - {link["url"][:50]}...')
|
||||
result = extract_content(link['url'])
|
||||
result['sender'] = link['sender']
|
||||
result['time'] = link['time']
|
||||
result['group'] = group_name
|
||||
result['url'] = link['url']
|
||||
all_docs.append(result)
|
||||
time.sleep(0.3)
|
||||
|
||||
# 保存结果
|
||||
output = {
|
||||
'date': datetime.now().strftime('%Y-%m-%d'),
|
||||
'total_links': len(links),
|
||||
'docs_read': len(all_docs),
|
||||
'documents': all_docs
|
||||
}
|
||||
|
||||
with open('D:/desktop/feishu_docs_summary/feishu_docs_content.json', 'w', encoding='utf-8') as f:
|
||||
json.dump(output, f, ensure_ascii=False, indent=2)
|
||||
|
||||
# 生成 Markdown 报告
|
||||
report = f'# 飞书文档汇总报告\n\n'
|
||||
report += f'**日期**: {datetime.now().strftime("%Y-%m-%d")}\n'
|
||||
report += f'**链接总数**: {len(links)}\n'
|
||||
report += f'**已读取**: {len(all_docs)}\n\n'
|
||||
|
||||
for group_name in groups.keys():
|
||||
group_docs = [d for d in all_docs if d['group'] == group_name]
|
||||
if group_docs:
|
||||
report += f'## {group_name}\n\n'
|
||||
for doc in group_docs:
|
||||
report += f'### {doc["sender"]} ({doc["time"]})\n'
|
||||
report += f'**链接**: {doc["url"]}\n\n'
|
||||
report += f'{doc["content"][:300]}\n\n'
|
||||
report += '---\n\n'
|
||||
|
||||
with open('D:/desktop/feishu_docs_summary/feishu_summary_report.md', 'w', encoding='utf-8') as f:
|
||||
f.write(report)
|
||||
|
||||
print(f'\n已保存到:')
|
||||
print(f' - feishu_docs_content.json')
|
||||
print(f' - feishu_summary_report.md')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user