TwitchIOでTwitchのBotを作る

## はじめに
**TwitchのBotってPythonで作れるのかな～**と調べていたところ日本語の記事が見つからず、英語アレルギーの自分には苦しい翻訳作業の連続だったので、僕と同じような英語アレルギーの人のお役に立てたらなと記事にして残しておきたいと思います。

**TwitchIO**というラッパーで簡単に作れるようなので、今回はこれを使用してBotを実際に作るところまで1から説明していきたいと思います。(エディタは省略)
原理まで書くととても長くなってしまうので機能を深く掘り下げるのはまた今度として、**挨拶を返してくれるBotが完成**するところまでです。**面倒くさいわけでは決してありません(クソデカボイス)**

この記事をきっかけに日本人ユーザーが増えてQiitaの記事も沢山出始めてくれたらな～と願っています。

また、間違った説明をしてしまっている箇所がありましたらコメントの方にお願いします:bow_tone1:
## TwitchIOとは
https://github.com/TwitchIO/TwitchIO
> An Asynchronous IRC/API Wrapper currently in Development for TwitchBots made in Python! 
(https://pypi.org/project/twitchio/ より引用)

**PythonでTwitchのBotを作ることが出来るラッパーだよ！**と思ってもらえれば大体あってます。
[Let's make a Twitch bot with Python!](https://dev.to/ninjabunny9000/let-s-make-a-twitch-bot-with-python-2nd8)という記事を参考にしながら作成していきます。

OSは**Windows 10**を使用しています。
といってもMacでもやり方はほぼ変わりません。

## 手順
1. [Twitchアカウントの作成](https://qiita.com/maguro869/items/57b866779b665058cfe8#1-twitch%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)
2. [Pythonをインストール](https://qiita.com/maguro869/items/57b866779b665058cfe8#2-python%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
3. [TwitchIOをインストール](https://qiita.com/maguro869/items/57b866779b665058cfe8#3-twitchio%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
4. [OAuthパスワードを作成](https://qiita.com/maguro869/items/57b866779b665058cfe8#4-oauth%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90)
5. [Twitch Developersでアプリケーション登録](https://qiita.com/maguro869/items/57b866779b665058cfe8#5-twitch-developers%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E7%99%BB%E9%8C%B2)
6. [コーディング](https://qiita.com/maguro869/items/57b866779b665058cfe8#6-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)
7. [実践テスト](https://qiita.com/maguro869/items/57b866779b665058cfe8#7-%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%B9%E3%83%88)

## 1. Twitchアカウントの作成
まずはBotとして扱うTwitchのアカウントを作成していきます。
そのアカウントそのものがBotとして動作するので、普段配信や視聴しているアカウントとは別で作成したほうがいいと思います。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">これは自分のアカウントでbot登録してしまった為、自らがbot化してしまったmaguro869 <a href="https://t.co/EhBItUtmeH">pic.twitter.com/EhBItUtmeH</a></p>&mdash; 🍣 (@maguro869) <a href="https://twitter.com/maguro869/status/1247866690030858242?ref_src=twsrc%5Etfw">April 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

今後Botを運用していく上で、Botが発言したことは無視するように設計しますので放送主のアカウントではBotを作らないようにして下さい。
そういう設計をしなかったとしてもちょっと寂しいBotになってしまいます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/84fea247-3d8e-1c05-3cd4-536c45e709e8.png)

https://www.twitch.tv/ を開いて右上の「**登録**」をクリックして下さい。
(既に普段使いのアカウントでログインしている場合はログアウトしてから)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/099d81c7-86a6-09ee-1d2e-bff28a5a2de4.png)
アカウント情報を入力して「**登録**」をクリックしてください。
今回私は**salmon869**という名前のBotを作成します。~~サーモンよりマグロの方が絶対おいしい~~

登録したメールアドレスの方にTwitchから**6桁のアカウント認証コード**が届いていると思うので、遷移した画面にそれを入力してください。
(Gmailだとプロモーションの所に届いていたので見つけづらいかもしれません...)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/33117e73-9ed7-acf9-35a1-a02d9fac399a.png)

これにてアカウント登録は完了です。

この後、Twitch Developersにアプリケーション登録する際に**2段階認証**を済ませておく必要があるので、それを先にしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/282ed6b5-fea7-7885-5a80-f71c4b878e27.png)

https://www.twitch.tv/settings/security こちらのページを開いて「**セキュリティ**」のところにある「**2段階認証**」の「**2段階認証を設定する**」というボタンをクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/b2ae61e0-baa7-0a68-e80a-134e93dcffc7.png)
左側は**+81**を選択し右側に**お使いの携帯番号**を入力して下さい。続行を押すと携帯の方に**認証コードが記載されているSMS**が届きます。
それを入力して認証完了です。

これでBotに使用するアカウントの準備は完了です。

## 2. Pythonをインストール
Githubには
> TwitchIO requires Python 3.6 or higher.

と書いてありますので、最新版でも対応してるみたいです。
2020/04/09現在で最新の**Python3.8.2**をインストールします。
既に3.6より上のバージョンをインストールしている場合は次の「3. TwitchIOをインストール」に進んでも大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/cf2d5066-57d7-1b83-bfba-53c3ccb54c33.png)
https://www.python.org/downloads/ を開いて「**Download Python 3.8.2**」をクリックして下さい。
ダウンロードされた「**python-3.8.2.exe**」を起動してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/8c0ebd39-1b9c-f30d-f265-cb2c3dfcb91c.png)
「**Add Python 3.8 to PATH**」にチェックを入れた後、「**Install Now**」をクリックして下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/8ea16f13-4d22-4abf-0aaa-fd32f6ea24fd.png)
この画面になったら完了です。「**Close**」をクリックして閉じて大丈夫です。
これでPythonのインストールは完了です。

## 3. TwitchIOをインストール

TwitchIOをインストールするには**pipコマンド**を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/9172fbb8-fa77-5fd0-6a36-1804aa57eeae.png)
デスクトップ左下の**Windowsマーク**をクリックし、「**cmd**」と入力すると「**コマンドプロンプト**」と検索結果に出ますのでクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/7f0cca03-7b22-b78f-116e-9544f523e472.png)
起動したら「**py -m pip install twitchio**」と入力してEnterキーを押して下さい。
色々バーっと出た後に「**Successfully installed twitchio-1.0.0**」と出たらインストール完了です。

