本スクリプトの特徴は、Heroku Advanced Schedulerを利用するため__無料__で、任意のリストに流れるツイートを、__自動的に__リツイートすることです。
リストとは何か
リストとは、複数のTwitterアカウントをまとめて管理できる機能です。独自のリストを作ったり、他の利用者が作ったリストを保存したりできます。リストタイムラインには、リストに登録されたアカウントのツイートのみが表示されます。
https://help.twitter.com/ja/using-twitter/twitter-lists
制作動機
noteの記事「文化祭公式Twitterアカウントの自動リツイート等について」をお読みください。
環境
- macOS Catalina
- Zsh
- Ruby 2.6.7
- Heroku
- Twitter API
Twitter Developer Accountは、審査があるので早く通しておいた方がいいです。
開発
開発していきます。
リストを作る
利用するTwitterアカウントで、リツイートする対象を登録したリストを作成します。その名称は自由です。
API キーとアクセストークンを取る
https://qiita.com/kngsym2018/items/2524d21455aac111cdee
上の記事を参考に、下の4つのキーまたはトークンを取得します。
- (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
今作成したファイルに以下のように記述します。
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 キーとアクセストークンを取る」節で取得したキーとトークンを準備し、下のように設定します。(「XXX...」はキーまたはトークン文字列。)
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」に沿って、RubyファイルをHerokuにデプロイします。
環境変数を設定する
記事に沿って、Herokuで環境変数を設定します。
Advanced Schedulerの設定
Advanced SchedulerをAdd-onから追加します。
Advanced Schedulerを開き、Scheduled Tasks > Create Triggerを選択します。
以下のように設定します。
設定項目 | 設定値 |
---|---|
Name | 任意 |
Command | ruby retweet.rb |
Timezone | - |
State | Active |
Type | Recurring |
Schedule | Schedule Helper > Hour > Every 1 hours at :00 |
(Scheduleでは、Cron文法でも良いです)
Hobbyプランでは、毎月1000件までのタスク実行という上限があるため、最小実行間隔が1時間となります。( ∵ 606024*31(1ヶ月の秒換算)/ 1000 ≒ 2678 < 最小実行間隔)
これで、毎時Rubyファイルが実行されるようになりました。つまり、毎時リストのタイムラインをクロールし、リツイートしていないツイートがあればツイートします。
宣伝
この技術により運用されているアカウントが、一高祭(茨城県土浦第一高等学校文化祭)のTwitterアカウントです。一高祭は、県内でも大規模な文化祭です。ぜひフォローお願いします 🙏
一高祭公式Twitterアカウント
https://twitter.com/ichikosai