22
33

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.

[初心者向け]たった50行のコードでTwitter Botを作成してみる

Last updated at Posted at 2022-11-24

目次

  1. 概要
  2. プログラミング初心者のアプリケーション開発の悩みとTwitter Botを題材にした理由
  3. 今回、使用する各種サービスの説明とシステム全体の構成図(登場する用語の解説や構成の全体像の解説)
  4. 実装
  5. まとめ

1. 概要

記事の目的

本記事は、プログラミング初心者向けに、Twitter Botアプリケーションの作り方を紹介します。

記事の目的としては、とにかくアプリケーションを動かしたい人に対して、簡単にアプリケーションが実装できることを理解してもらうことにあります。

この記事を通して、アプリケーション開発の第1歩目を踏み出してもらえたらと思います。

想定読者

多少言及がありましたが、想定読者は、プログラミング初心者でアプリケーションとして動くものを作りたい人としています。

説明しないこと

  • 利用したサービスの選定理由や使用する技術に対する詳細な解説
  • 今回のアプリケーションに必要なアカウントの作成手順(参考にできそう記事を添付します)

説明すること

  • 今回使用する各種サービスの説明
  • システム全体の構成図
  • アプリケーションの実装

2. プログラミング初心者のアプリケーション開発の悩みとTwitter Botを題材にした理由

この章では、アプリケーション開発を行おうとしているプログラミング初心者の方にとっての悩みとTwitter Botを題材にした理由について言及します。

2.1 プログラミング初心者のアプリケーション開発への悩み

一般的にアプリケーションを作成・リリースするためには、言語や環境など様々な判断及び実装を行う必要があります。

また、プログラミング初心者の方々にとっては、これらを判断と実装をすることは大変難しい作業になるかと思います。

特に代表的な悩みとしては、以下が挙げられます。

・様々なプログラミング言語があるけど、どうやって選べばいいのか?
・サーバーのセッティングはどうするのか?
・アプリケーションをリリースするために必要なことは?

プログラミング初心者の方がこれらの判断を1から行うことは、本来目的であるアプリケーションの開発に対しての障壁となり、アプリケーション開発を完遂することがなく途中で開発を終えてしまうこともあるかと思います。

2.2 Twitter Botを題材にした理由

自身もプログラミング初心者の時に、アプリケーションの開発を行おうとしましたが、
上記のような問題の壁に当たり、挫折をしたという経験が何度もありました。

そのため、技術の選定やアプリケーションを動かすための環境設定という付属的な箇所にコストをかけずに、
アプリケーションの開発に焦点を当てた開発体験記をアウトプットとして残したかったというのがそもそも、記事を書いている背景にあります。

この記事を通して、アプリケーションって簡単に作れるんだということを理解してもらい、
その後のアプリケーション開発や技術研鑽に望んでもらえればと考えています。

上記の問題や背景も踏まえ、今回のアプリケーション作成としては、以下の点に留意して題材を選定しました。

1. 1つの言語のみを使用し、かつコードの記述量が少なくアプリケーションを動かすことができること

2. 目的であるアプリケーションの実装に注力できるように、サーバーのセッティングがなるべくないこと

3. アプリケーションのリリース作業に関するコストが少ないこと

今回上記の要件を満たすようなアプリケーションとしてTwitter Botを題材にした理由としては、上記の留意点を以下のような形で解決できるためです。

1. 1つの言語のみを使用し、かつコードの記述量が少なくアプリケーションを動かすことができること
→今回はPythonという言語のみで、アプリケーションを開発する。
さらには、50行程度のコードでアプリケーションを動かすことができる。

2. 目的であるアプリケーションの実装に注力できるように、サーバーのセッティングがなるべくないこと
→クラウドサービスを使用すれば、コードを記述するのみでアプリケーションとして動かせるサービスが存在し、
サーバーを構築する必要がない。
また、Botであれば定期実行のため、サーバーのメンテナンスが不要。

3. アプリケーションのリリース作業に関するコストが少ないこと
→前述のように、クラウドサービスを使用すれば、コードを記述するのみでアプリケーションとして動かせるサービスが存在するため、
リリース作業が容易に完了する。

特に、コーディングという点を切り取ると、50行程度という非常に短い記述量でアプリケーションを動かすことができるという点が、簡単にアプリケーション構築できるという点と強い結びつきがあるので、タイトルでも言及しました。

それでは、アプリケーション開発の第1歩目としてのTwitter Botを開発していきます。

3. 今回、使用する各種サービスの説明とシステム全体の構成図

