Twitch APIで配信のタイトルとゲームカテゴリを更新する

# はじめに
Twitch APIでココを更新するための手順。
ゲームイベントとかではNodeCG等から叩くケースが想定されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/d8ba88fa-9fd1-1627-becd-e5aaaa39ab90.png)

# 1. New Twitch APIを利用できるようにする
[Twitch APIを利用してみよう](https://qiita.com/pasta04/items/750d71d41e5edd12932b#2-api%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)を参考に、利用登録をします。

# 2 操作対象のAPIに合わせたOAuth2トークン取得
チャンネル情報の更新は **Modify Channel Information** のAPIを利用します。

各APIのAuthenticationには以下の2種類が書いてあって、それぞれ別物と思ってください。
- App Access Token: curlだけで取得できるトークン (`/token`のやつ)
- OAuth Token: 一回ブラウザでアクセスしてリダイレクトして取得できるトークン (`/authorize`のやつ)

対応しないトークンで各種APIを叩いた場合、401が返却されます。
```json
{"error":"Unauthorized","status":401,"message":"Invalid OAuth token"}
```

`Modify Channel Information` はOAuth Tokenを要求されるので、ブラウザでアクセスしてリダイレクトする方になります。

また、このAPIは `channel:manage:broadcast` のscopeが必要なので、このscopeを指定しておきます。詳細は[Twitch APIに必要なOAuth認証のアクセストークンを取得しよう](https://qiita.com/pasta04/items/2ff86692d20891b65905)を参照してください。
一応nginxで動かすことを想定したhtmlを記載しておきます。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
    <a href="https://id.twitch.tv/oauth2/authorize?client_id=ここにクライアントID&redirect_uri=http://localhost&response_type=token&scope=channel%3Amanage%3Abroadcast">Twitch認証</a>
    <div id="token"></div>
  </body>
  <script>
    if (location.hash) {
      document.querySelector("#token").innerHTML=decodeURIComponent(location.hash)
    }
  </script>
</html>
```

ちゃんと取得できれば以下のような感じになります。ここでaccess_tokenが取得できれば以降はコマンドラインだけで進められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/44c3aa54-be92-c937-ecfb-98a5131ba2f7.png)

なお、その他のscopeについては[Twitch Access Token Scopes](https://dev.twitch.tv/docs/authentication/scopes)を参照。

# 3 配信者ID(broadcaster_id)の取得

人に見えてる文字列だとAPIには使えないので、数字の方のIDを取得します。

[Get Started with the Twitch API](https://dev.twitch.tv/docs/api/get-started) にもある通り、とりあえずこれを叩きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/f3d8606f-da19-2f59-065c-e06138772edd.png)

## Postmanの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/3108c93e-20db-2a06-2382-029346960a71.png)

## curlの場合
```shell
curl -X GET 'https://api.twitch.tv/helix/users?login=pastan04' \
-H 'Authorization: Bearer とーくん' \
-H 'Client-Id: 自分のクライアントID'
```

# 4 ゲームカテゴリの検索
ゲームカテゴリは自由に入力できるものではなく、ゲームごとのに設定されたIDを知る必要があります。これは`Search Categories` のAPIを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/2bcadc40-a919-3b62-3dae-4af4c33cdbd9.png)

`query=` の部分に、ゲームカテゴリ名を入れて検索を行います。
複数のゲームがヒットした場合はそれだけレスポンスが返ってきます。機械的に判定するのは大変なので、イベントで使う場合は事前に全ゲームのidを調べ上げておくのがよいでしょう。

## Postmanの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/f2956e0c-5c29-dca8-4c2d-0a608e2651d0.png)

## curlの場合

スペースを含む検索ワードは`+`や`%20`に置き換えないと怒られることに注意.

```shell
curl -X GET 'https://api.twitch.tv/helix/search/categories?query=The+Somnium+Files' \
-H 'Authorization: Bearer とーくん' \
-H 'Client-Id: 自分のクライアントID'
```

# 5 ゲームカテゴリの更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/acadd5a4-d628-9613-bebd-f3cf4c067fc4.png)

これで 更新対象の配信者ID　ゲームID　が揃ったので、いよいよカテゴリを更新します。
ここではタイトルも一緒に更新する例を記載していますが、更新が不要なkeyは指定しなくてOKです。

## Postmanの場合
見えてないけどこれまで通りAuthorizationとClient-IdをHeadersに指定してください。
レスポンスボディは無いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/982bc0ed-4dde-b8fd-58e3-1bd7e65f5909.png)

## curlの場合
```shell
curl -X PATCH 'https://api.twitch.tv/helix/channels?broadcaster_id=43594253' \
-H 'Authorization: Bearer とーくん' \
-H 'Client-Id: 自分のクライアントID' \
-H 'Content-Type: application/json' \
--data-raw '{"game_id":"1816749448", "title":"話題のあのゲームをやるよ！"}'
```
よくわかんないけどgitbashで叩いた時は文字化けしました。ラズパイとかWSL2のUbuntuからなら問題無かったです

# おわり
無事更新されました
![t.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399407/0ba19229-fd7a-aa96-852f-b02004cab11f.gif)