Rubyで簡単なTwitter クライアントをつくる

今更ながら、Twitter Ruby Gem を使ってTerminal で動く簡単なTwitter クライアントを作成。

# このTwitter クライアントができること
- タイムラインの取得
- リプライの取得
- 特定のリストのタイムラインの取得
- ツイート

# この記事を読む対象の人
- Ruby で少しでもプログラムを書いたことがある人
- Twitter のクライアントのようなものを作ってみようかなと考えている人
- Mac やLinux でプログラムを書いている人(Mac やLinux で動作することは確認済)

# 事前に準備するもの
Ruby で書く前に下記を準備する。

- gem コマンドでtwitter ライブラリをインストール
- Twitterのdeveloper サイトでAPIキー を取得

## gem でtwitter ライブラリをインストール
Terminal からgem コマンドでtwitterライブラリをインストールする。

```zsh
gem install twitter
```

## Twitter のdeveloper サイトからAPI キーを取得
[developpers のApplication Management](https://apps.twitter.com/) から下記の値を取得する。

- Consumer Key (API Key)
- Consumer Secret (API Secret)
- Access Token
- Access Token Secret

API キーを取得するにあたり、あらかじめTwitter のアカウントは取得し、Twitter に自分の電話番号を登録しておくこと。

# 実際にプログラムを書いてみる

## twitter ライブラリの呼び出し
gem でインストールしたtwitterライブラリを呼び出す。

```ruby
# twitterライブラリの呼び出し
require 'twitter'
```

## アクセストークンなどの設定
あらかじめ取得したTWitter のAPIキーを追加する。
config.xxx=""には、各自取得した値を記述する。

```ruby
# アクセストークンなどを設定
@client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "Consumer Key (API Key)"
  config.consumer_secret     = "Consumer Secret (API Secret)"
  config.access_token        = "Access Token"
  config.access_token_secret = "Access Token Secret"
end
```

## はじめてプログラムを実行したときのメソッド
下記のように実行コマンドにオプションをつけ、そのオプションによってタイムラインを取得させたり、リプライを取得させたりしたい。`ruby client.rb`で実行させた時、実行時にはオプションつけてください、と説明書きを表示させるメソッドを作成する。

- `ruby client.rb -t` でタイムライン取得
- `ruby client.rb -m` でリプライ取得
- `ruby client.rb -l` で特定のリストを取得
- `ruby 何かしらの文字列` でツイート

```ruby
# client tutorial
def tutorial
  puts "Welcome to Hoge Client."
  puts "このclientを起動時する際、末尾にオプションをつけてください"
  puts "-t HomeのTimeline取得"
  puts "-m リプライの取得"
  puts "-l リストの取得"
  puts "ツイートしたい内容 ツイートする！"
end
```

## タイムラインを取得するメソッド
`client.home_timeline` でタイムラインを取得し、each文で繰り返して最新のツイート20件をputsで表示させるメソッドを作成する。

```ruby
# display timeline
def homeTimeline
  @client.home_timeline.each do |tweet|
    puts "\e[33m" + tweet.user.name + "\e[32m" + "[ID:" + tweet.user.screen_name + "]"
    puts "\e[0m" + tweet.text
  end
end
```

## リプライを取得するメソッド
`client.mentions_timeline` でリプライを取得し、each文で繰り返して最新のリプライ20件をputsで表示させるメソッドを作成する。

```ruby
# display mentions
def mentionTimeline
  @client.mentions_timeline.each do |tweet|
    puts "\e[33m" + tweet.user.name + "\e[32m" + "[ID:" + tweet.user.screen_name + "]"
    puts "\e[0m" + tweet.text
  end
end
```

## 特定のリストのタイムラインを取得するメソッド
`client.list_timeline("リストを作ったユーザID", "リスト名")` で"リスト名"に記述したリストのツイート取得し、each文で繰り返して最新のリスト内のツイートを20件をputsで表示させるメソッドを作成する。

```ruby
# display list
def listTimeline
  @client.list_timeline("リストを作ったユーザID", "リスト名").each do |tweet|
    puts "\e[33m" + tweet.user.name + "\e[32m" + "[ID:" + tweet.user.screen_name + "]"
    puts "\e[0m" + tweet.text
  end
end
```
### 留意点
リスト名に日本語やアンダースコアが含まれていると取得できないため、リスト名は半角英字で作成したものを記述する。(2018年2月1日追記)

## ツイートするメソッド
`client.update(ARGV[0])` でコマンドラインに入力された文字列をツイートするメソッドを作成する。

```ruby
# tweet
def tweet
  @client.update(ARGV[0])
  puts "Tweetしたぞい"
end
```

## 各メソッドの呼び出し
それぞれ作成したメソッドを、実行コマンドにつけたオプションの文字列で判断し、呼び出すようにする。実行コマンドのオプションはARGV配列に格納されているため、文字列に変換する必要がある。

```ruby
option = ARGV[0].to_s

if option == "" then
  tutorial
elsif option == "-t" then
  homeTimeline
elsif option == "-m" then
  mentionTimeline
elsif option == "-l" then
  listTimeline
else
  tweet
  homeTimeline
end
```

# 補足
タイムラインやリプライを取得し、取得した内容をputsで表示する際、ユーザ名、ユーザID、ツイート内容を表示している。
- `tweet.user.name` でユーザ名を取得
- `tweet.user.screen.name` でユーザID を取得
- `tweet.text` でツイート内容を取得

今回はユーザ名を黄色、ユーザID を緑色、ツイート内容を白色で表示させるようにした。

# ソースコード
GitHub にて公開しています。(2018年2月1日追記)
https://github.com/shimisunet/twitter-client

# 参考URL
ほとんど公式サイトです。日本語サイトもとても参考になりました。
http://www.rubydoc.info/gems/twitter/5.16.0
http://route477.net/w/RubyTwitterJa.html