十条 Facebook 评论可以手动复制到表格;几百条评论、缺失作者、emoji、换行和每天重复导出,就不再适合人工操作。
本教程使用 SocQ Facebook Comments API 采集公开帖子评论,保留标准化 JSON,并生成可供 Excel、Google Sheets、分析、审核或存档使用的安全 CSV。
**快速答案:**把公开帖子 URL 提交到
POST /v1/facebook/comments,保存任务 ID 并轮询到完成,将标准化评论记录保留为 JSON。CSV 应作为派生输出生成:一条评论一行、UTF-8 编码、显式保存 parent ID,并防止电子表格公式注入。
导出 Facebook 评论的三种方式
手动复制
适合少量可见评论和一次性任务,但无法复现,不保留稳定 ID,也很难审计回复、作者、时间和附件。
无代码导出工具
适合需要立即获得 Excel 文件的人。使用前应确认支持哪些公开 URL、是否包含回复和附件、最多能导出多少评论,以及供应商如何保存数据。
API 自动化
适合定期导出、多帖子、内部产品、定时报表、数据校验和数据库入库。初始接入工作更多,但能获得明确任务状态、原始 JSON、可重复转换代码和稳定输出。
JSON 还是 CSV?
JSON 应作为事实来源,因为它可以保留:
author身份和资料字段;metrics中的可见点赞和回复数;media附件;extra中的来源帖子和父评论引用;- null 语义与未来新增字段。
CSV 更适合 Excel、Google Sheets、BI 导入、抽奖复核、标注和简单分析,但嵌套值必须展开,部分类型信息会丢失。
推荐流程:
公开帖子 URL
↓
Facebook Comments API
↓
不可变原始 JSON
↓
通过校验的标准化记录
↓
CSV / 数据仓库 / Dashboard
提交公开 Facebook 帖子 URL
curl -X POST "https://api.socq.ai/v1/facebook/comments" \
-H "Authorization: Bearer $SOCQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"urls": [
"https://www.facebook.com/facebook/posts/POST_ID"
]
}'
当前端点接受一个或多个受支持的公开 Facebook 帖子 URL,不能用搜索词、Page 名称或私密群组 URL 代替公开帖子。
提交前:
- 只接受 HTTPS 和 Facebook 域名。
- 如果支持分享短链,在受控预处理阶段解析。
- 不改变帖子身份时删除跟踪参数。
- 按规范 URL 去重。
- 保留原始输入作为来源证据。
轮询异步任务
创建响应包含任务 ID,应先持久化再轮询:
curl "https://api.socq.ai/v1/tasks/$TASK_ID?limit=100" \
-H "Authorization: Bearer $SOCQ_API_KEY"
queued 和 running 是正常状态,轮询间应退避。成功后处理 data.results.items;响应出现 has_more 时,用 next_cursor 继续。
保存输入 URL、任务 ID、提交时间、终态、最后已提交 cursor 和错误类别。Worker 重启时恢复已有任务,不要重复创建。
理解评论记录
标准化记录示例:
{
"id": "1569965031842178_123456789",
"platform": "facebook",
"resource": "comments",
"type": "comment",
"url": "https://www.facebook.com/facebook/posts/POST_ID",
"text": "评论正文",
"author": {
"id": "100064860875397",
"username": "facebook",
"name": "facebook",
"url": "https://www.facebook.com/facebook/"
},
"metrics": {
"likes_count": 18,
"replies_count": 2
},
"media": [],
"created_at": "2026-07-07T19:17:33",
"collected_at": "2026-07-08T08:59:45",
"extra": {
"post_id": "1569965031842178",
"parent_comment_id": null,
"input_url": "https://www.facebook.com/facebook/posts/POST_ID"
}
}
字段可能不可用。缺失作者 ID 应保留 null,不能写成 "unknown";缺失点赞数不等于零。replies_count 是可见回复数,不自动保证同一结果集包含所有回复正文。
先保存原始 JSON
原始存储提供审计轨迹,也能在不重新请求来源的情况下生成修正后的 CSV。建议保存:
- 供应商和端点版本;
- 任务 ID 与原始输入;
- 响应页和 cursor;
- 采集时间;
- 原始响应或记录批次;
- 校验结果与转换版本。
存储应加密、限制访问并设置适当保留期。“公开可见”不代表不存在隐私义务。
使用 Python 导出 CSV
下面的代码展开嵌套字段,并保护以公式字符开头的单元格:
import csv
import json
FORMULA_PREFIXES = ("=", "+", "-", "@")
def spreadsheet_safe(value):
if value is None:
return ""
text = str(value)
if text.startswith(FORMULA_PREFIXES):
return "'" + text
return text
def flatten(comment):
author = comment.get("author") or {}
metrics = comment.get("metrics") or {}
extra = comment.get("extra") or {}
return {
"post_id": extra.get("post_id"),
"comment_id": comment.get("id"),
"parent_comment_id": extra.get("parent_comment_id"),
"author_id": author.get("id"),
"author_name": spreadsheet_safe(author.get("name")),
"comment_text": spreadsheet_safe(comment.get("text")),
"likes_count": metrics.get("likes_count"),
"replies_count": metrics.get("replies_count"),
"created_at": comment.get("created_at"),
"collected_at": comment.get("collected_at"),
"source_url": extra.get("input_url") or comment.get("url"),
}
with open("facebook-comments.json", encoding="utf-8") as source:
comments = json.load(source)
rows = [flatten(comment) for comment in comments]
fields = list(rows[0].keys()) if rows else []
with open("facebook-comments.csv", "w", newline="", encoding="utf-8-sig") as output:
writer = csv.DictWriter(output, fieldnames=fields)
writer.writeheader()
writer.writerows(rows)
utf-8-sig 会写入 UTF-8 BOM,帮助常见 Excel 版本识别 Unicode。Python CSV writer 会正确处理逗号、双引号和字段内换行。
不要通过字符串逗号拼接生成 CSV,因为评论正文可以合法包含这些字符。
使用 Node.js 导出
使用维护中的 CSV 库,不要自己拼接字符串:
import { writeFile } from "node:fs/promises";
import { stringify } from "csv-stringify/sync";
const unsafe = /^[=+\-@]/;
const safe = (value) => {
if (value == null) return "";
const text = String(value);
return unsafe.test(text) ? `'${text}` : text;
};
const rows = comments.map((comment) => ({
post_id: comment.extra?.post_id ?? "",
comment_id: comment.id ?? "",
parent_comment_id: comment.extra?.parent_comment_id ?? "",
author_id: comment.author?.id ?? "",
author_name: safe(comment.author?.name),
comment_text: safe(comment.text),
likes_count: comment.metrics?.likes_count ?? "",
replies_count: comment.metrics?.replies_count ?? "",
created_at: comment.created_at ?? "",
collected_at: comment.collected_at ?? "",
source_url: comment.extra?.input_url ?? comment.url ?? "",
}));
const csv = stringify(rows, { header: true });
await writeFile("facebook-comments.csv", `\uFEFF${csv}`, "utf8");
锁定依赖版本并验证结果行数;测试包含 emoji、逗号、引号、Tab、换行和公式前缀的评论。
评论与回复的数据模型
优先使用 comment_id 作为记录 key。顶层评论的 parent_comment_id 为 null;存在父子关系时,它引用父评论。
不要使用显示名称作为身份 key,名称既不唯一也不永久。也不能假设显示顺序就是时间顺序,平台可能排序评论并个性化可见顺序。
定期导出时,upsert 评论实体并为可变指标追加快照:
comment
comment_id
post_id
parent_comment_id
author_id
text
created_at
first_seen_at
last_seen_at
comment_snapshot
comment_id
collected_at
likes_count
replies_count
构建增量导出
每天运行的流程可以是:
- 提交规范帖子 URL。
- 轮询并校验完成任务。
- 按评论 ID upsert。
- 为返回记录更新
last_seen_at。 - 只为成功采集追加指标快照。
- 从数据库或已校验 JSON 生成 CSV。
- 记录提交、返回、有效、新增、更新和拒绝数量。
一次失败或不完整采集不能证明旧评论已经删除,应要求多次成功观察或使用独立验证策略。
校验导出结果
检查:
- 每条记录的
platform为facebook、resource为comments; - 同一帖子内可用 ID 唯一;
- 时间戳可一致解析;
- 计数非负或为 null;
- parent ID 不指向自身;
- CSV 行数等于转换记录数;
- emoji、多语言、引号和换行能往返;
- 每行保留来源 URL 与采集时间。
可用少量公开浏览器样本对照,但浏览器显示数不是绝对完整性标准。评论可能被排序、过滤、删除、隐藏,或在两次观察之间变化。
负责任地使用评论数据
只采集合法目的所需的公开评论。不要绕过登录、私密群组、受众限制或技术控制,也不要用评论推断敏感特征或对个人作出高影响决定。
在需要时建立合法依据、限制保留、保护导出文件、控制表格分享、响应适用的删除和访问权利,并审查 Meta 当前条款和当地法律。本文不构成法律意见。
常见问题
能导出一个 Facebook 帖子的全部评论吗?
任何供应商都不应承诺普遍完整。结果取决于公开帖子、可见排序、来源行为、删除情况和端点覆盖。
是否包含回复?
标准模型可以表达父子关系和可见回复数,但应使用真实样本确认当前端点的回复正文覆盖。
可以导出私密群组评论吗?
此公开数据流程不支持,也不应绕过群组隐私或访问控制。
JSON 和 CSV 应该选哪个?
保留 JSON 作为可审计来源,为表格和简单导入生成 CSV。
Emoji 会丢失吗?
整个流程使用 UTF-8 时不会。示例还写入 BOM 以提高 Excel 兼容性。
为什么要防止公式前缀?
电子表格可能把以 =、+、- 或 @ 开头的评论当作公式。添加文本前缀可以防止不可信正文被执行为表格内容。
可以每天自动导出吗?
可以。持久化任务状态、使用退避、按评论 ID 去重、追加指标快照,并且只从通过校验的结果生成文件。