You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

火山引擎 最新活动