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

Twitter机器人报187错误:提示状态重复但实际未重复的问题

解决Twitter机器人187重复推文错误

错误原因

Twitter API返回的187错误是平台的重复状态检测机制,不允许账号发布与历史记录(包括已删除推文)完全一致的内容,哪怕间隔一段时间重复发送也会触发。

你的代码问题

  1. API端点错误:tweet_bomdia_segunda函数调用了错误的API路径'atualizando',正确的推文发布端点应为'statuses/update',这个问题会导致请求失败,同时干扰错误排查。
  2. 固定内容触发重复检测:所有推文内容都是固定字符串,只要账号曾经发过相同内容,再次发送就会触发187错误,哪怕是定时任务隔几天重复发送也会被检测到。

解决方案

1. 给推文添加唯一可变内容

最简单的方式是在每条推文末尾添加唯一标识,比如时间戳片段、随机字符或小表情,确保每次发送的内容不完全一致。

2. 修正API端点错误

把'atualizando'改为正确的'statuses/update',保证请求能正常到达Twitter API。

3. 添加错误重试逻辑(可选)

捕获187错误时自动调整内容再次发送,避免任务直接失败。

修改后的代码示例

const dotenv = require('dotenv')
const Twitter = require('twitter')
const CronJob = require("cron").CronJob

dotenv.config({ path: './config.env'});

const twitterClient = new Twitter({
    consumer_key: process.env.TWITTER_CONSUMER_KEY,
    consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
    access_token_key: process.env.TWITTER_ACCESS_KEY,
    access_token_secret: process.env.TWITTER_ACCESS_SECRET
});

// 生成唯一后缀的工具函数
const getUniqueSuffix = () => {
  // 用时间戳后四位做唯一标识,避免内容重复
  return ` ${new Date().getTime().toString().slice(-4)}`;
}

const tweet_bomdia = async () => {
  const status = `bom dia @nalinhane, boa aula hoje ❤️${getUniqueSuffix()}`;
  twitterClient.post('statuses/update', {status}, function(error, tweet, response) {
    handleTweetError(error);
  })
}

const tweet_bomdia_segunda = async () => {
  // 修正API路径错误
  const status = `bom dia @nalinhane, boa semana e boa aula hoje ❤️${getUniqueSuffix()}`;
  twitterClient.post('statuses/update', {status}, function(error, tweet, response) {
    handleTweetError(error);
  })
}

const tweet_bomdia_quarta = async () => {
  const status = `bom dia @nalinhane, aguenta que já chegamos no meio da semana 😅❤️${getUniqueSuffix()}`;
  twitterClient.post('statuses/update', {status}, function(error, tweet, response) {
    handleTweetError(error);
  })
}

// 统一处理推文错误
const handleTweetError = (error) => {
  if(!error) return;
  if(error[0]?.code === 187) {
    console.log('内容重复,尝试重新发送');
    // 重试时用不同的后缀
    const retryStatus = error.config.data.status + ` ${Math.floor(Math.random()*100)}😉`;
    twitterClient.post('statuses/update', {status: retryStatus}, (err) => {
      err ? console.error('重试失败:', err) : console.log('重试成功');
    });
  } else {
    throw error;
  }
}

const job0 = new CronJob("0 7 * * 2,4", () => {
    console.log('Bom dia sendo enviado!')
    tweet_bomdia()
})

const job1 = new CronJob("0 7 * * 1", () => {
    console.log('Bom dia de segunda sendo enviado!')
    tweet_bomdia_segunda()
})

const job2 = new CronJob("0 7 * * 3", () => {
    console.log('Bom dia de quarta sendo enviado!')
    tweet_bomdia_quarta()
})

job0.start()
job1.start()
job2.start()

额外提示

  • 测试阶段建议用测试账号调试,避免主账号触发过多限制。
  • 如果之前已经发布过相同内容,哪怕删除了,Twitter的检测机制仍可能留存记录,所以必须添加可变内容才能绕过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:48:22