今回は、Twitter Bot(自動ツイート)を作成していきたいと思います。
使用する主なAWSサービスは、Lambda、DynamoDB、CloudWatch Eventとなります。
Lambda関数の実装は、専用の開発環境が整っているCloud9を利用したいと思います。
Cloud9とは、簡単にいうとAWSの統合開発環境のサービスで、簡単に開発環境を構築できます。
Cloud9を利用することで、Lambda関数の実装が超簡単にできるのでオススメです。
ただし注意しなくてはならないのが、言語が限られているということです。
Cloud9で実装できるLambdaは「node.js」と「Python」になります。(※H31.3.3現在)
どのようなことができるものなの?
あらかじめツイートテキストをDBに登録しておき、指定した日時になったら自動的にTwitter上へつぶやきます。
↓自動ツイートの結果
今後のバージョンアップは?
今回作成したシステムを使い、以下のようなシステムへバージョンアップさせるのも可能かなと思っております。
- 画像イメージをS3へ登録し、ツイートテキストと一緒に画像データもツイートする
- ツイートする日時やツイート内容をあらかじめ設定できるようなインターフェース(Webサイト)を用意し、誰でも簡単に設定できるようにする
仕組みの概要
今回作成したTwitter Botは、CloudWatch EventでLambdaを発火させ、LambdaからDynamoDBに登録されているデータを読み取り、Twitter APIを経由してツイートする仕組みとなります。
Twitter Botの作り方
(1)TwitterのAPIキーを取得
Twitterサイトで開発者アカウントの登録を行い、Twitterへツイートするために必要な以下の4つの情報を揃えておきましょう。
※以前は簡単に取得できたようなのですが、2018年夏に制限が厳しくなり、多少面倒になっているようです。
- Consumer API Key
- Consumer API secret key
- Access token
- Access token secret
※開発者アカウントの登録方法は、以下のサイトが参考になります。
Twitter のAPIキーの取得方法が変わった(Qiita)
(2)DynamoDBにアクセスできるIAMロールを作成
DynamoDBからデータを取得できるようにするために、DynamoDBにアクセスできるIAMロールを作成します。
今回はお試しということで”AmazonDynamoDBFullAccess”を付与しました。
フルアクセス権限なので、きちんとサービスとして作るときは権限設定を厳密にしましょう。
“LambdaBasicExecutionRole”も一緒に付与しておきます。
(3)DynamoDBのテーブル作成
DynamoDBにて以下のようなデータの入ったテーブル(“TwitterBot”)を用意します
※Cloud9とDynamoDBはリージョンを合わせるように注意してくださいね。
(4)Lambdaの実装
Cloud9で、Lambdaの実装を行っていきます。
LambdaのRuntimeはPython3.6、”Select blueprint”は”empty-python”で作成します。
作成の際、Lambdaに付与するロールを聞かれるので、(2)で作成したロールを選択します。
次のコマンドでPython用のライブラリのインストールをします。
インストール先は、アプリケーションディレクトリと同じ階層とします。
1 |
pip install requests requests_oauthlib -t ./ |
1 |
pip install boto3 -t ./ |
Lambdaのコードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import boto3 from boto3.dynamodb.conditions import Key, Attr from requests_oauthlib import OAuth1Session CK = 'Consumer API Key' CS = 'Consumer API secret key' AT = 'Access token' AS = 'Access token secret' URL = 'https://api.twitter.com/1.1/statuses/update.json' def lambda_handler(event, context): tweet = get_tweet() session = OAuth1Session(CK, CS, AT, AS) params = {"status": tweet } session.post(URL, params = params) def get_tweet(): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('テーブル名') items = table.get_item( Key={ "id": 1 } ) return str(items["Item"]["tweet"]) |
作成できましたら、Cloud9上でLambdaをアップロードします。
Cloud9を使っていて一番楽だと感じた部分がココです!
(5)CloudWatch Event設定
Cron式にて”10 13 3 3 ? 2019″と指定します。(日本時間2019/3/3 22:10に起動させるため。)
※CloudWatch Eventでの時間指定はGMTのため)
で、Twitterを確認すると・・・・
はい、22:10に投稿されましたー!
今回はTwitter Botのコアとなる部分を作成してみました!
TwitterのAPIは、単にツイートする以外にも様々なものがあるようですので、時間を見つけて試していきたいと思います。
以上、hidesanでした!