#本田とじゃんけん を（簡易的に）作成する方法

## 目的
**本田とじゃんけん**を（簡易的に）作成することです．


## 本田とじゃんけんとは
> #本田とじゃんけんとは、ペプシのキャンペーンで行われた、本田圭佑とじゃんけんをする企画である。
> 
> 引用先：#本田とじゃんけんとは (ホンダトジャンケンとは) [単語記事] - ニコニコ大百科
> https://dic.nicovideo.jp/a/%23%E6%9C%AC%E7%94%B0%E3%81%A8%E3%81%98%E3%82%83%E3%82%93%E3%81%91%E3%82%93

https://twitter.com/pepsi_jpn/status/1115796542558851072

https://twitter.com/pepsi_jpn/status/1115454159703220225?s=20&t=2Tlo42EGSZq5WAt74iQIwQ

## 今回は
Botアカウント名とタグ上にてじゃんけんの手を記載すればBotが**~~必ず勝つ手を~~**返信してくれるプロダクトを作成します！

## 作成方法
1. TwitterAPIキーを発行する
2. 自身に飛んでくるツイートを監視する
3. 自身に飛んでくるツイートに返信する

## 前提環境
- Python 3.10
- tweepy 4.8.0

### TwitterAPIについて
今回登録だけで利用できるTwitterAPIv2のEssentialレベルで可能なようにしています．

## 作成
### TwitterAPIキーを発行する
#### TwitterAPIを申請する
下記のリンクからTwitterAPIの申請を行ってください．
ツイート元となるアカウントが必要となるのであらかじめ作成しておきます．

https://developer.twitter.com/en

#### TwitterAPIのアプリを作成する
その後DashBoard内のCreate Appにてアプリを作成します．


#### TwitterAPIキーを発行する
アプリ作成後，Pythonにて利用するキーを確認します．
- API Key
- API Secret Key
- Bearer Token

こちらはアプリ作成時に出力されます．　

- Access Token 
- Access Secret Token

こちらはまず初めに作成したProjects -> OverView内の設定マークをクリックします．

![twitter_api_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/8171d259-dd55-ce68-e8f4-9a10334d4a3d.png)

