概要
無料でTwittter Botを作れるサービスもあるようですが、色々細やかな運用に耐えるようにするには自作したほうがいいだろうということで、なるべく低コストでTwitter Botを作ってみた。
環境
AWS Lambda(Python3.8)
tweepy
DynamoDB
Twitter
全体の流れ
- Bot用のアカウント作成
- Twitter API 使用のためのキー類を取得
- DynamoDBにデータを登録
- Lambda関数を作成する
Bot用のアカウント作成
これが地味に一番めんどくさいです。
ここからアクセスして「アカウント作成」を押してアカウントを作りましょう。
色々英語で聞かれますが、そこは良しなに。
Twitter API 使用のためのキー類を取得
アカウントを作成したら、ログインしたままでTwitter Developersにアクセスして、左のサイドメニューから「Projects & Apps」を選択して「Overview」を選択して「New Project」を押して必要事項を入力して、必要な値を取得する。
後でLambda関数内で使用するのでメモっておく。
DynamoDBにデータを登録
単純なランダムでツイートしてもいいんだけど、ちょっと重みをつけたかったんで、DynamoDBのテーブルは以下のよう構造にしてデータを適当にいくつか登録。weight は整数であれば何でもいい、数字が大きいほど重みが強いのでツイートされる確率が高くなる。
テーブル名はtweetsにした。
カラム | 型 | 説明 |
---|---|---|
hash | String | プライマリキー |
text | String | ツイート内容 |
weight | Number | 重み |
Lambda関数を作成する
Twitter APIのドキュメント読んでもわかりにくいので tweepyというライブラリを使わせてもらうことにした。
が、Lambdaは外部ライブラリを使うのがめちゃくちゃめんどくさいのでLambdaのレイヤーの機能を使うことにした。
流れ
- ラムダ関数をつくる
- DyamoDBにアクセスできるポリシーを付ける
- レイヤーでtweepyを導入する
- Event Bridgeで定期実行を設定する
ラムダ関数をつくる
適当に名前を付けてランタイムにPython3.8を選択、「関数の作成」ボタンを押して関数を作成。
コードは以下のような感じだけど、tweet関数のなかのキーは先ほど取得したものを使用する。
import json
import random
import boto3
import tweepy
def lambda_handler(event, context):
text = random_choice_text()
tweet(text)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
def tweet(text: str):
auth = tweepy.OAuthHandler(<api key>, <api secret key>)
auth.set_access_token(<access token>, <access token secret>)
api = tweepy.API(auth)
api.update_status(text)
def random_choice_text() -> str:
db = boto3.resource('dynamodb')
table = db.Table('tweets')
res = table.scan()
items = res['Items']
texts = []
weights = []
for item in items:
texts.append(item['text'])
weights.append(int(item['weight']))
return random.choices(texts, k = 1, weights=weights)[0]
DyamoDBにアクセスできるポリシーを付ける
LambdaからDynamoDBにアクセスする権限が必要なので、出来上がったロールに「AmazonDynamoDBFullAccess」のポリシーをつける。ちゃんと運用する場合はポリシー作って最低限のアクションだけに絞る。
レイヤーでtweepyを導入する
Layersを選択して、「Layerの追加」ボタンをクリック。
「ARN を指定」を選択して「arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-python38-tweepy:1」を入れて「追加」ボタンをクリック。
これでLambda関数からtweepyをimportして使えるようになる。
Event Bridgeで定期実行を設定する
「トリガーを追加」ボタンをクリックして「EventBridge」を選択、「新規ルールの作成」を選択してルールタイプで定期実行を設定する。
AWSのcron式はここをみればだいたい必要なことができる。
まとめ
DynamoDBとかLambdaは無料枠があるのでほぼほぼ無料で自作のTwitter Botが作れる。
色々書いたけど Terraform に起こしたから、こっち使うのが楽かも。
https://github.com/nittyan/twitter-bot