目次
- 概要
- プログラミング初心者のアプリケーション開発の悩みとTwitter Botを題材にした理由
- 今回、使用する各種サービスの説明とシステム全体の構成図(登場する用語の解説や構成の全体像の解説)
- 実装
- まとめ
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 developer アカウント(ツイートをアプリケーションから行うために必要)
AWS
- AWS Lambda(サーバーを自身でセットアップすることなくアプリケーションが動かせるサービス)
- AWS DynamoDB(ツイート内容を保存しておくデータベース)
- AWS EventBridge(いつツイートするかを登録しておくサービス)
3.2 システム全体の構成図
今回使用するサービスが上記のような役割になっていますが、全体としては以下のようなフローとなります。
- AWS Lambdaにツイートできるコードをアップロードする
- AWS EventBridgeにいつツイートするかを登録しておく
- EventBridgeに登録された時間にAWS Lambdaのツイートアプリケーションを呼び出す
- AWS DynamoDBからツイートする内容を取得する
- AWS Lambdaのツイートアプリケーションからツイート
4.実装
4.1 実装の概要
それでは、実装に移っていきます。
今回は、以下のような要件のTwitter Botを作ることにします。
- 毎日、朝8時にツイートを行う
- ツイートの内容は、5つの内容をランダムにツイートする
実装の全体像としては、以下の5つのフェーズを行います。
- アカウントと環境の準備
- AWSサービスのセットアップ①
- アプリケーションコードの実装
- AWSサービスのセットアップ②
- 本番確認
4.2 アカウントと環境の用意
それでは、アプリケーションに必要なアカウントの用意を始めていきます。
アカウントとして用意するものは、以下の2つです。
- Twitter Developer アカウント
- 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の歯車マークを押します。
遷移後、User authentication settings
のeditを選択します。
以下の通り、App permissionsをRead and write
に変更し、
App infoにcallback URIとwebsite URLを設定します。
callback URIとwebsite URLがない方は、developer.twitter.com
などに設定しておいて問題ないです。
保存すると、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点が挙げられます。
- 自動ツイートする内容の準備
- 自動ツイートする時間の準備
ただし、2. 自動ツイートする時間の準備
に関しては、コード実装後に行った方が良いため、
この節では飛ばすこととします。
4.3.1 自動ツイートする内容の準備
今回はツイート内容を保存するため、AWSのDynamoDBというサービスを使用します。
DynamoDBが、今回のTwitter Botで呟く内容を保存しておくデータベースとなります。
AWSにてDynamoDB
で検索 -> テーブルの作成
テーブル名を任意の名前に設定し、パーティションキーにID
を設定し、数値
とします。
他の設定はデフォルトで設定されているものを使用します。
これで、今回使用するデータベースが作成されました。
次は、実際にツイートするデータを入れておく作業をしましょう。
DynamoDB -> 左タブのテーブル
内の項目を探索
-> 項目を作成
IDを1として、新しい属性の追加
から、文字列
を選択して、属性名をtweet_contentにしておきます。
tweet_contentの値の中には、実際にツイートする内容を保存しておきます。
このようにして、IDを1~5までの5つのツイートを用意してください。
これで、Botとしてツイートする内容の準備ができました。
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
ファイルにテストとして、固定の内容をツイートするコードを書いていきます。
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
という文言のツイートがされていると思います。
ここまでで、作成したアプリケーションから固定文言をツイートできるようになりました。
それでは、このコードを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
と検索して、シンプルなマイクロサービスのアクセス権限
を選択します。
その他の設定は、そのままで関数を作成します。
関数の作成が完了すると、コードソースの画面に遷移します。
コードをこちらに記載していくこともできますが、自身のPCで先ほど作成したコードをアップロードしましょう。
コードソース右部のアップロード元
-> .zipファイル
から、先ほど作成したzipファイルを選択しましょう。
アップロードが完了すると、先ほど自身のPCで作成したファイルがコードソースの画面上に反映されます。
4.4.3 AWS Lambda上で実際にランダムなつぶやきを行うコード実装
先ほどのコードソースの画面を見てもらうと、実はLambda上でもコードの編集を行うことができるため、
今後は、Lambda上でコードを実装していきます。
以下のコードを記述し、画面上のDeploy
ボタンを押してください。
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
ボタンを押すと、以下のような画面が出てきます。
イベント名を任意の値に設定して、他は特に変更せずに保存します。
コードを自身のPCからzipファイルとしてアップロードしたため、デフォルトで設定されているテストする関数を変更する必要があります。
コードソース編集画面の下部にあるランタイム設定
の編集
より、ハンドラをtweet_bot.lambda_function
に変更します。
最後に、自身のPCで作業していた時には、コード上に直接書いていた各種キーを、Lambda関数に設定しておくようにします。
これにより、コードだけ漏洩した際にも、キーがコード上にないため、自身のTwitterBotが悪用されるというリスクを低減することができます。
ソースコード上部のタブの設定
から、環境変数
を選択します。
使用する4つのキーを以下のように記載し、値に自身のキーを各自入れていきましょう。
これらの準備を行い、コードソース画面上に出ているTest
を実施してみましょう。
そうすると、Execution results
というタブが表示され、以下のようにResponse
が201になっていれば成功です。
実際にTwitterを見てみると、ID1~5までに登録したランダムなツイートがされているかと思います。
4.5 AWSサービスのセットアップ②
最後に、自動ツイートする時間を登録しておきましょう。
今回、自動ツイートを行うための時間を登録しておく先として、EventBridgeというサービスを使用します。
自動ツイートを特定の時間によって動かすためにEventBridge内のルールというものを作成していきます。
要件通り毎朝8:00にツイートすることにしましょう。
AWSにてEventBridge
で検索 -> 左タブのイベント
のルール
-> ルールを作成
ルールの詳細を定義では、どのようなルールを定義するかを決めていきます。
今回は、毎日ツイートを行うため、ルールタイプ
はスケジュール
を選択してください。
スケジュールを選択すると、EventBridge Scheduler
を使用して続行するかを聞かれますので、
Continue to create rule
で次のステップに進みましょう。
次のステップでは、実際に起動させるスケジュールを登録しておきます。
スケジュールパターンは特定の時刻
を選択します。
スケジュールの記載方法として、cron式という形式を使用します。
また、こちらのスケジュールはUTCに合わせた時間で記載する必要があるため、(ツイートしたい時刻 - 9時間)の時刻を記載しておきます。
画像の通りに記述をすると、今後10回の実行される日程が出てきます。
次のページでは、ターゲットの選択
を行います。
ターゲットAPIから、AWS Lambda
を選択し、先ほど作成したlambda関数を選択します。
次のページのタグの設定
は行わないでおきます。
最後の設定項目として、スケジュールの状態や再試行の設定を行うことができます。
問題ないようであれば、作成を完了します。
4.6 本番確認
実はこれで、Lambdaで作成した関数とEventBridgeが連携されています。
先ほど作成したLmabda関数の関数の概要
を確認すると、トリガーにEventBridgeが追加されています。
さらに、設定
からトリガーを確認すると、rule-for-8am
という名前のトリガーが登録されています。
こちらで、朝8時になると、こちらのトリガーが動き出し、作成したLambda関数が起動することで、ツイートが行われます。
まとめ
今回、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