Rails TwitterAPI を利用して自動投稿をする

自分の備忘録として、TwitterAPIをRailsで利用するまでの手順をまとめました。

# 事前準備
## ■ [Twitterアカウント](https://twitter.com)の作成
Twitterアカウントがないと、Twitter Developerに登録できません。
※手順は端折ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/045d1832-2993-5dd4-020c-35081aabbc57.png)
## ■ [Twitter Developer](https://developer.twitter.com/en)に登録
「Apply」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/845ca10c-4700-666b-6b92-650ea7a54a05.png)
「Apply for a development acoount」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/e8f5b54f-be14-15bf-2b53-01e8589a7fd3.png)
Hobbyist -> Making a bot. -> 「Get started」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/4fedd0ee-f19f-978b-1268-f7f5e36e2037.png)
各種情報を入力します。
スクロールするといくつか質問事項がありますので、適宜入力してください。
※Twitterアカウントにメールアドレスの登録ができている必要があるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/1daa9f6d-b954-0b9d-47eb-257639e8ab7b.png)

ここが一番面倒ですが、TwitterAPIの使用目的などを記載します。
google翻訳などを駆使して何とか入力しましょう。
入力不要な項目はチェックを外すことで入力欄がなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/2b36df8a-df47-98f8-f1af-21372cc5ca05.png)

入力した内容を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/35a9d34c-d442-6c55-0271-4014c7573c81.png)

利用規約に同意する場合はチェックを入れて、「Submit application」をクリック。
これでTwitter Developerに登録されますが、審査に時間がかかる場合があるようです。
※余程変な内容でなければ審査は普通に通ると思います(たぶん・・・)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/798d55df-f591-bae1-2ab5-605b5aa28311.png)

追記：
この審査結構厳しいようで、私の場合は2回再提出してくれメールが届きました・・・。
[こちら](https://makerealestate01.com/sns/twitter/twitter-api/)の記事を参考になんとか乗り越えました。
## ■ Twitter Developerでプロジェクトを作成
というわけで[Twitter Developerのトップページ](https://developer.twitter.com/en)から早速プロジェクトを作成してみます。
「Developer Portal」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/8f89aff8-5482-013b-6efe-41cc847af0ce.png)

「Create Project」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/383c79fd-1500-d524-19b8-f31e4709ce00.png)

プロジェクトの名前を入力して「Next」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/7db6150e-1319-b9af-3fef-e66c7b671aba.png)

使用目的の確認ですかね、私の場合はボット・・・というかとりあえず自動投稿をしたかったので、「Making a bot」を選択しました。そして「Next」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/3f883693-5dfa-3424-144b-1d798bdae6d7.png)

プロジェクトの説明を入力して「Next」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/7301cfac-157b-9be0-9ca3-7c56fe533081.png)

アプリの名前を入力して「Complete」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/830d4cf1-6d32-43d0-54dc-832d75545d94.png)

最後に重要そうな認証情報が表示されますが、これは結局この後の手順で作り直さないといけないので、とりあえず無視します。まずこれでプロジェクトの作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/1078ae78-5353-fd5c-3d0d-aa2f32029899.png)

## ■ 作成したプロジェクトの設定を変更
さてプロジェクトが作成できたので、Railsアプリに組み込みたいところですが、このまま進めてしまうと投稿をするときにエラーになります(エラーの内容は後ほど)。なので一部設定を変更します。
※この辺りの説明は公式の[README.md](https://github.com/sferik/twitter/blob/HEAD/README.md)に書いています。

### App permissionsの変更
デフォルトの設定では読み込みの権限しか許可されていないため、その設定を変更します。
アプリの設定から「App permissions」の項目を「Read Only」から「Read and Write」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/f04cf875-bfe9-cdcb-b175-304f165de2c7.png)
### API KEYの再発行
App permissionsを更新したので、API KEYも再発行します。
鍵マークをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/cf7eeab8-e5b4-8ecd-e73e-6ebc0dde85ab.png)
そうすると以下の画面が表示されますので「Regenerate」をクリックすると再発行ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/c3a71465-b0b3-b194-5b2a-ce6a5ca16f23.png)
Railsアプリから自動投稿をするために必要な情報は
Consumer Keysの

