#AWSウェブマガジン を参考に作成したTwitter Botに自分で考えた機能を実装したい!
0.はじめに
みなさんはAWSの「builders.flash」をご存知でしょうか?
「そんなもんお前に教えられなくてもとっくに知ってるわー」という方がほとんどかもしれませんが、私のようなAWS初心者でも楽しみながら実践的に学べるトピックをお届けしてくれる非常にありがたいコンテンツです。こんなのが無料で読めるんだから、ほんとい良い時代だわ。。。
このありがたい「builders.flash」の中で、AWSソリューションアーキテクトの金澤さん (@ketancho)が「お役立ち Twitter Bot を作りながら学ぶ AWS ドリル」というコンテンツを公開してくださっています。
この記事を書きはじめた2022年10月21日現在、連載は第10回まで進んでいます。次回更新の第11回が最終回となるようです。
私も基本的には夜な夜な(仕事のやる気が出ないテレワーク中にも時々…)、少しずつ進めており、現在のところ第7回の内容まで実装済みです。
私自身、たいしたコーディングのスキルがある訳でもなく、Pythonも初心者という有様なので、基本的にはStep通りに忠実に進めていますが、自分で考えた機能を実装してみたいという欲が少し出てきたので、今回チャレンジしてみようと思います。
1.実装する機能について
とはいえ、たいしたアイディアがあるわけではありません。。。
自分のTwitterの使い方は基本的に情報収集がメインなんですが、いまネットの中でどんなことが起きているのか、トレンドワードを見て確認することが多いので、定期的にトレンドワードを取得して、それをツイートするBotでも作ってみることにしようかと最初は考えました。
が、少し進めてみたところでTwitter APIのv2ではトレンドワードの取得にまだ対応していないことが判明!(このAWSドリルではv2しか使ってないし、自力でv1.1を使えるようにするスキルも無い…)
仕方ないので、第8回の課題にもあがっているド定番の天気予報自動メンションBotを作ってみようとおもいます。
2.実装の手順
基本的には #AWSウェブマガジン の内容に沿って忠実に進めていきます。
(1)Lambda関数の作成
Lambda関数を新たに作成します。関数名は「twitter-bot-weather」とします。それ以外の項目は #AWSウェブマガジン での内容に忠実に沿って設定していきます。
(2)requests_oauthlibをインストール
ここも #AWSウェブマガジン での内容に忠実に沿って設定していきます。CloudShellを起動して以下のコマンドを実行します。実行後はLambdaの画面に戻ってリロードすると実行が反映されます。
mkdir twitter-bot-weather
cd twitter-bot-weather/
pip3 install -U pip
pip install requests_oauthlib -t ./
touch lambda_function.py
zip -r twitter-bot-weather.zip ./
aws lambda update-function-code --function-name twitter-bot-weather --zip-file fileb://twitter-bot-weather.zip
(3)コーディング
コーディングしていきます。もちろん基本は #AWSウェブマガジン の内容に忠実に…ですが、天気予報の情報は気象庁の天気予報WebAPIからJSONで取得できるという情報があったのでそれを利用させていただきます。正式なAPI提供という訳ではないようですが、「政府標準利用規約に準拠して利用可」という情報もありました。下記のサイトなどが参考になると思います。
私は東京地方の情報が欲しかったので、東京の地域コード(130000)を指定して情報を取得するようにしました。地域コードを変更すれば、全国各地の天気予報(3日分の天気概況)が取得できるようです。お恥ずかしながら、天気予報情報を取得するために自分で書いてみたコードです。
def get_weather():
url = "https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json"
headers = {"content-type": "application/json"}
response = requests.get(url,headers=headers)
response_json = response.json()
if response.status_code != 200:
raise Exception(
'[Error] {} {}'.format(response.status_code, response.text)
)
return response_json
朝にその日の天気予報、夜に翌日の天気予報をメンションできるようにメインの部分では実行時間に応じてツイートの内容を場合分けするようにしてみました。実行時間は後ほどEventBridgeで1日2回、朝と夕方に起動するように設定してみます。メインの部分は以下のようになりました。
def lambda_handler(event, context):
init()
now_jst = datetime.now(timezone(timedelta(hours=+9), 'JST'))
now_jst_str = now_jst.strftime('%Y年%-m月%-d日%H時%M分')
#実行時の時間が午前か午後か取得する
ampm = now_jst.strftime('%p')
#天気予報APIで天気予報を取得する
weather = get_weather()
#取得した天気予報の地域と、当日及び翌日の天気予報を取得
area = weather[0]['timeSeries'][0]['areas'][0]['area']['name']
today = weather[0]['timeSeries'][0]['areas'][0]['weathers'][0]
tomorrow = weather[0]['timeSeries'][0]['areas'][0]['weathers'][1]
#実行時間が午前中の場合は今日の天気をツイート
if ampm == 'AM':
tweet_text = '@DzVxc6 おはよう。今は' + now_jst_str + ' です。'
tweet_text = tweet_text + area + 'の今日の天気は' + today + 'です。'
#実行時間が午後の場合は明日の天気をツイート
else:
tweet_text = '@DzVxc6 こんばんは。今は' + now_jst_str + ' です。'
tweet_text = tweet_text + area + 'の明日の天気は' + tomorrow + 'です。'
tweet(tweet_text)
(4)EventBridge設定
1日2回、朝と夜に起動するようにEventBridgeで設定していきます。ここも基本的には #AWSウェブマガジン の内容に沿って忠実にいきます。
Lambda関数の「トリガーを追加」から
新規ルールの作成を選択し、
としました。出勤時に家を出るのが8時前なので、その少し前の7時30分にメンションが来るようスケジュールを設定しています。
また、夜にも翌日分の天気予報のメンションが来るようにもう一つ、以下の設定でスケジュールを登録しています。
こちらは、会社を退社する時刻である19時30分に通知が来るようしています。
3.おわり
とりあえず今回はこれで実装完了です。
単体起動でツイートまでは確認しましたが、想定通りうまく動作してくれるでしょうか…?
Pythonも初心者ですし、JSONもあまりよくわからないので色々とググりながらでしたが、なんとか最後まで辿り着くことができたと思います。
今後も引き続き、楽しみながら学んでいきたいと思います。
最後までお付き合いいただきありがとうございました。