3.1 今回使用する各種サービスの説明

今回、アプリケーションを作成するために使用するプロダクトは、以下となっています。

Twitter: Botを動かすSNS

AWS: Amazonが提供するクラウドコンピューティングサービス。今回、メインでアプリケーションを動かすサービス。

AWSという単語を聞いても、ピンとこない人は以下の記事などを参照してみてください。

また、各プロダクトの中で使用するサービスと役割は以下の通りです。

Twitter
  • Twitter developer アカウント(ツイートをアプリケーションから行うために必要)
AWS
  • AWS Lambda(サーバーを自身でセットアップすることなくアプリケーションが動かせるサービス)
  • AWS DynamoDB(ツイート内容を保存しておくデータベース)
  • AWS EventBridge(いつツイートするかを登録しておくサービス)

3.2 システム全体の構成図

今回使用するサービスが上記のような役割になっていますが、全体としては以下のようなフローとなります。

  1. AWS Lambdaにツイートできるコードをアップロードする
  2. AWS EventBridgeにいつツイートするかを登録しておく
  3. EventBridgeに登録された時間にAWS Lambdaのツイートアプリケーションを呼び出す
  4. AWS DynamoDBからツイートする内容を取得する
  5. AWS Lambdaのツイートアプリケーションからツイート

image.png

4.実装

4.1 実装の概要

それでは、実装に移っていきます。

今回は、以下のような要件のTwitter Botを作ることにします。

- 毎日、朝8時にツイートを行う
- ツイートの内容は、5つの内容をランダムにツイートする

実装の全体像としては、以下の5つのフェーズを行います。

  1. アカウントと環境の準備
  2. AWSサービスのセットアップ①
  3. アプリケーションコードの実装
  4. AWSサービスのセットアップ②
  5. 本番確認

4.2 アカウントと環境の用意

それでは、アプリケーションに必要なアカウントの用意を始めていきます。

アカウントとして用意するものは、以下の2つです。

  1. Twitter Developer アカウント
  2. AWSアカウント

また、開発するアプリケーションは、Pythonという言語を使用して、実装します。
そのため、自身のPCにPythonをインストールする必要があります。

4.2.1 Twitter Developer アカウントの作成

Twitter Developerアカウントについては、以下の記事が分かりやすかったので、
以下を参考にして、作成してください。
https://zenn.dev/specially198/articles/9d1ce6c797bb5b

ここから、4つのキーを保存する必要があるため、出てきたタイミングで自身が管理できるところに保存するようにします。

  • API Key
  • API Key Secret
  • Access Token
  • Access Token Secret
Access TokenとAccess Token Secret取得の方法

(Developer アカウント発行後に対応が必要なため、記載しておきます。)

Developerアカウント作成後に、Developer Dashboardにアクセスをし、Project と Appを作成します。
そうすると、API Key, API Key Secretが入手できます。

また、アカウント作成後にアプリケーションからツイートを行えるように設定を修正する必要があります。
Dashboardから、Project Appの歯車マークを押します。
image.png

遷移後、User authentication settingsのeditを選択します。

以下の通り、App permissionsをRead and writeに変更し、
App infoにcallback URIとwebsite URLを設定します。

callback URIとwebsite URLがない方は、developer.twitter.comなどに設定しておいて問題ないです。
image.png

保存すると、projectのトップページに遷移するので、上部のタブのKeys and tokensを選択し、
Access Token and Secretを選択すると、Access TokenとAccess Token Secretが入手できます。

こちらの4つのキーを使用して、アプリケーションを開発していきます。

4.2.2 AWSアカウントの作成

AWSアカウントの作成は、アカウント作成の流れを参考にして、作成してください。
https://aws.amazon.com/jp/register-flow/

3.3.3 Pythonインストール

以下を参考に、Python3系をインストールしてください。

Mac版
https://prog-8.com/docs/python-env

Win版
https://prog-8.com/docs/python-env-win

4.3 AWSサービスのセットアップ①

コードの実装を行う前に、先にAWSサービスのセットアップを行います。
Botを動かすために、AWSサービスで必要な準備としては、以下の2点が挙げられます。

  1. 自動ツイートする内容の準備
  2. 自動ツイートする時間の準備

ただし、2. 自動ツイートする時間の準備に関しては、コード実装後に行った方が良いため、
この節では飛ばすこととします。

4.3.1 自動ツイートする内容の準備

今回はツイート内容を保存するため、AWSのDynamoDBというサービスを使用します。
DynamoDBが、今回のTwitter Botで呟く内容を保存しておくデータベースとなります。

