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

Firebase+Twitter API取消关注机器人:定时循环失效问题

解决Twitter机器人取消关注操作无间隔触发的问题

看起来你遇到的核心问题是定时循环和异步API操作的冲突——原来的setInterval会不管异步请求是否完成,到点就触发下一轮,导致取消操作连续执行,不仅日志看起来无间隔,还极容易触发Twitter的API速率限制。我来给你拆解原因和修复方案:

问题根源

当你在setInterval的回调里加入T.post这种异步操作时,定时器不会等待异步请求完成就会启动下一个周期。如果你的API请求响应慢一点,多个请求就会堆积在一起,看起来就像没有间隔地连续执行,完全违背了你每20秒执行一次的初衷。

修复方案:用递归setTimeout替代setInterval

正确的做法是等当前所有取消操作完成后,再等待20秒启动下一轮,同时限制每次处理的账号数量,避免触发限流。这里用递归的setTimeout配合async/await来实现:

修复后的代码示例

// 假设你已经有获取不活跃账号的函数getInactiveUsers,这里让它支持指定每次获取的数量
async function getInactiveUsers(limit = 2) {
  // 你的逻辑:从Firebase或其他地方获取limit个不活跃账号
  // 比如返回[{ screen_name: 'user1' }, { screen_name: 'user2' }]
}

// 核心处理函数:每次处理一批账号,完成后等待20秒再执行下一次
async function processUnfollowBatch() {
  try {
    // 每次只处理少量账号(比如2个),适配Twitter API的速率限制
    const inactiveUsers = await getInactiveUsers(2);
    
    // 逐个执行取消关注,确保每个请求完成后再处理下一个(避免并发请求过多)
    for (const user of inactiveUsers) {
      await new Promise((resolve, reject) => {
        T.post('friendships/destroy', { screen_name: user.screen_name }, (err, data) => {
          if (err) {
            console.error(`取消关注 ${user.screen_name} 失败:`, err);
            // 如果是限流错误,可以在这里延长等待时间,比如reject后在外层处理
            reject(err);
          } else {
            console.log(`✅ 成功取消关注 ${user.screen_name}`);
            resolve(data);
          }
        });
      });
    }

    // 处理完当前批次后,等待20秒再启动下一轮
    setTimeout(processUnfollowBatch, 20000);
  } catch (error) {
    console.error('处理取消关注批次时出错:', error);
    // 即使出错,也要继续启动下一轮(可以根据错误类型调整等待时间,比如限流时等更久)
    setTimeout(processUnfollowBatch, 20000);
  }
}

// 启动机器人
processUnfollowBatch();

关键优化点

  1. 递归setTimeout:和setInterval不同,它会在当前所有异步操作完成后,再等待指定时间执行下一次,彻底避免请求堆积。
  2. 限制单次处理数量:每次只处理1-2个账号,结合20秒的间隔,完全在Twitter API的速率限制范围内(friendships/destroy的官方限制是每15分钟最多1000次,这个频率远低于上限)。
  3. Promise包装回调:把T.post的回调式API转换成Promise,用async/await确保顺序执行,避免同时发送多个请求。
  4. 容错处理:即使某个账号取消失败,也不会中断整个任务,依然会继续执行下一轮。

额外注意事项

  • 建议仔细查看Twitter API的速率限制文档,根据实际限制调整单次处理数量和间隔时间。
  • 如果遇到429 Too Many Requests(限流错误),可以在错误处理逻辑里延长下一次的等待时间(比如改成60秒),避免反复触发限流。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:40