如何通过Twitch API突破100条限制批量获取直播频道数据?
解决Twitch API循环获取全部直播流的问题
没问题,我来帮你搞定这个循环请求Twitch API获取所有直播流的需求!核心思路就是通过递增offset参数,每次请求100条数据,直到API返回空的流列表为止。
完整实现代码
我们用do-while循环来处理分页请求,同时加入错误处理和速率限制避免被API限流:
<?php // 先实现带认证的curl函数(Twitch旧版API需要Client-ID) function file_get_contents_curl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 替换成你自己的Twitch Client-ID(去开发者平台申请) curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Client-ID: your_client_id", "Accept: application/vnd.twitchtv.v5+json" ]); $data = curl_exec($ch); // 捕获curl请求错误 if(curl_errno($ch)){ echo "<pre>Curl错误: " . curl_error($ch) . "</pre>"; $data = false; } curl_close($ch); return $data; } // 初始化分页参数 $limit = 100; // API允许的最大单页条数 $offset = 0; $allStreams = []; // 用来存储所有获取到的流数据 do { // 构造带offset的请求URL $requestUrl = "https://api.twitch.tv/kraken/streams/?offset={$offset}&limit={$limit}"; // 发起请求 $response = file_get_contents_curl($requestUrl); if (!$response) { echo "<pre>请求失败,当前offset: {$offset}</pre>"; break; } $streamData = json_decode($response, true); // 没有更多流数据时直接退出循环 if (empty($streamData['streams'])) { break; } // 合并当前页数据到总数组 $allStreams = array_merge($allStreams, $streamData['streams']); // 输出当前页的频道名称和观众数(和你原来的逻辑一致) foreach ($streamData['streams'] as $stream) { echo "<pre>"; print_r($stream['channel']['name'] . ' | ' . $stream['viewers']); echo "</pre>"; } // 递增offset,准备下一页请求 $offset += $limit; // 添加1秒延迟,避免触发Twitch API的速率限制 sleep(1); } while (true); // 输出最终统计结果 echo "<pre>====================\n总共获取到 " . count($allStreams) . " 条直播流数据</pre>"; ?>
关键注意事项
- Client-ID认证:旧版Twitch Kraken API必须携带
Client-ID请求头,你需要去Twitch开发者平台申请自己的Client-ID,替换代码中的your_client_id。 - 速率限制:Twitch API对请求频率有严格要求,添加
sleep(1)可以避免因请求过于频繁被限流甚至封禁。 - 终止条件:当API返回的
streams数组为空时,说明已经获取完所有数据,此时直接退出循环即可。 - 错误处理:代码中加入了curl错误捕获和请求失败的判断,避免出现无限死循环的情况。
内容的提问来源于stack exchange,提问作者Brayden