AWSにてDynamoDBで検索 -> テーブルの作成

テーブル名を任意の名前に設定し、パーティションキーにIDを設定し、数値とします。
他の設定はデフォルトで設定されているものを使用します。
image.png

これで、今回使用するデータベースが作成されました。
次は、実際にツイートするデータを入れておく作業をしましょう。

DynamoDB -> 左タブのテーブル内の項目を探索 -> 項目を作成

IDを1として、新しい属性の追加から、文字列を選択して、属性名をtweet_contentにしておきます。
tweet_contentの値の中には、実際にツイートする内容を保存しておきます。

image.png

このようにして、IDを1~5までの5つのツイートを用意してください。
これで、Botとしてツイートする内容の準備ができました。
image.png

4.4 アプリケーションコードの実装

それでは、アプリケーションコードの実装に移っていきます。
今回は、以下のステップを踏んで開発を進めていきましょう。

1. 自身のPCで作成したアプリケーションから固定文言をツイートしてみる
2. AWS Lambdaにコードをアップロードする
3. AWS Lambda上で実際にランダムなつぶやきを行うコード実装
4. テスト

4.4.1 自身のPCで作成したアプリケーションから固定文言をツイートしてみる

macの方はターミナルを、Windowsの方は、コマンドプロンプトを開いてください。

自身のPCの環境によってアプリケーションが動かないなどのことが無いよう、Pythonの仮想環境というものを使用することにします。仮想環境の細かい内容については、以下の記事を参照してください。

以下のコマンドでアプリケーション開発に必要な仮想環境の構築及びライブラリをインストールしていきます。

# 作業するためのフォルダに移動
$ cd bot-application
# 仮想環境の構築
$ python3 -m venv .venv
# 仮想環境への切り替え
$ . .venv/bin/activate
# 今回使用するライブラリのインストール
$ pip3 install requests_oauthlib -t ./
# コードを記述するファイルの作成
$ touch tweet_bot.py
# ファイル構成の確認
# 以下のようなファイル構成になっていればOK
$ tree -L 1
.
├── bin
├── certifi
├── certifi-2022.9.24.dist-info
├── charset_normalizer
├── charset_normalizer-2.1.1.dist-info
├── idna
├── idna-3.4.dist-info
├── oauthlib
├── oauthlib-3.2.2.dist-info
├── requests
├── requests-2.28.1.dist-info
├── requests_oauthlib
├── requests_oauthlib-1.3.1.dist-info
├── tweet_bot.py
├── urllib3
└── urllib3-1.26.12.dist-info

先ほど作成したtweet_bot.pyファイルにテストとして、固定の内容をツイートするコードを書いていきます。

tweet_bot.py
import json
from requests_oauthlib import OAuth1Session

consumer_key = "先ほど発行したconsumer_key"
client_secret_key = "先ほど発行したclient_secret_key"
access_token = "先ほど発行したaccess_token"
access_token_secret = "先ほど発行したaccess_token_secret"

oauth = OAuth1Session(consumer_key, client_secret_key, access_token, access_token_secret)
tweet_content = "Hello world"

payload = {'text': tweet_content}
response = oauth.post("https://api.twitter.com/2/tweets", json=payload)

if response.status_code == 201:
    print('Success')
else:
    raise Exception(
        "[Error] {} {}".format(response.status_code, response.text)
    )

コード上にある変数の説明を行います。

oauth: Twitter APIではOAuth認証という認証の仕組みを使用するため実装
payload: ツイート内容をPythonのDictionary型にマッピングしたもの
response: oauth認証を行なったことによって使える、postリクエストを実施した後のレスポンスコード

コーディングしたものを実行してみましょう。

# 先ほど作成したコードを実行
python test_tweet.py

上記のコマンドを行いSuccessという文言が表示されていれば、コードの実行は成功しています。
Twitterにアクセスを行いHello worldという文言のツイートがされていると思います。
image.png

ここまでで、作成したアプリケーションから固定文言をツイートできるようになりました。
それでは、このコードをlambdaで動かせるようにしましょう。

4.4.2 AWS Lambdaにコードをアップロードする

このコードをLambdaで動かせるようにするために、Lambdaにコードをアップロードしましょう。
Lambdaにコードをアップロードしていくのですが、zip化してアップロードしていきます。

# 現在の作業フォルダを'bot-application.zip'という名前でzip化する
# .venvフォルダはzip化する必要がないので、除外する
$ zip -x "./.venv/*" -r bot-application.zip .
# zip化されているか確認
# bot-application.zipが生成されている

