如何通过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的映射表,用于验证删除事件是否属于追踪范围
替代方案:用户推文流+定期检查(若合规流权限暂无法获取)
如果合规流权限暂时无法开通,可通过以下方式间接检测删除事件:
- 初始化获取目标用户的历史推文ID并存储
- 监听用户的推文创建流,实时新增推文ID到存储
- 定期重新拉取用户推文列表,对比本地存储找出缺失的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
相关产品推荐
相关产品推荐

