TypeScript实现Twitter自动转推#100DaysOfCode功能不生效求排查
TypeScript实现Twitter自动转推Bot故障修复方案
故障核心原因
- 未对搜索返回的推文列表做非空校验,无匹配结果时直接访问数组第一个元素会抛出异常,中断转推逻辑
- 未处理重复转推错误,20秒轮询间隔内没有新的带#100DaysOfCode话题推文时,重复转推同一条内容会被Twitter接口拒绝
- 你使用的
twit库依赖Twitter v1.1接口,需确认你的开发者账号已开通v1.1接口的读写权限,新申请的免费层级账号默认仅开放v2接口只读权限,无法调用v1.1的转推接口 - 需确认
./config配置文件中已完整填写API Key、API Secret、Access Token、Access Token Secret四个有效参数,缺项或参数错误会导致请求被拦截 - 搜索返回的第一条推文可能来自隐私账号、已被删除、或被限制转推,也会导致转推失败
修复后代码
import Twit, { Response } from 'twit'; const Twitter = new Twit(require('./config')); const mediaArtsSearch: Twit.Params = { q: '#100DaysOfCode', count: 100, // eslint-disable-next-line @typescript-eslint/camelcase result_type: 'recent', }; const retweetLatest = () => { Twitter.get('search/tweets', mediaArtsSearch, (error: Error, data: any) => { console.log(error, data); if (!error) { // 新增非空判断,避免无结果时报错 if (!data.statuses || data.statuses.length === 0) { console.log('未找到匹配的推文,本轮跳过'); return; } const targetTweet = data.statuses[0]; // 跳过已被转推、隐私账号的推文 if (targetTweet?.retweeted || targetTweet?.user?.protected || !targetTweet?.id_str) { console.log('当前推文不可转推,本轮跳过'); return; } const retweetId = targetTweet.id_str; Twitter.post( 'statuses/retweet/' + retweetId, {}, (error: Error, response: Response) => { if (response) { console.log( '转推成功!可前往账号查看', ); } if (error) { // 识别重复转推错误 if ((error as any)?.code === 327) { console.log('该推文已被转推过,本轮跳过'); return; } console.log('转推接口报错:', error); } }, ); } else { console.log('搜索接口报错:', error); } }); }; retweetLatest(); setInterval(retweetLatest, 1000 * 60); // 建议调整为1分钟轮询,避免触发接口频率限制
内容的提问来源于stack exchange,提问作者Alex.Foster
相关产品推荐
相关产品推荐