その後，**OAuth 1.0a turned on**の**Edit**を開き設定を行います．
設定については下記の画像と同じ感じにしていただければ大丈夫かと思います．
( **[twitter account id]** のみ自身のTwitter Account Idに変更します）

![twitter_api_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/6a5e055c-70da-67ed-e12a-5c0daf6b6f8a.png)
![twitter_api_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/65e62288-4cc3-36ff-4302-42d9243b9d13.png)


その後作成したProject -> OverView内のキーマークをクリックします．
移動したページにてAccess TokenとAccess Secret Tokenの発行を行います．


![twitter_api_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/0b82e209-3563-72b3-0c0e-f1fff6ec41b4.png)

![twitter_api_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/ac82e7d5-fc46-971e-0264-c07784767e4f.png)

これで利用するTwitterAPIキーを発行できました．

### 自身に飛んでくるツイートを監視する
自身に飛んでくるツイートを監視するコードを作成します．
今回はPython3.10とPythonのライブラリであるTweepy 4.8.0を利用します．
```
pip install tweepy==4.8.0
```

事前に環境変数に下記のように設定を行います．
```.env
CONSUMER_KEY=[API Key]
CONSUMER_SECRET=[API Secret Key]
ACCESS_TOKEN=[Access Token]
ACCESS_TOKEN_SECRET=[Access Secret Token]
BEARER_TOKEN=[Bearer Token]
TWITTER_ID=[自身のTwitter ID @aaa みたいなやつです]

```

設定しましたら下記のようなコードを書きます．

```Python:main.py

import json
import os

# 環境変数読み込み
CK = os.getenv("CONSUMER_KEY")
CS = os.getenv("CONSUMER_SECRET")
AT = os.getenv("ACCESS_TOKEN")
ATS = os.getenv("ACCESS_TOKEN_SECRET")
BT = os.getenv("BEARER_TOKEN")

TWITTER_ID = os.getenv("TWITTER_ID")

import tweepy

Client = tweepy.Client(BT, CK, CS, AT, ATS)

# tweepy.StreamingClientクラスを継承する
class ClientProcess(tweepy.StreamingClient):
    # 自身へのツイートが発生した際に自動的にこの関数が読み込まれる
    def on_data(self, raw_data):
        response = json.loads(raw_data)
        print(response)


        return


def main():
    printer = ClientProcess(BT)
    printer.add_rules(tweepy.StreamRule(TWITTER_ID))
    printer.filter()

if __name__ == '__main__':
    main()

```

これで自身に飛んでくるツイートが発生するとPython上にて確認できるようになります．
![twitter_api_request.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/dad966cb-ceba-a926-e053-32932a6274e1.png)
**->**
![twitter_api_response.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/5fa5f52e-44ce-3c23-596f-29e31cc6eb8e.png)


### 自身に飛んでくるツイートに返信する
自身に飛んでくるツイートは監視できるようになりましたが，本プロダクトでは更にツイートに返信することが必要です．
またそのツイートが本当に**じゃんけんしたいツイート**なのか判断する必要もあります．

ということで下記のコードのように追記・修正します．

```Python:main.py
import json
import os
import tweepy

CK = os.getenv("CONSUMER_KEY")
CS = os.getenv("CONSUMER_SECRET")
AT = os.getenv("ACCESS_TOKEN")
ATS = os.getenv("ACCESS_TOKEN_SECRET")
BT = os.getenv("BEARER_TOKEN")

TWITTER_ID = os.getenv("TWITTER_ID")

Client = tweepy.Client(BT, CK, CS, AT, ATS)

class ClientProcess(tweepy.StreamingClient):
    def on_data(self, raw_data):
        response = json.loads(raw_data)
        # ツイートidを取得する
        tweet_id = response["data"]["id"]
        # ツイートの文章を取得する
        reply_text: str = response["data"]["text"]

        # 文章を空白で分割する ツイッターのタグは空白が入らないと受け付けない...はず
        text_list = reply_text.split()
        # グーを出すというタグが入っていればグーだと認識する
        if "#グーを出す" in text_list and "#パーを出す" not in text_list and "#チョキを出す" not in text_list:
            text = "Botの手はパーです\n 残念、Botの勝利！"
        # パーを出すというタグが入っていればパーだと認識する
        elif "#グーを出す" not in text_list and "#パーを出す" in text_list and "#チョキを出す" not in text_list:
            text = "Botの手はチョキです\n 残念、Botの勝利！"
        # チョキを出すというタグが入っていればチョキだと認識する
        elif "#グーを出す" not in text_list and "#パーを出す" not in text_list and "#チョキを出す" in text_list:
            text = "Botの手はグーです\n残念、Botの勝利！"
        # どのタグも入っていなかった，もしくは2つ以上のタグが入っていた場合は何も返さない
        else:
            return
        Client.create_tweet(
            text=text,
            in_reply_to_tweet_id=tweet_id
        )


        return


def main():
    printer = ClientProcess(BT)
    printer.add_rules(tweepy.StreamRule(TWITTER_ID))
    printer.filter()

if __name__ == '__main__':
    main()
```

## 確認
実際にツイートするとこのように**~~イカサマ~~**じゃんけんが出来ていることが確認できます！
![twitter_api_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/8ace1c99-02df-a0ec-3e7a-efc6b1cbfb66.png)

## 今後の修正・拡張点
- Botの手を画像・動画を用いて出力する
    - 現状ではTwitterAPIv1の申請が必要になるのでまた別の機会で作成できればと思います
- add_rulesを用いた複数分岐の簡略化
    - こちらも別の機会で作成できればと思います