You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Twitter API v2获取指定用户推文删除的流式通知?

如何通过Twitter API v2获取指定用户的推文删除流式事件

第一步:解决API访问权限问题

你遇到的client-not-enrolled错误是因为你的开发者App未关联到Project,且未完成Standard Basic等级注册。解决步骤:

  • 登录Twitter开发者平台,将你的App关联到已创建的Project中
  • 确保账号已完成Standard Basic等级注册(免费 tier 即可满足需求)
  • 重新生成Bearer Token,使用关联到Project的App的凭证

正确使用合规流(Compliance Stream)获取删除事件

合规流是Twitter API v2中唯一能实时获取推文删除事件的流式接口,需按以下方式正确使用:

合规流代码示例

const BEARER_TOKEN = "你的Bearer Token";
const { ETwitterStreamEvent, TwitterApi } = require("twitter-api-v2");

async function runComplianceStream() {
  const appClient = new TwitterApi(BEARER_TOKEN);
  // 合规流分为4个分区,必须监听所有分区才能避免遗漏事件
  for (let partition = 1; partition <= 4; partition++) {
    const stream = await appClient.v2.getStream("tweets/compliance/stream", { partition });
    
    stream.on(ETwitterStreamEvent.Data, (event) => {
      // 筛选出删除事件
      if (event.event_type === "delete") {
        console.log("推文已删除:", event.tweet_id);
        // 需通过提前存储的推文-用户映射关系,判断该删除的推文是否属于目标用户
      }
    });
    
    stream.on(ETwitterStreamEvent.Error, (err) => {
      console.error("流连接错误:", err);
    });
  }
}

runComplianceStream();

关键注意事项

  • 合规流会推送所有合规事件(删除、隐藏等),需通过event_type字段过滤出delete类型
  • 必须监听全部4个分区,否则会丢失部分事件
  • 合规流不返回推文所属用户ID,需提前维护目标用户的推文ID与用户ID的映射表,用于验证删除事件是否属于追踪范围

替代方案:用户推文流+定期检查(若合规流权限暂无法获取)

如果合规流权限暂时无法开通,可通过以下方式间接检测删除事件:

  1. 初始化获取目标用户的历史推文ID并存储
  2. 监听用户的推文创建流,实时新增推文ID到存储
  3. 定期重新拉取用户推文列表,对比本地存储找出缺失的ID即为已删除推文

定期检查代码示例

const BEARER_TOKEN = "你的Bearer Token";
const { TwitterApi } = require("twitter-api-v2");

const targetUserIds = ["123", "456"];
// 存储用户ID对应的推文ID集合
const storedTweetIds = new Map();

const appClient = new TwitterApi(BEARER_TOKEN);

// 初始化存储目标用户的推文ID
async function initTweetStore() {
  for (const userId of targetUserIds) {
    const timeline = await appClient.v2.userTimeline(userId, { max_results: 100 });
    storedTweetIds.set(userId, new Set(timeline.data.map(tweet => tweet.id)));
  }
}

// 定期检查并找出已删除的推文
async function checkDeletedTweets() {
  for (const userId of targetUserIds) {
    const currentTimeline = await appClient.v2.userTimeline(userId, { max_results: 100 });
    const currentIds = new Set(currentTimeline.data.map(tweet => tweet.id));
    const storedIds = storedTweetIds.get(userId);

    const deletedIds = [...storedIds].filter(id => !currentIds.has(id));
    if (deletedIds.length > 0) {
      console.log(`用户${userId}已删除的推文ID:`, deletedIds);
      // 更新存储的推文ID集合
      storedTweetIds.set(userId, currentIds);
    }
  }
}

// 初始化后每小时执行一次检查
initTweetStore().then(() => {
  setInterval(checkDeletedTweets, 60 * 60 * 1000);
});

合规任务返回空数组的原因

合规任务仅支持处理属于你的开发者账号或已授权你App的用户的推文,若提交的推文ID不属于上述范围,会返回空结果,因此该方法不适合追踪任意用户的删除事件。


内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:20:59