## 4. OAuthパスワードを作成
TwitchのAPIを利用するためには**OAuthパスワード**を取得する必要があります。
https://twitchapps.com/tmi/ このサイトでとても簡単に取得可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/ebdc1b7e-70dd-233d-c16b-e59991f61c27.png)
「**Connect**」をクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/be237332-742f-aab5-fd16-c5f4fcaab212.png)
「**許可**」をクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/00b18907-5071-c572-66eb-a935c0ee4db0.png)
「**oauth:~**」とパスワードが表示されるのでどこかにメモをしておいて下さい。
これでOAuthパスワードの作成は完了です。

##5. Twitch Developersでアプリケーション登録
続いて、Twitch Developersでアプリケーション登録をして**クライアントID**を取得します。
https://dev.twitch.tv/console/apps/create を開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/eb28c6cb-1f12-1315-8581-248000daaf20.png)
「**Authorize**」をクリックして承認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/4c873b87-6357-2be9-ae55-bcbeaf8aeeb3.png)
このような画面に遷移するのでそれぞれの項目を**入力/選択**してください。

- 名前：Botのアカウント名(分かりやすければOK)
- OAuthのリダイレクトURL：先ほどメモしたoauth:~
- カテゴリー：Chat Botを選択

終わったら「**作成**」をクリックして下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/69836c08-04d9-5099-40a9-105e365bd71e.png)
このような画面に遷移したら「*管理*」をクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/d80fb022-ff11-e8c3-fd4c-cf3c6604a17d.png)
**クライアントID**が記載されているのでそれをメモしておいてください。今回はシークレットトークンは使用しないので作成しなくて結構です。

これでTwitch Developersでアプリケーション登録は完了です。

## 6. コーディング
それでは実際にコーディングしていきましょう。

**Twitch_bot**というフォルダを作成し、その中で作業していきます。
まずはデータを格納しておく**config.py**を作成します。
以下は例ですので各々の情報を入力してください。

