LoginSignup
7
13

More than 1 year has passed since last update.

なるべく低コストでTwitter Botを自作する

Last updated at Posted at 2021-06-28

概要

無料でTwittter Botを作れるサービスもあるようですが、色々細やかな運用に耐えるようにするには自作したほうがいいだろうということで、なるべく低コストでTwitter Botを作ってみた。

環境

AWS Lambda(Python3.8)
tweepy
DynamoDB
Twitter

全体の流れ

  1. Bot用のアカウント作成
  2. Twitter API 使用のためのキー類を取得
  3. DynamoDBにデータを登録
  4. 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のレイヤーの機能を使うことにした。

流れ

  1. ラムダ関数をつくる
  2. DyamoDBにアクセスできるポリシーを付ける
  3. レイヤーでtweepyを導入する
  4. 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の追加」ボタンをクリック。
tweet-bot - Lambda - Google Chrome 2021_06_28 20_23_08.png

「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

7
13
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
7
13