

# 如何核对 X 公开计数与自己的分析导出数据

先核对帖子、指标定义、时间范围和观测时间，再判断两次读数是否不一致。

一次读数是指在某一时间从某一来源取得的一个数值。核对是指记录哪些内容一致、哪些内容的统计口径不同，以及哪些内容仍然未知。统计口径是指一个数字包含哪些内容，包括指标、帖子和时间窗口。时间窗口是指一段时间的起点和终点。

公开数据快照无法重建缺失的账号月报。快照是指在某一时间读取的一组公开计数值。请区分能够解释的统计口径差异与无法解释的差异。

## 对比步骤

### 1. 明确报表需求。

公开帖子台账可以记录你已知且目前能够读取的帖子。台账中每篇帖子占一行。它无法填满非公开报表中的所有列，也无法补出你没有保存过的往月数据。

用一行文字写明你的需求。如果你需要过去某个月的完整账号报表，请到此停止，并说明公开数据快照无法提供这份报表。如果你已经持有导出文件，可以继续。该文件必须涉及已知的公开帖子。

### 2. 先读取一篇已知的公开帖子。

Actor 是托管运行的数据采集程序。Task 是为该 Actor 保存的一组输入预设。[X Post Metrics](https://apify.com/chronometrica/x-post-metrics) Actor 负责采集公开数据行。对比工作由你完成。Actor 不会判定结果类别。已保存的 Task 只是起始输入，并不能证明对比过程会自动完成。

这些字段规则以公开版本 1.0.4 为依据。该版本通过 `startUrls` 接受 1 至 1,000 个已知的公开帖子状态 URL。状态 URL 是一篇帖子的网页地址。本文所说的帖子，是指一条拥有独立状态 URL 的公开 X 消息。X 是网址为 x.com 的公开网站。

按以下顺序检查一次运行。先打开已保存的 Task，将示例替换为小规模试运行所用的 URL。然后读取原生数据行字段，再读取各项指标的 `postMetricStatus`，最后读取运行摘要。不要把运行摘要放入帖子数据行。

当前已保存的 Task 输入是一个示例：

```json
{
  "startUrls": [
    "https://x.com/OpenAI/status/2074907025537224840",
    "https://x.com/OpenAI/status/2074907027378511884",
    "https://x.com/OpenAI/status/2074907031862190406"
  ]
}
```

对比步骤

这 3 个 URL 都是示例。请将它们替换为你已知的公开帖子。小规模试运行是你的首次小范围运行。试运行只用 1 个 URL，以控制测试规模。

该 Actor 不会搜索个人主页时间线，不会生成指定日期范围的账号报表，也不会访问非公开分析数据。它无法恢复你没有保存过的历史记录，也不采集受保护的帖子。受保护的帖子不属于公开帖子。它不使用账号凭据。凭据是密码或其他登录机密信息。

每个输入 URL 都会生成一条记录采集尝试的数据行。即使缺少有用信息，数据行也会包含 `status` 和 `statusReason`。`status` 表示该行的最终状态。`statusReason` 简要说明原因。计数值缺失不等于零。零是实际返回的数字。null 表示该值无法获取。

在信任试运行数据行之前，先检查 4 项内容。检查 `postId` 和 `postUrl` 是否对应你请求的帖子。检查 `status`。检查 `observedAt`。检查你将使用的每项指标的 `postMetricStatus`。`observedAt` 是观测时间，即读取计数值的时间。发布时间是帖子发布的时间。不要混用这两个时间。

原生数据行字段包括 `inputUrl`、`postUrl`、`postId`、`profileId`、`views`、`likes`、`replies`、`reposts`、`quotes`、`bookmarks`、`profileFollowers`、`postMetricStatus`、`status`、`statusReason` 和 `observedAt`。

`inputUrl` 是你提交的 URL。`postUrl` 是数据行中的帖子 URL。`postId` 是帖子 ID。`profileId` 是账号 ID。计数值是为该帖子或账号存储的数字。`views` 统计公开浏览事件的次数。数据行还包含 `likes`、`replies`、`reposts`、`quotes` 和 `bookmarks`。点赞是用户表示喜欢该帖子的标记。回复是对帖子的回应。转帖是分享该帖子。引用是附加文字后分享该帖子。书签表示收藏的帖子。在此不要将这些计数值相加。本方法不会用它们计算比率。

`profileFollowers` 是该账号在 `observedAt` 时的公开粉丝数。粉丝是关注该个人主页的账号。不要将 `profileFollowers` 用作帖子浏览次数。

精度说明一个数字是精确值、舍入值，还是精度未知的值。`postMetricStatus` 提供每项返回指标的精度。请将精度与数值一起保留。如果指标缺失，就保持缺失状态。不要填写 0 来补缺。

对照运行是经过检查的一次公开数据采集运行，用于查看会返回哪些字段。当前的一次公开数据对照运行返回了所请求的身份和时间字段，包括 `postId`、`postUrl`、`profileId`、发布时间和 `observedAt`。它还返回了 `views`、`likes`、`replies`、`reposts`、`quotes`、`bookmarks` 和 `profileFollowers`。其 `status` 为 ok。

返回的每项 `postMetricStatus` 指标均为 present/exact/public_post。

| 返回的指标 | 对照运行的 postMetricStatus |
| --- | --- |
| views | present/exact/public_post |
| likes | present/exact/public_post |
| replies | present/exact/public_post |
| reposts | present/exact/public_post |
| quotes | present/exact/public_post |
| bookmarks | present/exact/public_post |

present 表示该指标存在于数据行中。exact 表示该次对照运行中的数值是精确值。`public_post` 表示来源是公开帖子。该次对照运行说明公开计数值可以被采集，但并不说明公开计数值等于非公开导出数据。你自己的运行结果可能不同。请读取你自己的数据行。不要将对照运行的状态套用到它没有读取过的帖子上。

运行摘要不是帖子数据行。其字段包括 `inputCount`、`datasetRows`、`usefulRows`、`billableRows`、`failedRows`、`statusCounts` 和 `stopReason`。

`inputCount` 统计输入 URL 的数量。`datasetRows` 统计已写入的数据行数。`usefulRows` 统计包含有用信息的数据行数。`billableRows` 统计该次运行标记为计费的数据行数。`failedRows` 统计失败的数据行数。`statusCounts` 按状态汇总数据行数。`stopReason` 说明运行停止的原因。不要将这些值中的任何一个粘贴到帖子浏览次数单元格中。本文不会编造这些计数，也未说明价格。

### 3. 记录你已经持有的自有导出文件。

导出文件是从你获准使用的分析报表中导出的文件。授权报表是你获准使用的报表。只有获得使用许可时，才能使用导出文件。本方法不会从 X 获取非公开导出文件，不会免费替代分析面板，也不会绕过访问规则。

较早的公开帖子不能确定 X Analytics 目前的价格或访问条件。参见 [Twitter 分析的替代方案](https://www.reddit.com/r/Twitter/comments/1e5a688/alternatives_for_twitter_analytics/)和 [X（Twitter）分析](https://www.reddit.com/r/Twitter/comments/1abvw05/x_twitter_analytics/)。如果你尚未持有报表，就将报表一侧的信息保留为未知。

如果你持有获准使用的报表，请从中复制以下内容：帖子 ID、指标名称、报表自身注释中的指标定义、日期范围和时区，以及提取时间。提取时间是取得该报表文件的时间。如果报表说明了付费或自然统计口径，也要一并复制。付费口径涵盖推广帖子。自然口径涵盖报表标记为未推广的帖子。如果报表没有说明这种划分，不要自行编造。

不要假定名为 impressions 的列与公开浏览次数一致。不要将账号总数当作单篇帖子的总数。请使用报表中的定义。如果定义缺失，对比结论就仍然未知。

### 4. 按帖子 ID 匹配数据行。

将 `postId` 与导出文件中的帖子 ID 匹配。不要按标题或正文匹配。两篇不同的帖子可能使用相同文字。文案发生变化后，帖子 ID 仍可能相同。请以 ID 作为匹配键。

没有对应报表行的公开数据行也要保留。没有对应公开数据行的报表行也要保留。对于无法读取的 ID，保留为未知。不要把未匹配的情况改成 0。

有些报表行按账号和统计周期汇总，涵盖同一时间窗口内的多篇帖子。不要将这种数据行关联到单篇帖子，也不要将账号数值当作该帖子的数值。请在数据行中写明汇总层级。汇总层级说明该行代表单篇帖子、单日还是单个账号。

### 5. 比较数字前，先核对统计口径。

为这组对比数据指定一个统计口径标签。

`same_metric_scope` 表示指标定义、帖子和时间范围一致。

`different_metric_scope` 表示你能证明定义或统计周期存在差异。

`definition_unknown` 表示缺少对比所需的某项定义。

公开累计计数值表示读取时的总数。累计是指从帖子发布起到 `observedAt` 为止，将发生的事件累加。选定周期的报表则说明某个时间窗口内发生的事件。一个截至昨天的时间窗口，其数值可能与今天读取的总数不同。这两个数字回答的是不同的问题。

公开浏览次数统计的是浏览事件。X 表示，其中可能包括重复浏览和作者自己的浏览。它们并不是去重人数。使用 `views` 前，请阅读当前的[浏览次数帮助说明](https://help.x.com/en/using-x/view-counts)。该页面并不能说明 `views` 等同于每一种导出指标。如果你的导出文件采用其他定义，请沿用导出文件的表述。如果你无法读取导出文件中的定义，请使用 `definition_unknown`。

更新可能有延迟。延迟是指较晚读取的数值仍未包含最近发生的某个事件。没有证据时，不要将延迟认定为原因。猜测不是证据。

### 6. 仅在具备对比条件时计算差值。

如果定义和统计周期足够一致，可以计算所显示数值的差值。使用简单的减法即可。

```text
displayed difference = public value - owned value
observed counter delta = later saved public value - earlier saved public value
```

对比步骤

在结果旁保留精度信息。如果 `postMetricStatus` 并非精确状态，不要称结果为精确值。如果公开数值经过舍入，可能无法实现精确匹配。只要任一数值缺失，就不要计算差值。

[保存的 2 份公开数据快照](/zh-Hans/articles/facebook%E5%B8%96%E5%AD%90%E6%8C%87%E6%A0%87%E9%9A%8F%E6%97%B6%E9%97%B4%E5%8F%98%E5%8C%96/)只能显示这 2 个已保存时点之间的变化。观测到的计数变化量就是这一变化。它只适用于你保存过的时点。不要编造更早的基线。基线是起始读数。你无法通过猜测起始值来恢复缺失月份的数据。

X 修正计数值时，数值可能下降。负向变化可能是真实的。不要将每次数值下降都归为文件读取错误。

如果统计口径不一致，你仍可以展示减法结果，但必须注明这只是算术计算。不要将其标为原因。

### 7. 对结果分类。

根据证据所能支持的对比结论，选择一个结果类别。

`explained_scope_difference` 表示你能指出已知的统计口径差异。该类别不能解释数值差距的全部大小。

`timing_or_precision_limit` 表示时间不同，或精度限制了精确匹配。只有当你能证明的就是这项限制时，才使用此类别。

`comparable_values` 表示帖子、定义和时间范围足够一致，可以比较这两个数字。某一行匹配，并不能证明整份报表完整。

`unresolved_difference` 表示你无法提供证据支持某个原因。请将原因保留为未知。

造假意味着数字被伪造。存在差距并不能证明造假，也不能证明多出的数值来自付费推广。它不能证明分析工具发生故障，也不能证明 X 隐藏了帖子。只有双方原始记录都支持某个原因时，才保留该原因。原始记录是指你持有的公开数据行或自有报表行。如果定义缺失，原因就仍然未知。

### 8. 交付逐帖核对表和简短说明。

每篇帖子使用一行。列出帖子 ID 和双方来源。将发布时间和观测时间放在不同单元格中。列出指标名称、定义、时间窗口和精度。缺失值应标为缺失。列出统计口径标签和结果类别。如果数值差距仍无法解释，请在说明中写明。

如果你只有公开数据行，请报告这些数据行及上述限制。不要声称这些数据是月度展示次数、去重触达人数、非公开互动总数或营销活动回报。不要将这些计数值换算成比率。

在说明末尾，用一篇帖子的一个指标作结。该行数据要么具备可比性，要么仍未解决。不要将原因未知的差距说成某种原因。

## 虚构帖子台账

以下 5 篇帖子均为原创虚构示例。它们不是产品运行结果，也不是 Actor 返回的数据行。在这个虚构示例中，没有任何分析面板被替代，也没有获取任何非公开导出文件。示例未提供发布时间。不要将观测时间复制到发布时间单元格中。不要将浏览次数换算成去重人数。

P1 至 P5 是虚构的帖子 ID。这些帖子都不代表真实导出数据。

| 帖子 | 发布时间 | 公开指标 | 公开数值 | 公开数据观测时间 | 公开指标定义 | 公开数据时间窗口 | 公开数值精度 | 自有报表指标 | 自有报表数值 | 自有报表时间 | 自有报表指标定义 | 自有报表时间窗口 | 统计口径 | 算术计算 | 结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| P1 | 未提供 | views | 1,500 | 10 月 13 日 10:00 UTC | 公开浏览事件次数 | 截至观测时间的累计值 | 未说明 | impressions | 1,200 | 未提供 | 所述时间窗口内有文档定义的展示次数 | 10 月 1–12 日；未提供时区 | different_metric_scope | 1,500 - 1,200 = 300 | explained_scope_difference 仅说明统计口径差异；300 的差距尚未得到完整解释 |
| P2 | 未提供 | views | 先为 1,000，后为 1,200 | 10 月 13 日 10:00 UTC 和 10 月 13 日 12:00 UTC | 精确的公开累计浏览次数 | 分别截至每次已保存读数时点的累计值 | 精确 | 无自有报表行 | 无自有报表行 | 无自有报表行 | 无自有报表行 | 无自有报表行 | 2 个已保存时点采用相同的公开浏览次数定义 | 1,200 - 1,000 = 200 | 仅表示这 2 个已保存时点之间观测到的计数变化量 |
| P3 | 未提供 | views | null，不是 0 | 未提供 | 无法获取公开浏览次数 | 无法获取 | 不适用 | 未提供 | 500 | 未提供 | 未提供 | 未提供 | 公开数值缺失，因此未核对统计口径 | 不要计算 | 无法进行公开数据对比；并非存在 -500 的差距 |
| P4 | 未提供 | 未提供 | 2,000 | 未提供 | 未提供 | 未提供 | 未知 | 未提供 | 未提供 | 未提供 | 定义缺失 | 未提供 | definition_unknown | 不要计算 | unresolved_difference |
| P5 | 未提供 | 有文档定义的计数指标 | 250 | 与自有报表读数时间相同；未提供确切时刻 | 与自有报表一侧相同、有文档定义的计数指标 | 与自有报表一侧的时间窗口相同；未提供日期 | 除数值 250 外，未说明精度 | 有文档定义的计数指标 | 250 | 与公开读数时间相同；未提供确切时刻 | 采用相同且有文档定义的计数口径 | 与公开数据一侧的时间窗口相同；未提供日期 | same_metric_scope | 250 - 250 = 0 | comparable_values，仅适用于这一项计数指标 |

P1 和 P2 使用 UTC（协调世界时）计时。UTC 不随当地夏令时调整。

P1 存在已知的统计口径差异。公开数据单元格是 10 月 13 日 10:00 UTC 读取的累计浏览次数。自有报表单元格是 10 月 1–12 日的展示次数。浏览次数与指定时间窗口内的展示次数不是同一指标。截至 10 月 13 日的总数，与截至 10 月 12 日的时间窗口，也不是同一统计周期。因此，统计口径标签为 `different_metric_scope`。结果类别 `explained_scope_difference` 仅说明这一统计口径事实。

减法 1,500 - 1,200 = 300 只是算术计算。它不表示已核实缺失了 300 次展示，也不能证明存在采集错误。仅凭这两份原始记录，你无法拆解这 300 的构成。你不知道有多少次浏览发生在 10 月 13 日，不知道有多少是重复浏览或作者自己的浏览，也不知道展示次数的统计规则差异对这 300 有何影响。请将这部分保留为未解释。

P2 有 2 次精确的公开累计浏览次数读数。在 10 月 13 日 10:00 UTC，计数值为 1,000。在 10 月 13 日 12:00 UTC，计数值为 1,200。观测到的计数变化量为 1,200 - 1,000 = 200。这是 2 个已保存时点之间所显示的变化。它不代表 200 名去重用户，也不是恢复出来的月报。在这个虚构示例中，P2 没有自有报表行。不要编造 10:00 之前的起始值，也不要描述这 2 个时点之间的变化过程。你没有保存期间的读数。

P3 的公开浏览次数为 null，报表数值为 500。null 表示无法获取公开浏览计数值，并不表示浏览次数为零。由于公开数值缺失，因此不能做减法。500 - 0 是错误的算式，0 - 500 也同样错误。这里不存在 -500 的差距。报表数值应保留在报表一侧，它不是公开浏览总数。这一结果表示无法进行公开数据对比，并不表示已完成对不一致情况的分类。

P4 显示的公开数值为 2,000，精度未知。报表缺少定义。指标名称、时间和时间窗口均未提供。统计口径标签为 `definition_unknown`。你无法用证据支持某个原因。结果为 `unresolved_difference`。不要猜测是舍入造成的，不要猜测是延迟造成的，也不要猜测另一侧的指标名称。

P5 两侧使用同一个有文档定义的计数指标，统计口径和时间均相同。两个数值都是 250。所显示数值的差值为 250 - 250 = 0。统计口径标签为 `same_metric_scope`。结果为 `comparable_values`。该结果仅适用于这一项计数指标。它不能说明报表中的每篇帖子都已检查，不能说明 P5 的其他每项指标都一致，也不能说明报表完整。

## 下一步

核对一篇已知帖子的一个指标。使用相同的帖子 ID、指标定义和时间范围。如果差距无法解释，就保留为未解决。使用 [X Post Metrics Actor](https://apify.com/chronometrica/x-post-metrics) 采集公开数据一侧的信息。从 [X Post Analytics Snapshot Task](https://apify.com/chronometrica/x-post-metrics/examples/x-post-analytics-snapshot) 开始。将示例 URL 替换为 1 个已知公开帖子的 URL。

## 来源和延伸阅读

- [X Post Metrics Actor](https://apify.com/chronometrica/x-post-metrics)
- [X Post Analytics Snapshot Task](https://apify.com/chronometrica/x-post-metrics/examples/x-post-analytics-snapshot)
- [浏览次数](https://help.x.com/en/using-x/view-counts)
- [Twitter 分析的替代方案](https://www.reddit.com/r/Twitter/comments/1e5a688/alternatives_for_twitter_analytics/)
- [X（Twitter）分析](https://www.reddit.com/r/Twitter/comments/1abvw05/x_twitter_analytics/)