くつろいでください.tv api -ページ化された結果からのライブストリームデータを取得する


最近、私はウェブサイトを再利用しようとするためにtwitch APIで働きたかったですtwitchroulette.net , ここでは、すべてのストリームは現在、サイト上で起こってから完全にランダムなライブストリームを表示することができます.分析によるとtwitchtracker.com , 現在、任意の時点で100000以上のライブストリームの平均の平均です.

私が通ったときTwitch API documentation , 終点について発見したhttps://api.twitch.tv/helix/streams ライブストリームを取得するには、twitch最大100ストリームあたりのストリームに応答を制限します.しかし、応答はpagination を含むフィールドcursor 結果の次のセットの開始点を指定する次の要求で使用される値(String).
GETリクエストのレスポンス本文https://api.twitch.tv/helix/streams?first=100 トップ100の最も活発なライブストリームを含み、データは以下のようになります.
{
  "data": [
    {
      "id": "41375541868",
      "user_id": "459331509",
      "user_login": "auronplay",
      "user_name": "auronplay",
      "game_id": "494131",
      "game_name": "Little Nightmares",
      "type": "live",
      "title": "hablamos y le damos a Little Nightmares 1",
      "viewer_count": 78365,
      "started_at": "2021-03-10T15:04:21Z",
      "language": "es",
      "thumbnail_url": "https://static-cdn.jtvnw.net/previews-ttv/live_user_auronplay-{width}x{height}.jpg",
      "tag_ids": [
        "d4bb9c58-2141-4881-bcdc-3fe0505457d1"
      ]
    },
    ...
  ],
  "pagination": {
    "cursor": "eyJiIjp7IkN1cnNvciI6ImV5SnpJam8zT0RNMk5TNDBORFF4TlRjMU1UY3hOU3dpWkNJNlptRnNjMlVzSW5RaU9uUnlkV1Y5In0sImEiOnsiQ3Vyc29yIjoiZXlKeklqb3hOVGs0TkM0MU56RXhNekExTVRZNU1ESXNJbVFpT21aaGJITmxMQ0owSWpwMGNuVmxmUT09In19"
  }
}
あなたが次の100の最も活発な生の流れを検索したいならば、次のAPI要求URLはそうする必要があります:
https://api.twitch.tv/helix/streams?first=100&after=eyJiIjp7IkN1cnNvciI6ImV5SnpJam8zT0RNMk5TNDBORFF4TlRjMU1UY3hOU3dpWkNJNlptRnNjMlVzSW5RaU9uUnlkV1Y5In0sImEiOnsiQ3Vyc29yIjoiZXlKeklqb3hOVGs0TkM0MU56RXhNekExTVRZNU1ESXNJbVFpT21aaGJITmxMQ0owSWpwMGNuVmxmUT09In19
これはafter 値以前のレスポンスで返されるカーソル値.
これはほとんどアクティブな応答をソートすることはできませんので、非常に少数または全く視聴者とストリームを使用して結果を得るためには、アクティブなストリームの最初の結果が必要です.
また、twitch APIは毎分800リクエストに制限されているので、私たちがその時点で取得可能なLiveStreamの最大数は、現在の週平均より実質的に低い80000です.したがって、ライブストリームの結果の真に完全なリストを取得しようとすると、HTTP 429エラー(あまりにも多くの要求)を引き起こす危険性があります.
可能な限り多くの生のストリームを取得しようとするために、レート制限と潜在的につらくユーザーの制約を考慮しながら、再帰を使用してこの問題にアプローチしました.
function getAllStreams (cursor, data = [], counter = 15) {
  while (counter !== 0) {
    const request = new Request('https://api.twitch.tv/helix/streams?first=100' + (cursor ? '&after=' + cursor : ''), { 
      method: 'GET' ,
      headers: {
        'Client-ID': clientId,
        'Authorization': `Bearer ${access_token}`,
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
        }
      });

    return fetch(request).then((response) => response.json()).then((responseJson) => { 
      if (counter === 1) return data;
      data.push(...responseJson.data);
      return getAllStreams(responseJson.pagination.cursor, data, --counter);
    });
  }
}
私は、各々の要求が完了するためにおよそ半分秒をとったとわかりました、それで、それは私がユーザーを従事させ続けるためになされた要求の数を制限することも必要としました、そして、私はデフォルトの引数としてその制限を指定しますcounter . 1500ストリームは大きな数字のように見えるかもしれないが、それは単一のランダムなストリームを表示する経験を再現することが可能になります.
私は私のアプローチの任意の提案や批評に感謝します、これは私が働いてきた最初の時間として'クロールされたAPIを'を試みた.私は、ちょうど私がこの終点を使用することについて行った方法を共有したいと思いました.
読書ありがとう!