Twitterでリストに流れるツイートを自動リツイートする

本スクリプトの特徴は、Heroku Advanced Schedulerを利用するため__無料__で、任意のリストに流れるツイートを、__自動的に__リツイートすることです。

## リストとは何か
> リストとは、複数のTwitterアカウントをまとめて管理できる機能です。独自のリストを作ったり、他の利用者が作ったリストを保存したりできます。リストタイムラインには、リストに登録されたアカウントのツイートのみが表示されます。
https://help.twitter.com/ja/using-twitter/twitter-lists

# 制作動機
noteの記事「[文化祭公式Twitterアカウントの自動リツイート等について](https://note.com/yudukikun5120/n/n82d27d09bf23)」をお読みください。

# 環境
- macOS Catalina
- Zsh
- Ruby 2.6.7
    - [The Twitter Ruby Gem](https://github.com/sferik/twitter)
- [Heroku](https://heroku.com)
- [Twitter API](https://developer.twitter.com/en.html)

_Twitter Developer Accountは、審査があるので早く通しておいた方がいいです。_

# 開発
開発していきます。

## リストを作る
利用するTwitterアカウントで、リツイートする対象を登録したリストを作成します。その名称は自由です。

## API キーとアクセストークンを取る
https://qiita.com/kngsym2018/items/2524d21455aac111cdee
上の記事を参考に、下の４つのキーまたはトークンを取得します。

 - (Consumer) API key
 - (Consumer) API secret key
 - Access token
 - Access token secret

## The Twitter Ruby Gem をインストール
The Twitter Ruby Gem を開発環境にインストールします。

``` 
% gem i twitter
```

## Rubyファイルを作る
スクリプトを記述するためのRubyファイル「retweet.rb」を作成します。

```
% touch retweet.rb
```
今作成したファイルに以下のように記述します。

``` retweet.rb
require 'twitter'

# Config
@client = Twitter::REST::Client.new do |config|
  config.consumer_key        = ENV["CONSUMER_KEY"]
  config.consumer_secret     = ENV["CONSUMER_SECRET"]
  config.access_token        = ENV["CONSUMER_TOKEN"]
  config.access_token_secret = ENV["CONSUMER_TOKEN_SECRET"]
end

# PRODUCTION ENVIRONMENT -----------------------------------
@client.list_timeline("my_account", "my_list").each do |tweet|
    if tweet.user.screen_name != "my_account" && !tweet.retweeted? && !tweet.full_text.include?("specified word")
        @client.retweet(tweet.id)
    end
end
```

- 「my_account」の「my_list」というリストのタイムラインに表示されたツイートが取得されます。
- 自分のツイートをリツイートしないため、`tweet.user.screen_name != "my_account"`としています。
- 既にリツイートしたツイートを除くため、`!tweet.retweeted?`としています。
- 特定の単語が含まれたツイートを除くため、`!tweet.full_text.include?("specified word")`としています。（ここでは「specified word」）
- `@client.retweet(tweet.id)`でリツイートします。

## ローカルで環境変数を設定

__zshの場合__

```
% vi ~/.zshenv
```
.zshenvファイルを編集します。新規作成となる場合もあります。VIMエディタの使い方は割愛します。
「[API キーとアクセストークンを取る](https://qiita.com/yudukikun5120/items/d33c6aeaf1f60859df27#api-%E3%82%AD%E3%83%BC%E3%81%A8%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%8F%96%E3%82%8B)」節で取得したキーとトークンを準備し、下のように設定します。（「XXX...」はキーまたはトークン文字列。）

``` ~/.zshenv
CONSUMER_KEY=XXXXXXXXXXXXXXXX
CONSUMER_SECRET=XXXXXXXXXXXXXXXX
CONSUMER_TOKEN=XXXXXXXXXXXXXXXX
CONSUMER_TOKEN_SECRET=XXXXXXXXXXXXXXXX
```
保存して終了し（:wq）、

```
% source ~/.zshenv
```
実行します。

```
% ruby retweet.rb
```
Twitterでリツイートが確認されれば大丈夫です。

## Herokuにデプロイする
公式のリファレンス「[Getting Started on Heroku with Ruby](https://devcenter.heroku.com/articles/getting-started-with-ruby)」に沿って、RubyファイルをHerokuにデプロイします。

### 環境変数を設定する
[記事](https://qiita.com/colorrabbit/items/18db3c97734f32ebdfde)に沿って、Herokuで環境変数を設定します。

## Advanced Schedulerの設定
[Advanced Scheduler](https://elements.heroku.com/addons/advanced-scheduler)をAdd-onから追加します。
Advanced Schedulerを開き、Scheduled Tasks > Create Triggerを選択します。
![Advanced Scheduler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332413/21c44c64-ab12-e650-395a-ea32a7f748e2.png)
以下のように設定します。

| 設定項目           |       設定値      |
|:-----------------|:------------------|
| Name             | 任意 |
| Command          | `ruby retweet.rb` |
| Timezone         | - |
| State            | Active |
| Type             | Recurring |
| Schedule         | Schedule Helper > Hour > Every 1 hours at :00 |

（Scheduleでは、Cron文法でも良いです）

Hobbyプランでは、毎月1000件までのタスク実行という上限があるため、最小実行間隔が１時間となります。（ ∵ 60*60*24*31（1ヶ月の秒換算）/ 1000 ≒ 2678 < 最小実行間隔）

これで、毎時Rubyファイルが実行されるようになりました。つまり、毎時リストのタイムラインをクロールし、リツイートしていないツイートがあればツイートします。

## 宣伝
この技術により運用されているアカウントが、一高祭（茨城県土浦第一高等学校文化祭）のTwitterアカウントです。一高祭は、県内でも大規模な文化祭です。ぜひフォローお願いします 🙏

__一高祭公式Twitterアカウント__
https://twitter.com/ichikosai

## リファレンス
- [GitHub レポジトリ](https://github.com/tsuchiura-1st-hs-ec/Ichikosai-Auto-Retweeting)