Twitter机器人报187错误:提示状态重复但实际未重复的问题
解决Twitter机器人187重复推文错误
错误原因
Twitter API返回的187错误是平台的重复状态检测机制,不允许账号发布与历史记录(包括已删除推文)完全一致的内容,哪怕间隔一段时间重复发送也会触发。
你的代码问题
- API端点错误:
tweet_bomdia_segunda函数调用了错误的API路径'atualizando',正确的推文发布端点应为'statuses/update',这个问题会导致请求失败,同时干扰错误排查。 - 固定内容触发重复检测:所有推文内容都是固定字符串,只要账号曾经发过相同内容,再次发送就会触发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
相关产品推荐
相关产品推荐

