以前、Qiita にまとめたのですが、例が少し複雑だったので、復習も兼ねてシンプルに投稿するだけの手順をまとめようと思います。
- Twitter アプリの登録とアクセスキーの取得
- Lambda ファンクションの作成
- Lambda ファンクションのデプロイ
の流れで進めていきます。
Twitter アプリの登録とアクセスキーの取得
Bot 用の Twitter アカウントを作成する
ご自身のアカウントでつぶやく場合はこの手順はスキップしてください。
Twitter アプリの登録する
↑のアカウントでログインしたまま、下記のURLに遷移してください。
https://apps.twitter.com/app/new
まず、Twitter アプリの概要を登録します。(URLは有効なものでないと怒られます。URLがない場合はどうするんですかね??)
各種キーの取得
次に、Lambda からTwitterに投稿するために必要な4つのキーを取得します。
- Consumer Key (API Key)
- Consumer Secret (API Secret)
- Access Token
- Accesss Token Secret
Consumer Key, Secret
Keys and Access Tokens
タブに遷移します。すると、Application Settings の欄に Consumer Key と Consumer Secret が表示されています。こちらを控えておくようにしてください。
Access Token, Secret
次に、アクセストークンですが、同じタブ内で、Create my access token というボタンを押下します。
すると、下記のように各トークンが表示されるので、こちらも控えておいてください。
Lambda ファンクションの作成
では、Lambda ファンクションを作成していきます。ここから先の流れは、AWS Lambda から外部 API を呼び出す - log4ketancho と同じです。
作業ディレクトリの作成
まずは、作業用のディレクトリを作成します。
$ mkdir lambda_tweet $ cd lambda_tweet/
認証ライブラリのインストール
次に、認証ライブラリである requests_oauthlib
を導入します。先ほど入手した各種トークンを用いて Twitter に接続する際に必要になります。
$ pip install requests_oauthlib -t ./
Lambda ファンクションの作成
続いて、 Hello World
と投稿する Lambda ファンクションを作成していきます。
$ vim tweet.py
from requests_oauthlib import OAuth1Session CK = '***' # * enter your Consumer Key * CS = '***' # * enter your Consumer Secret * AT = '***' # * enter your Access Token * AS = '***' # * enter your Accesss Token Secert * UPDATE_URL = 'https://api.twitter.com/1.1/statuses/update.json' def lambda_handler(event, context): _tweet("Hello World") # tweet text def _tweet(text): params = {"status": text } twitter = OAuth1Session(CK, CS, AT, AS) req = twitter.post(UPDATE_URL, params = params) if req.status_code == 200: return text else: return req.status_code
エラーハンドリングが適当ですみません。
デプロイする
上記モジュールを zip 化する
$ zip -r lambda_tweet.zip ./
マネージメントコンソール経由でデプロイする
新たにLambdaファンクションを作成します。AWSリソースにアクセスしないので、ロールは適当なものを選択してください。
続いて、先ほど作成した zip ファイルをアップロードしてください。ハンドラをファイル名に合わせることを忘れないようにしてください。
試し実行する
では、試し実行してみます。Lambda Function の「テスト」ボタンを押してみます。Twitter を見ると Hello World
とつぶやかれていれば成功です;)