```Twitch_bot/config.py
TMI_TOKEN = 'oauth:~'       # メモしたoauth:~のアレ
CLIENT_ID = 'xxxxxxxxxxxxxxxxxxxx'    # メモしたクライアントID
BOT_NICK = 'salmon869'      # Botのアカウント名
BOT_PREFIX = '!'    # この文字を作成したコマンドの頭に付けることでコマンドと認識してくれます
CHANNEL = ['maguro869'] # 実際に配信をするアカウント名
```

これでmaguro869というアカウントで動くBotのconfig.pyは作成できました。
続いてBotの本体となる**bot.py**を作成します。

```Twitch_bot/bot.py
from twitchio.ext import commands
from config import *

bot = commands.Bot(
    irc_token=TMI_TOKEN,
    client_id=CLIENT_ID,
    nick=BOT_NICK,
    prefix=BOT_PREFIX,
    initial_channels=CHANNEL
)

@bot.event
async def event_ready():
    print(f"{BOT_NICK}がオンラインになりました!")

if __name__ == "__main__":
     bot.run()
```

これでコーディングは終了です。

## 7. 実践テスト

入力が終わったら一度実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/c8fd3644-4ef0-6a79-2caf-d21ae891bec7.png)
**Twitch_bot**フォルダを開いて**Shiftを押したまま右クリック**して「**PowerShellウィンドウをここで開く**」で**PowerShell**を開いてください。機能としては大体コマンドプロンプトと同じです(大きいお友達のみんな、怒らないで)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/e64e3ac6-97a3-4fef-8b26-2d1219050df6.png)
起動したら「**py bot.py**」と入力しEnterキーを押してBotを起動してみましょう。
「**｛Botのアカウント名｝がオンラインになりました!**」と表示されたら正常に起動出来ています。

しかし、これだけではコマンドの実装は**何も出来ていない**のでbot.pyを以下のように編集して**挨拶を返してくれる**ようにしましょう。

```Twitch_bot/bot.py
from twitchio.ext import commands
from config import *

bot = commands.Bot(
    irc_token=TMI_TOKEN,
    client_id=CLIENT_ID,
    nick=BOT_NICK,
    prefix=BOT_PREFIX,
    initial_channels=CHANNEL
)

@bot.event
async def event_ready():
    print(f"{BOT_NICK}がオンラインになりました!")

# ここから追加

@bot.command(name='hello')
async def hello(ctx):
    await ctx.channel.send(f'{ctx.author.name}さん こんにちは～ VoHiYo')

# ここまで追加

if __name__ == "__main__":
     bot.run()
```
※追記 2020/09/28
`#ここから追加`以下に関する説明を忘れてました。

`@bot.command(name='hello')
async def hello(ctx)`・・・`!hello`コマンドを定義
`ctx.channel.send('hogehoge~')`・・・`!hello`コマンドが送信されたチャンネルでbotが`hogehoge~`とコメントしてくれる
`ctx.author.name`・・・`コマンドを送信した人の名前`
詳しい`ctx`の内容の説明は、[twitchio.dataclasses.Context](https://twitchio.readthedocs.io/en/rewrite/twitchio.html#twitchio.dataclasses.Context)をご覧ください
<br>

これでBotを起動した後に「**!hello**」と配信チャットを打つと「**○○さん こんにちわ～ VoHiYo**」とBotが発言してくれるようになります。
※ VoHiYoとはTwitchが絵文字として認識してくれる単語の一つです。

実行結果で確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375811/3464970d-3a05-1880-15b1-9bca905aaf34.png)

これで**挨拶機能の実装、Botの運用**に成功しました。
お疲れ様でした！

## おわりに
 
現段階では挨拶の機能しかありませんが、勿論オリジナリティー溢れるコマンドを用意することもできます。
あなたのアイデア次第でBotは**無限の可能性**を秘めています。
是非公式ドキュメントとにらめっこしながら**あなただけのBot**を作ってみてください！
TwitchIOコミュニティーの繁栄を願っています:wink:

## 参考資料
[Let's make a Twitch bot with Python!](https://dev.to/ninjabunny9000/let-s-make-a-twitch-bot-with-python-2nd8)
[TwitchIO(Github)](https://github.com/TwitchIO/TwitchIO)
[TwitchIO Document](https://twitchio.readthedocs.io/en/rewrite/twitchio.html)