- API Key
- API Secret Key
 
Authentication Tokens -> Access Token and Secretの

- Access Token
- Access Token Secret

になります。

# Railsアプリに組み込む
さていよいよ自動投稿を実装します。
公式の[README.md](https://github.com/sferik/twitter/blob/HEAD/README.md)を参考に作成していきます。

私の場合は既にRailsアプリが存在しているのでGemfileに

```Ruby
gem 'twitter'
```

を追記して、bundle installを実行します。

そして公式に記載がある通り、

```Ruby
client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "YOUR_CONSUMER_KEY"    # API Key
  config.consumer_secret     = "YOUR_CONSUMER_SECRET" # API Secret Key
  config.access_token        = "YOUR_ACCESS_TOKEN"    # Access Token
  config.access_token_secret = "YOUR_ACCESS_SECRET"   # Access Token Secret
end
```

をどこでもいいので記載します。
私の場合は、検証としてとりあえずコントローラに書いています。

以下の部分ですが、

- YOUR_CONSUMER_KEY
- YOUR_CONSUMER_SECRET
- YOUR_ACCESS_TOKEN
- YOUR_ACCESS_SECRET

Twitter Developerで作成したアプリの認証情報を入力してください。
実際に運用する場合は直書きはNGですので、環境変数から取得できるように修正をします。

```Ruby
client = Twitter::REST::Client.new do |config|
  config.consumer_key        = ENV["YOUR_CONSUMER_KEY"]    # API Key
  config.consumer_secret     = ENV["YOUR_CONSUMER_SECRET"] # API Secret Key
  config.access_token        = ENV["YOUR_ACCESS_TOKEN"]    # Access Token
  config.access_token_secret = ENV["YOUR_ACCESS_SECRET"]   # Access Token Secret
end
```

このようなイメージですね。

そしてTwitter::REST::Clientのインスタンスが生成できたら

```Ruby
client.update("テスト投稿です！ご迷惑をおかけしてごめんなさい！")
```

updateメソッドを実行すると投稿されます。
引数は投稿内容です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/e29b7ab3-1add-0ed7-370a-9440d64dfb22.png)
無事に投稿されました。

ちなみに前回投稿した内容と全く同じ内容を投稿しようとすると、投稿はされません。
これは[公式のリファレンス](https://developer.twitter.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/post-statuses-update)にも記載がありますが、同じ内容の投稿が連続する場合は投稿しないという制限があるようです。

このとき、「App permissions」の設定が「Read Only」となっていると

```Ruby
Twitter::Error::Unauthorized: Read-only application cannot POST.
```
というエラーになりますので「App permissions」の設定を再確認してみてください。

```Ruby
Twitter::Error::Unauthorized: Invalid or expired token.
```
の場合は単純にAPI KEYの設定ミスです。

# そして自動投稿
あとは実際投稿する処理をどこに配置するかで変わってきますが、
私はコントローラに実装したので外部からコントローラに対して定期的にPOSTしてあげるようにしています。
AWSのサービスを利用するとこのようなイメージです。
※コントローラに接続するための認証情報を必須とした実装にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199854/1934b7bb-ebc0-9d49-5631-2910ca25cfa7.png)

一番楽なのは前述の投稿処理をrakeタスクに実装して定期的に実行する方法です。
Herokuの場合は[Heroku scheduler](https://devcenter.heroku.com/articles/scheduler)を使うと手っ取り早いと思います。
※但し、Heroku schedulerを使用する場合はHerokuにクレジットカードの登録をする必要があります。

# 参考にさせていただいた記事
[コピペでできる RailsでTwitterAPIを使う 準備編](https://qiita.com/ayies128/items/80e1163caa2e1448ff9d)

[twitterのAPI審査期間は3日で通る？合格例文でも3回落ちた1つの原因【完全攻略】](https://makerealestate01.com/sns/twitter/twitter-api/)

https://github.com/sferik/twitter/blob/HEAD/README.md

https://developer.twitter.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/post-statuses-update