Lambdaからツイートしたい(Twitter API V2対応)

Lambdaを使って、今日の天気を定期ツイートするためにTwitterAPIを使うことにしました。
しかし、TwitterAPIが1ヶ月ほど前にバージョンアップしており、ネット上のソースコードをコピペしても上手くいきませんでした・・
数少ない情報を元になんとかツイートまでいけたのでメモ！

# 環境
**デプロイ環境**
AWS Lambda
Python 3.9
**ローカル環境**
MAC
Python 3.9.6

# 開発準備
以下の順序で進めます。
①Twitter APIアカウント登録
②Twitter API認証設定
③python3インストール
④tweepyインストール

## Twitter APIアカウント登録
まず、PCで自分のTwitterアカウントにログインしときます。
**(注)電話番号の登録をしていない場合は必ずしてください!**
その後、[Twitter Developerサイト](https://developer.twitter.com/)で利用登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/f6e69243-198d-2cd8-ef14-86fd78059e0e.png)
登録画面の以下を入力してNext。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/f7087d2d-75b5-d7f7-0ab8-f9293a3f405e.png)
以下のポリシーに同意しSubmit。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/f6aef958-d75d-6af2-974c-cadf464816fb.png)
電話番号が登録されていないと「There was a problem completing your request」のエラーが発生。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/43b6c2d0-df3c-8b63-a78d-a7f967fb828a.png)
成功すると以下の画面に飛び、メールが送信されるのでメール認証をすると登録完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/c4a7dc66-502b-4b6a-ad64-a0975f5e9015.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/8ce9561e-1354-fb48-4aa5-da897195beab.png)

## Twitter API認証設定
アカウント登録が完了すると、アプリ設定が始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/7a0e78de-ba32-231e-4c59-b2b34aaf424e.png)
アプリ名を入力し、GetKeysでAPI認証情報が表示されます(後でどうせ変えるのでコピーはどっちでもOK)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/97182e7c-f583-a0b7-7434-d48d4a3bc4a9.png)
「Skip to dashboard」でダッシュボードを表示すると一番下に認証設定メニューがあるので「Set up」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/7bf9be76-34e7-9605-58ed-c33395e6ced1.png)
以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/deb52b4c-c9b1-be8e-2a17-b3afc6cd9461.png)
デフォルトでは読み込みしかできないので、書き込みもできる設定に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/be42ad69-d990-e904-4715-409d69f5202f.png)
以下は入力しないと保存できないので、何かしら入力しておきます。(私はTwitterアカウントのURLを入れときました)
入力完了したらセーブして完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/f2174515-1332-66d9-fe31-f17f142f3484.png)

## python3インストール
簡単なので`brew`でインストールします。
※brewが入っていない場合はbrewをインストールしてください

~~~bash
$ brew install python3
$ python3 --version
Python 3.9.6
$ pip3 --version
pip 21.3.1
~~~

## tweepyインストール
最後にpythonでツイートするためのライブラリtweepyのインストールです。
今回はLambda上で実行したいため、モジュール化するためにフォルダを指定してインストールします。

~~~bash
$ pip3 install tweepy -t (保存したいディレクトリパス名)
~~~

# ソースコード
以下ソースコード。

~~~python:lambda_function.py
import sys
# tweepyをインストールしたディレクトリ相対パスを指定する
sys.path.append('python_package')
# coding: UTF-8
import json
import tweepy

def lambda_handler(event, context):
    # 設定ファイル読み込み
    config = json.load(open('config.json', 'r'))
    # Twitterオブジェクト設定
    client = tweepy.Client(config['twitter']['bearerToken'], config['twitter']['consumerKey'],
                           config['twitter']['consumerSecret'], config['twitter']['accessToken'], config['twitter']['accessTokenSecret'])
    # ツイート
    client.create_tweet(text="Lambdaからテストツイート")
~~~

設定情報は外部ファイルから読み込むようにしている。
先程のTwitter APIダッシュボードからキーを生成し、config.jsonに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/e3c666db-a5cd-f8ec-c718-1813e3a539ac.png)


~~~json:config.json
{
  "twitter": {
    "consumerKey": "上記で生成したConsumerKey",
    "consumerSecret": "上記で生成したConsumerSecret",
    "bearerToken": "上記で生成したBearerToken",
    "accessToken": "上記で生成したAccessToken",
    "accessTokenSecret": "上記で生成したAccessTokenSecret"
  }
}
~~~

# Lambdaデプロイ
Lambdaへのデプロイは、ソースコード＆ライブラリをまとめてzipファイルにし、それを作成したLambda関数へアップロードする。

## 関数作成
まずLambdaで関数を作成する。
関数名とランタイムのみ設定し、他はデフォルトのまま。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/bd8b10e9-9c12-0480-83df-4705a1859c44.png)

## アップロード
lambda_function.py,config.json,tweepyライブライディレクトリが含まれたフォルダをzipファイルにする。

~~~bash
zip -r (Lambda関数名).zip (ディレクトリパス)
~~~


関数メニュー→コードタブ→アップロード元→.zipファイルを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/fd3bd07e-f8ce-aac2-17e4-8064850f584a.png)
ここで先程作成したzipファイルを選択し、保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/99b2a81b-26bd-552a-458f-7431dc19a8af.png)

# 実行
テストタブから実行していきます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/69f59d56-5046-6244-6d7a-d45266484041.png)
成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/6bcd1668-2858-5466-b70f-d9a26e550662.png)
Twitterの方でもツイートが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/dbdf3e6f-4a70-cb71-81d3-65466ba33c11.png)

# 終わりに
ほんとツイートできるまでが長かったです^^;
今日のお天気をツイートするところまで引き続き頑張ります！
→ ※追記 [今日のお天気ツイート完成](https://github.com/RSrepository/weatherTwitterBotFunction)

# 参考
https://torutsume.net/openweathermap/
https://qiita.com/penguinprogrammer/items/b220be0c203eaaad015a
https://blog.denet.co.jp/lambda-python-zip/
https://www.delftstack.com/ja/howto/python/python-install-pip3-mac/
https://research-labo.com/howto-twitterapi-getkeys/#toc5