告别复制粘贴:M365 Copilot 聊天记录导出的终极指南

最近在折腾 M365 Copilot(也就是那个企业版的 Microsoft 365 Copilot),发现一个挺让人头疼的问题:虽然用起来很爽,但想把之前的精彩对话保存下来,简直比登天还难。

很多朋友可能会想,这不就是个网页吗,找个插件或者让 AI 浏览器自动化一下不就完了?我当初也是这么想的,结果现实狠狠地给了我一巴掌。今天就来聊聊为什么这事儿这么难,以及到底有没有“优雅”的解决办法。

为什么常规路子都走不通?

在深入探讨解决方案之前,我们先得明白为什么简单的“一键导出”在 M365 Copilot 这里行不通。这与我们平时使用的 ChatGPT 或者文心一言等独立网站有很大区别。

1. 复杂的动态渲染架构

单页应用架构示意图

单页应用(SPA)通过JavaScript动态渲染内容的原理图,解释了为何简单抓取会失效。

M365 Copilot 是深度集成在 Microsoft 365 生态里的,也就是那个 m365.cloud.microsoft 域名下。它的页面采用了极其复杂的单页应用(SPA)架构。你看到的对话气泡,其实不是静态的 HTML 文本,而是通过 JavaScript 动态加载、不断重新渲染的对象。

这意味着,当你右键“保存网页”或者使用普通的爬虫工具(甚至是豆包这种操作浏览器的 AI)去抓取时,往往只能抓到页面的“骨架”,而肉——也就是真正的对话内容——可能还在内存里没渲染出来,或者被包裹在层层叠叠的 <div> 和 Shadow DOM 里,导致抓取出来的东西要么是空的,要么格式乱七八糟。

2. 企业级的安全限制

既然是企业版(M365),安全级别自然是拉满的。微软为了防止数据泄露,对这个域的接口做了极其严格的限制。很多通用的导出插件试图去监听网络请求或者读取 DOM,很容易被浏览器的安全策略或者 M365 自身的脚本拦截。这就解释了为什么“插件也试了,效果都不太行”。

3. 加载机制的限制

M365 Copilot 的历史对话记录并不是一次性全部加载的。当你翻页时,它会通过 API 请求新的数据块。这种懒加载机制对于人工浏览很友好,但对于自动化脚本来说就是噩梦——你必须模拟这个滚动加载的过程,还得精确把握请求的时机,稍微快一点或慢一点,数据就丢了。

终极解决方案:从控制台到 API

既然常规路子走不通,那就只能上技术流了。既然你是用这个工具的,想必动手能力也不差。以下提供三种不同层级的方案,按难度从低到高排列。

方案一:浏览器控制台“暴力”抓取(推荐度:⭐⭐⭐)

这是最快见效的方法,不需要安装任何软件,只要你手边有 Chrome 或 Edge 浏览器。

  1. 打开开发者工具:在 M365 Copilot 页面按下 F12,或者右键选择“检查”。
  2. 切换到 Console(控制台)标签页
  3. 定位数据源:在 Console 中输入 document.all 不太现实,更聪明的方法是观察网络请求。切换到 Network 标签页,筛选 Fetch/XHR 请求。
  4. 寻找 API 接口:在页面上进行一次翻页操作,你会看到新的请求冒出来。通常这些请求的 URL 里包含 messagesthreads 关键字,返回的格式是 JSON。
  5. 执行抓取脚本:回到 Console,我们可以写一段简单的 JS 代码来遍历当前已经加载的 DOM 节点。虽然不完全原始,但比复制粘贴强。
// 一个简单的脚本示例,用于提取当前页面可见的文本
let chatContent = '';
// 假设对话容器的类名包含 content 或 message,需根据实际 DOM 调整
let messages = document.querySelectorAll('[class*="message"], [class*="content"]');
messages.forEach(msg => {
  chatContent += msg.innerText + '\n-------------------\n';
});
console.log(chatContent);
// 然后复制打印出来的文本

注意:这种方法只能抓取当前页面“看得到”的内容。如果想抓全部历史,你得一边翻页一边跑这段代码,或者写个循环模拟滚动事件。

方案二:利用 Graph API 进行完美导出(推荐度:⭐⭐⭐⭐⭐)

如果你是管理员账户,或者有相应的 API 权限,这是最“优雅”、最官方的方法。微软提供了 Microsoft Graph API,专门用于访问 M365 数据。

  • 前提条件:需要在 Azure AD 中注册应用,获取 Client IDClient Secret 和适当的权限(如 Chat.ReadChat.ReadBasic)。
  • 操作逻辑:通过调用 Graph API 的 /chats/messages 端点,可以直接拿到结构化的 JSON 数据。

这里有一个 Python 的思路示例(省去了鉴权部分,直接讲核心逻辑):

浏览器开发者工具控制台

在浏览器控制台中执行 JavaScript 脚本以抓取页面可视内容。

import requests

# 假设你已经拿到了 token
access_token = 'YOUR_ACCESS_TOKEN'
headers = {'Authorization': 'Bearer ' + access_token}

# 获取所有聊天列表
chats_url = 'https://graph.microsoft.com/v1.0/chats'
response = requests.get(chats_url, headers=headers)
chats = response.json()['value']

for chat in chats:
    chat_id = chat['id']
    # 获取该聊天下的所有消息
    messages_url = f'https://graph.microsoft.com/v1.0/chats/{chat_id}/messages'
    msg_response = requests.get(messages_url, headers=headers)
    # 这里你可以将 msg_response.json() 保存为 Markdown 或 JSON 文件
    print(f"导出聊天 {chat_id} 的记录...")

优点:数据完整,包含时间戳、格式、图片引用等所有元数据,格式正确,不会乱码。

缺点:门槛较高,需要懂一点代码和 Azure 配置。而且,目前的 API 对 Copilot 特有的生成内容可能需要特殊的解码处理。

方案三:Playwright 自动化脚本(推荐度:⭐⭐⭐⭐)

如果不想搞 API 权限,又觉得控制台手搓太累,可以用 Playwright 或 Selenium 这种自动化测试工具。

它的原理是模拟一个真实的浏览器,自动帮你点击“加载更多”、滚动页面,然后再把 HTML 扒下来。

  • 核心思路:编写一个脚本,打开 M365 页面 -> 登录(需处理 MFA) -> 循环滚动到底部直到没有新内容 -> 提取 DOM -> 保存为 Markdown。

虽然比控制台麻烦,但它可以真正实现“无人值守”的全量导出。

总结

M365 Copilot 的导出问题,本质上是封闭生态与用户数据所有权之间的矛盾

  • 如果你只是偶尔需要保存一段对话,浏览器控制台脚本 + 手动整理可能最快。
  • 如果你是企业 IT 人员,需要批量备份数据,研究 Microsoft Graph API 是唯一的正途。
  • 如果你是极客玩家,Playwright 自动化流程能带给你最大的成就感。

别再死磕那些通用插件了,针对这种企业级深度集成的应用,底层的手段往往比表面的工具更有效。希望这些思路能帮你摆脱“手搓”的痛苦,把 Copilot 变成你真正可控的知识库!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