3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TwitchAPIとGASで配信通知bot作ってみた

Last updated at Posted at 2021-10-23

こんにちは。
Twitchの配信のゲームカテゴリー単位の配信通知を受け取る方法が欲しくなり、自分にピッタリしたのがなさそうなので自作することにしました。
その時のメモを書いていきます。

やったこと。

大まかにやってみたのは以下のことです。

  • Twitch Developers にアプリケーション登録
    • client id 取得
    • token取得
  • API動作確認
  • discordのwebhook取得
  • GASでガスガス書いていく
  • GASのトリガー設定

これらに興味があれば参考になるかと思います。

Twitch Developers にアプリケーション登録

まずはAPI叩いて遊ぶための client id と token 取得します。
そのためにまずはログインして登録して、という作業をします。

ログインの場所→ https://dev.twitch.tv/login

client id 取得

認証やらなんやらを済ませたら、ここ(下画像参照)からアプリケーション登録をおこない、client id を取得します。
image.png

登録時、とりあえずリダイレクトURLは http://localhost にしておきました。
image.png

登録時、何度かエラーが出たのですが、アプリ名が被ってたのか妙に長かったからなのか・・・何度か名前を変えてトライしたら登録できました。
成功すると、client id が発行されます。
image.png

token取得

次に、tokenを取得します。

https://id.twitch.tv/oauth2/authorize?client_id=(取得したclitent id)&redirect_uri=http://localhost&response_type=token&scope=bits:read

途中色々アラートとか出ますが、最終的に、ブラウザのURLにトークンが出てきます。
ここの、token=XXXXX&なんちゃら の、token=以降&の手前をメモ保存しておきます。

image.png

API動作確認

早速試してみます。

コマンド
curl -X GET https://api.twitch.tv/helix/games?name=NieR%3A%20Automata -H 'Client-ID: (取得したclitent id)' -H 'Authorization: Bearer (取得したtoken)' 
結果
{"data":[{"id":"494162","name":"NieR: Automata","box_art_url":"https://static-cdn.jtvnw.net/ttv-boxart/./NieR:%20Automata-{width}x{height}.jpg"}]}

とりあえずこれで、欲しいゲームのgame id を取得していきます。

また、以下の要領で、配信リスト取得テストもしてみます。

コマンド
curl -X GET https://api.twitch.tv/helix/streams?game_id=494162 -H 'Client-ID: (取得したclitent id)' -H 'Authorization: Bearer (取得したtoken)
ざっくり結果
{
    "data": [
        {
            "id": "1111111111",
            "user_id": "000000",
            "user_login": "userid",
            "user_name": "username",
            "game_id": "494162",
            "game_name": "NieR: Automata",
            "type": "live",
            "title": "Live Title",
            "viewer_count": 13,
            "started_at": "2021-10-22T00:00:00Z",
            "language": "en",
            "thumbnail_url": "",
            "tag_ids": [
                "6ea6bca4-4712-4ab9-a906-e3336a9d8039",
                "d0976a7e-26a7-4a48-9225-c522808540f2"
            ],
            "is_mature": false
        },
    ],
    "pagination": {
        "cursor": "NAGAIYO...."
    }
}

discordのwebhook取得

取得もとの目処がついたので、通知先の段取りとして、discordのwebhookを取得します。
discordのチャンネルからチャンネルの編集をクリックします。
image.png

連携サービス→ウェブフックを作成
image.png

作成されたwebhookをコピー
image.png
この画面の「ウェブフックをコピー」ボタンを押すことで、webhookを取得できます。

GASでガスガス

とりあえずこれで一通りの情報は揃ったので、GASにガスガス書いていきます。
雑ですが、こんな感じ。

notification
var INTERVAL = 30; // トリガーの時間と大体同じくらいに。30分に1回程度
var CLIENTID = 'XXXXXXXXXXX';
var TOKEN= 'XXXXXXX';

function notification() {
  var gamelist = getGameList();
  for(i=0;i < gamelist.length;i++) {
    var res = sendHttpPost(gamelist[i][0]);
    var lives = JSON.parse(res.getContentText());
    for(var j = 0; j < lives["data"].length; j++){
      var live = lives["data"][j];
      if(live["type"] != "live") continue; // live配信じゃないのは見ない
      var d = new Date();
      d.setMinutes(d.getMinutes()- INTERVAL) ; // 多少のラグはもうみない(めんどくさい)
      var startedat = new Date(live["started_at"]);
      if(d.getTime() > startedat.getTime() ) continue;
      var fields = new Array();
      var fields= {
        'name': live["title"],
        'value': "category: " + gamelist[i][1]  + " streamer: " + live["user_name"],
        'inline': true
        };
       var posts ={
         "embeds": [ {
            "color": 7506394,
            "fields": new Array(fields)
            } ] ,
          "content": "https://www.twitch.tv/" + live["user_login"],
         };
      postDiscord(posts);
    }
  }
}
/**
 * discord にポスト
 */
function postDiscord(text) {
  var url = 'https://discord.com/api/webhooks/XXXXXXXXXXXX';// discordwebhook
  var params = {
    'method': 'POST',
    'headers': { 'Content-type': 'application/json' },
    'payload': JSON.stringify(text)
  };
  UrlFetchApp.fetch(url, params);
};

/**
 *  game list
 */
function getGameList(){// そのうちリスト増やす
  var ret= new Array();
  ret.push(Array(
      "494162",
      "NieR: Automata",
  ));
     return ret;
};
/** 
* Twitch category単位で配信中リストを取得
*/
function sendHttpPost(gameid){
  var endpoint = "https://api.twitch.tv/helix/streams?game_id="+gameid;
  console.log("endpoint::" + endpoint);
   var payload =
   {
     "game_id" : gameid
   };
  var headers =
  {
    'Client-ID': CLIENTID,
    'Authorization' : "Bearer "+ TOKEN
  }
   var options =
   {
     "method" : "get",
     "headers" : headers
   };
   var res = UrlFetchApp.fetch(endpoint, options);
   return res;
}

GASのトリガーの設定

とりあえず、30分に1回ペースで実行してくれれば良いかな、ということで、時間主導型30分おきに設定しました。
image.png

おわりに

感想

Twitch API には今回利用したもの以外も面白いものが多数用意されているので、欲しいものが良い感じで作れそうな感じです。

参考記事

以下の記事をもとにコードを実際に書いていきました。
大変感謝しております。ありがとうございます。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?