0
Help us understand the problem. What are the problem?

posted at

updated at

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

目的

本田とじゃんけんを(簡易的に)作成することです.

本田とじゃんけんとは

#本田とじゃんけんとは、ペプシのキャンペーンで行われた、本田圭佑とじゃんけんをする企画である。

引用先:#本田とじゃんけんとは (ホンダトジャンケンとは) [単語記事] - ニコニコ大百科
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

今回は

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

作成方法

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

前提環境

  • Python 3.10
  • tweepy 4.8.0

TwitterAPIについて

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

作成

TwitterAPIキーを発行する

TwitterAPIを申請する

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

TwitterAPIのアプリを作成する

その後DashBoard内のCreate Appにてアプリを作成します.

TwitterAPIキーを発行する

アプリ作成後,Pythonにて利用するキーを確認します.

  • API Key
  • API Secret Key
  • Bearer Token

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

  • Access Token
  • Access Secret Token

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

twitter_api_0.png

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

twitter_api_2.png
twitter_api_3.png

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

twitter_api_1.png

twitter_api_4.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 みたいなやつです]

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

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
->
twitter_api_response.png

自身に飛んでくるツイートに返信する

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

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

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

今後の修正・拡張点

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?