Laravel5调用Twitter API获取授权用户全部点赞的方法及限流问题
关于Laravel中获取Twitter用户全部点赞的问题解答
咱们先聊聊你的实现思路:整体方向是对的,因为Twitter(现在叫X)的API本身不支持一次性拉取所有点赞内容——单请求返回的数量有上限(v1.1接口最多200条,v2接口最多100条),所以必须通过分页循环,每次用最后一条点赞的id_str(对应v1.1的max_id参数,v2则用pagination_token)来获取下一页数据。不过有几个细节需要调整:
- 别完全依赖
favorite_count来控制循环次数:这个数字是用户主页显示的点赞统计,实际可通过API获取的点赞数可能更少(比如部分内容被删除、账号被冻结,或者API权限限制你看不到某些内容),正确的终止条件应该是当API返回空数组,或者没有下一页的分页标记时停止循环。 - 确认API端点的正确性:如果用的是v1.1版本,调用的是
GET favorites/list;如果是v2版本,调用的是GET /2/users/{user_id}/liked_tweets,两者的分页参数逻辑略有不同,别搞混了。
接下来解决你遇到的[88] Rate limit exceeded错误:
这个错误是触发了X API的速率限制,不同版本的API限制差异很大:
- v1.1的
favorites/list接口:每15分钟最多15次请求,每次最多返回200条。你要拉取1136条理论上只需要6次请求,但如果你的循环没有添加延迟,或者短时间内发起了过多请求,就会触发限流。 - v2的
liked_tweets接口:每15分钟最多900次请求(用户认证场景),这个限制宽松很多,更适合批量拉取数据。
给你几个解决限流的实用方案:
- 添加请求延迟:在每次循环的请求之后,添加1-2秒的延迟(用PHP的
sleep()函数即可),避免短时间内挤太多请求到API服务器。 - 主动处理限流响应:捕获
429状态码(对应错误码88),然后通过响应头的x-rate-limit-reset字段获取限流窗口的重置时间,计算需要等待的时长,等窗口重置后再继续请求。 - 升级到API v2:如果还在使用v1.1,建议升级到v2,它的速率限制更友好,而且接口设计更清晰。
这里给你一段Laravel中处理分页和限流的伪代码参考:
$twitterUserId = auth()->user()->twitter_user_id; $allLikedTweets = []; $maxId = null; do { try { // 发起API请求(以v1.1为例) $response = Http::withToken(env('TWITTER_ACCESS_TOKEN')) ->get('https://api.twitter.com/1.1/favorites/list.json', [ 'user_id' => $twitterUserId, 'count' => 200, 'max_id' => $maxId, ]); // 处理限流情况 if ($response->status() === 429) { $resetTime = $response->header('x-rate-limit-reset'); $waitSeconds = $resetTime - time(); sleep($waitSeconds + 1); // 多等1秒确保窗口完全重置 continue; } $tweets = $response->json(); if (empty($tweets)) break; // 没有更多内容,终止循环 $allLikedTweets = array_merge($allLikedTweets, $tweets); $maxId = end($tweets)['id_str']; // 更新下一页的max_id // 添加延迟,避免触发限流 sleep(1); } catch (\Exception $e) { // 处理其他异常,比如网络问题 logger()->error('获取Twitter点赞失败:' . $e->getMessage()); break; } } while (true);
内容的提问来源于stack exchange,提问作者Abdullah Albdrani
相关产品推荐
相关产品推荐