$ tree -L 1
.
├── bin
├── bot-application.zip
├── certifi
├── certifi-2022.9.24.dist-info
├── charset_normalizer
├── charset_normalizer-2.1.1.dist-info
├── idna
├── idna-3.4.dist-info
├── oauthlib
├── oauthlib-3.2.2.dist-info
├── requests
├── requests-2.28.1.dist-info
├── requests_oauthlib
├── requests_oauthlib-1.3.1.dist-info
├── tweet_bot.py
├── urllib3
└── urllib3-1.26.12.dist-info

上記のコマンドで、現在作業しているフォルダのファイル群がzipファイルとして圧縮されます。

それでは、こちらのzipファイルをLambdaにアップロードしていきましょう。
Lambdaで実行するコードのアップロード先として使用する関数というものを作成していきます。

AWSにて、Lambdaで検索 -> 左タブの関数 -> 関数の作成

今回は、一から作成を選択し、必要な情報を記載していきます。

特筆すべき点としては、ランタイムをPython3.9に設定し、実行ロールにて、
AWSポリシーテンプレートから新しいロールを作成を選択し、ポリシーテンプレートにてDynamoDBと検索して、シンプルなマイクロサービスのアクセス権限を選択します。
その他の設定は、そのままで関数を作成します。
image.png

関数の作成が完了すると、コードソースの画面に遷移します。
コードをこちらに記載していくこともできますが、自身のPCで先ほど作成したコードをアップロードしましょう。
コードソース右部のアップロード元 -> .zipファイルから、先ほど作成したzipファイルを選択しましょう。
image.png
アップロードが完了すると、先ほど自身のPCで作成したファイルがコードソースの画面上に反映されます。
image.png

4.4.3 AWS Lambda上で実際にランダムなつぶやきを行うコード実装

先ほどのコードソースの画面を見てもらうと、実はLambda上でもコードの編集を行うことができるため、
今後は、Lambda上でコードを実装していきます。

以下のコードを記述し、画面上のDeployボタンを押してください。

tweet_bot.py
from random import randint
import datetime
import boto3
import json
import os
from boto3.dynamodb.conditions import Key, Attr
from requests_oauthlib import OAuth1Session

DIFF_JST_FROM_UTC = 9

# 後述する環境変数に設定する各種キーを取得
consumer_key = os.environ['CONSUMER_KEY']
client_secret_key = os.environ['CLIENT_SECRET_KEY']
access_token = os.environ['ACCESS_TOKEN']
access_token_secret = os.environ['ACCESS_TOKEN_SECRET']

oauth = OAuth1Session(consumer_key, client_secret_key, access_token, access_token_secret)
dynamodb = boto3.resource('dynamodb')

def lambda_function(event, context):
    # 先ほど登録したテーブル名
    table_name = 'twitter_bot_test'
    table = dynamodb.Table(table_name)

    # ツイートするIDをランダムに取得
    tweet_id = randint(1, 5)

    # dynamoDBからデータを取得
    res = table.get_item(Key={'ID': tweet_id})
    text = res["Item"]["tweet_content"]

    # ツイート内容を一意にするための署名としての日付を付与する処理
    local_date_time = datetime.datetime.now()
    japanese_local_date_time = local_date_time + datetime.timedelta(hours=DIFF_JST_FROM_UTC) 
    display_local_datetime = japanese_local_date_time.strftime('%Y年%m月%d日 %H:%M:%S')
    tweet_content = text + '\n' + display_local_datetime

    # ツイート処理
    payload = {'text': tweet_content}
    response = oauth.post("https://api.twitter.com/2/tweets", json=payload)

    if response.status_code == 201:
        print('Success')
    else:
        raise Exception(
            "[Error] {} {}".format(response.status_code, response.text)
        )

    return response.status_code

Deployボタンを押すことで、先ほどアップロードしたコードからの変更が実際に反映されます。
そのため、コードの修正が完了するたびに、Deployボタンを押すようにしましょう。

コード上にある変数の説明を行います。

dynamodb: DynamoDBなどのAWSの各種サービスを操作するためのライブラリであるboto3を使用して、DynamoDBを操作する
tweet_id: DynamoDBに登録したIDをランダムに取得するために、1~5の間の数をランダムな値を取得する
display_local_datetime: ツイートする日時を日本時間として取得。
                        twitterでは同じ内容のツイートを2回続けてできないので、常に内容が異なるツイートにするため、取得したツイート内容にツイート日時を追加する

ちなみに、このコードはコメント含めちょうど50行となっており、コメントを除けば40行程度になります。
このように行数自体は多くないものの、アプリケーションとして動くようなコードを作ることができました。

4.4.4 テスト

それでは、こちらのコードでツイートができているかテストしてみようと思います。
先ほどのdeployボタンの横にあるTestボタンを押すと、コードをテストするイベントの作成を行うことができます。

Testボタンを押すと、以下のような画面が出てきます。
イベント名を任意の値に設定して、他は特に変更せずに保存します。
image.png

コードを自身のPCからzipファイルとしてアップロードしたため、デフォルトで設定されているテストする関数を変更する必要があります。

コードソース編集画面の下部にあるランタイム設定編集より、ハンドラをtweet_bot.lambda_functionに変更します。
image.png

最後に、自身のPCで作業していた時には、コード上に直接書いていた各種キーを、Lambda関数に設定しておくようにします。
これにより、コードだけ漏洩した際にも、キーがコード上にないため、自身のTwitterBotが悪用されるというリスクを低減することができます。
ソースコード上部のタブの設定から、環境変数を選択します。

使用する4つのキーを以下のように記載し、値に自身のキーを各自入れていきましょう。
image.png

これらの準備を行い、コードソース画面上に出ているTestを実施してみましょう。
そうすると、Execution resultsというタブが表示され、以下のようにResponseが201になっていれば成功です。
実際にTwitterを見てみると、ID1~5までに登録したランダムなツイートがされているかと思います。
image.png

image.png

4.5 AWSサービスのセットアップ②

最後に、自動ツイートする時間を登録しておきましょう。
今回、自動ツイートを行うための時間を登録しておく先として、EventBridgeというサービスを使用します。

自動ツイートを特定の時間によって動かすためにEventBridge内のルールというものを作成していきます。
要件通り毎朝8:00にツイートすることにしましょう。

AWSにてEventBridgeで検索 -> 左タブのイベントルール-> ルールを作成

ルールの詳細を定義では、どのようなルールを定義するかを決めていきます。
今回は、毎日ツイートを行うため、ルールタイプスケジュールを選択してください。
スケジュールを選択すると、EventBridge Schedulerを使用して続行するかを聞かれますので、
Continue to create ruleで次のステップに進みましょう。
image.png

次のステップでは、実際に起動させるスケジュールを登録しておきます。

スケジュールパターンは特定の時刻を選択します。
スケジュールの記載方法として、cron式という形式を使用します。
また、こちらのスケジュールはUTCに合わせた時間で記載する必要があるため、(ツイートしたい時刻 - 9時間)の時刻を記載しておきます。

画像の通りに記述をすると、今後10回の実行される日程が出てきます。
image.png

次のページでは、ターゲットの選択を行います。
ターゲットAPIから、AWS Lambdaを選択し、先ほど作成したlambda関数を選択します。
image.png

次のページのタグの設定は行わないでおきます。

最後の設定項目として、スケジュールの状態や再試行の設定を行うことができます。
問題ないようであれば、作成を完了します。

4.6 本番確認

実はこれで、Lambdaで作成した関数とEventBridgeが連携されています。
先ほど作成したLmabda関数の関数の概要を確認すると、トリガーにEventBridgeが追加されています。
image.png

さらに、設定からトリガーを確認すると、rule-for-8amという名前のトリガーが登録されています。
こちらで、朝8時になると、こちらのトリガーが動き出し、作成したLambda関数が起動することで、ツイートが行われます。
image.png

これで、実際に朝8時を迎えるとツイートが完了しています。
image.png

まとめ

今回、Twitter Botを通して、アプリケーション開発を行いました。

タイトルの通り、コーディング自体は50行程度で簡単に作ることができました。
さらには、アプリケーションを動かすサーバーのセッティングやリリース作業も容易に完結する構成で、アプリケーションが作れることが理解していただけたかと思います。

プログラミング初心者の方々が今回のアプリケーション開発を通して、次のアプリケーション開発も行ってみたいと思ってもらえたら、幸いです。

参考文献

https://aws.amazon.com/jp/builders-flash/202201/aws-drill-twitter-bot-1/
https://aws.amazon.com/jp/lambda/
https://zenn.dev/specially198/articles/9d1ce6c797bb5b
https://aws.amazon.com/jp/register-flow/
https://footprints.link/articles/ja/n-machida/python-development-environment-on-mac-using-pip-and-venv

22
33
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
22
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?