Twitter bot 検索機能[拡張編]

Ruby

こんにちはkazutoです。今回は、以前、作成した天気予報botに検索機能を実装していきます。

事前準備

まずは事前準備を行っていきましょう。

下記のソースコードをコピペしてください。

require "./config.rb"
require "json"
require "open-uri"
require "csv"
require "./weather_class.rb"
require "./tweet.rb"
require "./search.rb"
require "./analysis.rb"

def execution
  puts "メニューを選択してください"
  puts "[1]天気予報を取得してツイートする"
  puts "[2]5日間の天気情報を表示"
  puts "[3]プロフィール編集"
  puts "[4]ユーザ検索"
num = gets.to_i
 case num
   when 1
     current_time_weather  =  wetaher(num)
     tweet(current_time_weather,num)
    when 2
     current_time_weather  =  wetaher(num)
    when 3
     tweet(current_time_weather,num)
    when 4
     search()
    else
    puts "無効な値です"
  end
end

新たにSearchクラス(検索機能)を作成したいので、search.rbファイルを作成しましょう。

touch search.rb
ls search.rb

ファイルが作成できたら、クラスを定義して、検索機能の雛形を整えましょう。事前準備ですが、少しメソッドの解説をしておきます。

require './tweet.rb'
require './analysis.rb'
require 'csv'
class Search<Tweet
 def initialize()
    super(client)
  end
 def search()
    puts "ユーザー名を入力してください。"
    input = gets.chomp
    search_account_information(input)
  end
 def search_target(user_name)
    puts "#{@client.user(user_name).name}さんどの情報が知りたいですか?"
    puts "[1]タイムライン"
    puts "[2]フォロー数"
    puts "[3]フォロワー数"
    puts "[4]タイムライン情報全件取得"
    puts "[5]比較する"

    num =  gets.to_i
    case num
      when 1
     #タイムライン(~20)
      when 2
     #フォロー数
      when 3
         #フォロワー数
      when 4
         #タイムライン情報全件取得
      when 5
    else
      puts "無効の値です"
    end
   end

end


def Search
    search= Search.new()
    search.search()
  end
class Search<Tweet

今回はTweetクラスの

  • メソッド
  • 属性(@clinet)

を使っていきたいので、Tweetクラスを継承します。クラスを継承する事で、親クラスのメソッドや属性を引き継ぐ事ができます

def initialize()
    super(client)
end

Searchクラスでは、特別に属性を持つ必要がないですが、アカウントの認証情報が格納されている、Tweetクラスの@clientは、いいね数などを取得するのに必要なので、Searchクラスでも扱える様にsuperメソッドを用いています。
superメソッドとは親クラスにある同名のメソッドを呼び出すメソッドです

class Tweet
  attr_accessor :client
end

今回の場合、スーパークラス(親クラス)でattr_accessorを用いてゲッターとセッターを定義しています。したがって、Searchクラスでも同様に@cilentを使って値を参照する事が可能になります。

def search()
    puts "ユーザー名を入力してください。"
    input = gets.chomp
    search_account_information(input)
  end

まず、初めにsearchメソッドを用いて、調べたいユーザのアカウントのユーザー名を入力します。Twitterのユーザー名とは、@〜から始まるIDみたいな物です。

入力された値をinput に格納し、search_account_informationメソッドの引数に渡し呼び出します。search_account_informationメソッドはTweetクラスのメソッドです。

def search_account_information(user_name,analsis=false)
   puts  @client.user(user_name).screen_name   # アカウントID
   puts  @client.user(user_name).name          # アカウント名
   puts  @client.user(user_name).description   # プロフィール
   puts "こちらのアカウントのでお間違い無いですか?"
   puts "[1]YES"
   puts "[2]NO"
   num = gets.to_i
   case num
    when 1
      if analsis
        nil
      else
        search_target(user_name)
      end
    when 2
      return
    else
      puts"無効な値です"
   end
  end

search_account_informationメソッドでは、引数で受け取ったアカウントIDに紐づく

puts  @client.user(user_name).screen_name   # アカウントID
puts  @client.user(user_name).name          # アカウント名
puts  @client.user(user_name).description   # プロフィール
  • アカウントID
  • アカウント名
  • プロフィール

を表示し、検索したいユーザなのかを確認をします。

 case num
    when 1
      if analsis
        nil
      else
        search_target(user_name)
      end
    when 2
      return
    else
      puts"無効な値です"
   end

最終的に条件分岐をして調べたいユーザの場合は、search_targetメソッドを呼び出します。調べたいユーザで無かった場合は、returnメソッドを呼び出して処理を強制終了します。

def search_target(user_name)
    puts "#{@client.user(user_name).name}さんどの情報が知りたいですか?"
    puts "[1]タイムライン"
    puts "[2]フォロー数"
    puts "[3]フォロワー数"
    puts "[4]タイムライン情報全件取得"
    puts "[5]比較する"

    num =  gets.to_i
    case num
      when 1
     #タイムライン(~20)
      when 2
     #フォロー数
      when 3
         #フォロワー数
      when 4
         #タイムライン情報全件取得
      when 5
    else
      puts "無効の値です"
    end
   end

end

search_targetメソッドは、検索機能のメニューになります。今回はこのメソッドの中身を拡張していき、検索機能を完成させます。なおメニュー項目に「比較する」とありますが、こちらは、次回、実装する予定のAnalysisクラスと連結が必要になりますので、飛ばします。

以上で事前準備は、終了になります。次のトピックから本格的な実装になります。

Twitter bot 検索機能[実装編]

それでは、本格的な実装に入っていきたいと思います。

  • タイムライン(20)
  • フォロー数&フォロワー数
  • タイムライン(max)
  • ユーザの比較(※次回実装)

上記の5つの項目ごとにメソッドを用意して実装していきます。

検索機能に必要なメソッドをTweetクラスに定義をしていき、呼び出す側の処理はSearchクラスで行う流れで実装していきます。

タイムライン(20)

まず初めにユーザのタイムラインのデータを取得して表示してみましょう。
search_targetメソッドに下記のコードを追加してください。

def search_target(user_name)
when 1
   timeline_style(user_name)
end

では、実際にメソッドを作成していきましょう。

  • timeline_styleメソッド
    →CSVファイルを作成するか確認するメソッド
  • timelineメソッド
    →タイムラインを取得&表示するメソッド
  • timeline_writeメソッド
    →CSVファイルを作成するメソッド

上記の3つのメソッドを用いてロジックを組んでいきます。


def timeline_style(user_name)
    puts "CSVファイルにデータを書き込みますか❓"
    puts "[1]YES"
    puts "[2]NO"
    num = gets.to_i
    case num
      when 1
        timeline_write(user_name)
      when 2
        timeline(user_name)
    else
      puts "無効の値です"
    end
  end

def timeline(user_name)
    total_repetition = 0
         likes = 0
         retweets = 0
        @client.user_timeline(user_name).each do  |tweet|
          puts "---------------------------------------------"
          puts "投稿日#{tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )}"
          puts tweet.full_text
          puts "いいね数:#{tweet.favorite_count}"
          puts "リツイート数:#{tweet.retweet_count}"
          puts "---------------------------------------------"
          likes += tweet.favorite_count
          retweets +=tweet.retweet_count
          total_repetition +=1
        end
        puts "ツイート数:#{ total_repetition}"
        puts "トータルいいね数:#{likes}"
        puts "トータルリツイート数:#{retweets}"
  end

 
   def timeline_write(user_name)
    CSV.open("#{user_name}timeline.csv","w") do |data|
      data << ["id","投稿日","投稿内容","いいね数","リツイート数"]
      tweets=timeline(user_name,true)
      tweets.each do |tweet|
        data<<tweet
      end
    end
  end
def timeline_style(user_name)
    puts "CSVファイルにデータを書き込みますか❓"
    puts "[1]YES"
    puts "[2]NO"
    num = gets.to_i
    case num
      when 1
        timeline_write(user_name)
      when 2
        timeline(user_name)
    else
      puts "無効の値です"
    end
  end

まず初めにtimeline_styleメソッドが呼び出しCSVファイルを作成するか、確認をします。

 case num
      when 1
        timeline_write(user_name)
      when 2
        timeline(user_name)
    else
      puts "無効の値です"
    end

YESを選択した場合は、timeline_writeメソッドを呼び出し、NOと選択した場合は、timelineメソッドを呼び出します。

def timeline_write(user_name)
    CSV.open("#{user_name}timeline.csv","w") do |data|
      data << ["id","投稿日","投稿内容","いいね数","リツイート数"]
      tweets=timeline(user_name,true)
      tweets.each do |tweet|
        data<<tweet
      end
    end
  end

timeline_writeメソッドは、CSVファイルにタイムラインの情報を書き込むメソッドです。

 CSV.open("#{user_name}timeline.csv","w") do |data|
 end

まず初めにopenメソッドを用いてCSVファイルを開きます。ディレクトリ内に第1引数と同じファイル名がない場合は、CSVファイルを新規作成します。第2引数の”w”と記述すると書き込む事が可能になります。

data << ["id","投稿日","投稿内容","いいね数","リツイート数"]

作成するCSVファイルは、最終的にGoogleスプレッドシートで表にしていきたいです。なので、あらかじめ、ヘッダーを作成してデータに名前を付けておきます。
上記の様にdata<<[]とする事でCSVファイルに書き込む事ができます。

tweets=timeline(user_name,true)

ヘッダーを作成した所で、肝心のデータが無ければ表は成り立ちません。なので「タイムラインを取得&表示するメソッド」timelineメソッドを呼び出し、タイムラインのデータを取得しましょう。

def timeline(user_name,write=false)
      total_repetition = 0
      likes = 0
      retweets = 0
      data=[] if write
        @client.user_timeline(user_name).each do  |tweet|
          puts "---------------------------------------------"
          puts "更新日#{tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )}"
          puts tweet.full_text
          puts "いいね数:#{tweet.favorite_count}"
          puts "リツイート数:#{tweet.retweet_count}"
          puts "---------------------------------------------"
          likes += tweet.favorite_count
          retweets +=tweet.retweet_count
          total_repetition +=1
          data << [ total_repetition,tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' ),tweet.text,tweet.favorite_count.to_i,tweet.retweet_count] if write
        end
        puts "ツイート数:#{ total_repetition}"
        puts "トータルいいね数:#{likes}"
        puts "トータルリツイート数:#{retweets}"
        data if write
   end
total_repetition = 0
likes = 0
retweets = 0

まず初めに

  • ツイート数(total_repetition)
  • いいね数(likes)
  • リツイート数(retweets)

の合計値を求めたいので、each文のブロック外で変数を定義をしておきます。

 data=[] if write

引数writeがtrueの時、つまりCSVファイルにデータを書き込む際は、配列を定義します。変数dataにタイムライン情報を格納していきます。

 @client.user_timeline(user_name).each do  |tweet|
 end

Twitter::REST::Clientクラスのuser_timelineメソッドを用いる事で、タイムラインの情報を取得できます。

tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )

こちらは、投稿した日にち、時間を取得しています。Twitter::REST::Clientクラスのcreated_atメソッドを用いる事により、UTCの時間を取得できます。UTCとは協定世界時の略です。

今回は、JST(日本時間)に直して表示したいので、getlocalメソッドを用いて、JSTに変換しています。getlocalメソッドとは、地方時に設定した Time オブジェクトを新しく生成するメソッドです。要するにあなたが住んでいるリアルタイムの時間に直してくれるという事ですね。

tweet.full_text

Twitter::REST::Clientクラスのfull_textメソッドを用いるとツイートした内容を取得する事ができます。

tweet.favorite_count

Twitter::REST::Clientクラスのfavorite_countメソッドを用いるといいね数を取得する事ができます。

tweet.retweet_count

Twitter::REST::Clientクラスのretweet_countメソッドを用いるとリツイート数を取得する事ができます。

likes += tweet.favorite_count
retweets +=tweet.retweet_count
total_repetition +=1

それぞれ、各項目ごとの合計値を自己代入演算をし、合計値を求めています。

  data << [ total_repetition,tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' ),tweet.text,tweet.favorite_count.to_i,tweet.retweet_count] if write

CSVファイルに書き込むデータを配列に格納しています、

  • ツイートID
  • 投稿日
  • ツイート内容
  • いいね数
  • リツイート数

を変数dataの中に格納しています。

  puts "ツイート数:#{ total_repetition}"
 puts "トータルいいね数:#{likes}"
  puts "トータルリツイート数:#{retweets}"

each文のループ処理が終わったら、各項目の合計値を出力します。

data if write
tweets=timeline(user_name,true)

CSVファイルを作成する場合は、変数dataをtimelineメソッドの返り値として呼び出し側に返します。

timelineメソッドの処理の解説は終わったので、呼び出し元のtimeline_writeメソッドの解説に戻ります。

tweets=timeline(user_name,true)
 tweets.each do |tweet|
        data<<tweet
 end

timelineメソッドの返り値を受け取ったtweetsをeach文を用いてデータをばらしています。

data<<tweet

each文のブロック内でdata<<tweetとする事で、一つ一つツイートをCSVファイルに書き込んでいます。

以上で、タイムライン(20)の実装は終了です。CSVファイルが作成されているか確認をしてみてください。無事、CSVファイルが作成されているのが、確認できたら一度、googleのスプレッドシートにファイルをアップロードしてみましょう。

 上記の様に表示されていれば、実装完了です。

フォロー数&フォロワー数

続いて

  • フォロー数
  • フォロワー数

を取得して表示してみましょう。

今回は、search_targetメソッドに1行を付け足すだけなのでメソッドは新たに作成はしません。

def search_target(user_name)
 when 2
    puts "フォロー数:#{@client.user(user_name).friends_count}"
 when 3
    puts "フォローワー数#{client.user(user_name).followers_count}"
end
@client.user(user_name).friends_count

Twitter::REST::Clientクラスのfriends_countメソッドを用いる事により、フォロー数を取得する事ができます。

@client.user(user_name).followers_count

Twitter::REST::Clientクラスのfollowers_countメソッドを用いる事により、フォロワー数を取得する事ができます。

以上で、フォロー数&フォロワー数の実装は終了です。とてもあっさりした内容でしたね。

タイムライン(max0)

最後に検索したアカウントのタイムラインの情報を全て取得してみましょう。デフォルトでは、取得できるツイート数は最大200ですが、少し工夫をすれば全て取得する事が可能になります。

今回は下記のメソッドを作成していきます。

  • number_of_pages_judgmentメソッド
    →ページ数を取得
  • get_all_tweetsメソッド
    →全てのツイート表示&CSV書き込み

となります。

※ツイート数が多くレートを超えてしまう場合は、エラーになります。

まずは,Searchクラスのsearch_targetメソッドでメソッドを呼び出す記述を付け足しましょう。

 when 4
        pages = number_of_pages_judgment(user_name)
        get_all_tweets(user_name,pages,{mode: "WRITE"} )

実装の流れは、pagesという変数にページ数を格納し、get_all_tweetsメソッドの引数に渡して、呼び出しタイムラインの情報を取得します。

では、実際にメソッドを作成していきましょう。

def get_all_tweets(user_name,pages,type )
  total_like=0
  total_retweeet = 0
  case type[:mode]
    when "WRITE"
      CSV.open("#{user_name}.csv","w") do |data|
          data << ["id","投稿日","投稿内容","いいね数","リツイート数"]
          pages.each do |page|
          @client.user_timeline(user_name,{ count: 200 ,page:page} ).each do |timeline|
            tweet = @client.status(timeline.id)
            puts"--"*100
            puts  tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )
            puts tweet.text
            puts "いいね数#{tweet.favorite_count}"
            puts "リツート#{tweet.retweet_count}"
            puts "--"*100
            total_repetition+=1
            total_like+=tweet.favorite_count
            total_retweeet+=tweet.retweet_count
            data << [timeline.id,tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' ),tweet.text,tweet.favorite_count,tweet.retweet_count]
          end
        end
        puts "ツイート数#{@client.user(user_name).tweets_count}"
        puts "トータルいいね数#{total_like}"
        puts "トータルリツイート#{total_retweeet}"
        data << ["", "",@client.user(user_name).tweets_count,total_like,total_retweeet]
      end
    when "COMPARISON"
     #次回実装
  else
    puts "無効の値です"
  end

end


  def number_of_pages_judgment(user_name)
    pages =[]
    if @client.user(user_name).tweets_count < 200
        count = 1
    elsif @client.user(user_name).tweets_count % 200==0
        count = @client.user(user_name).tweets_count / 200
    else
      remainder =  (@client.user(user_name).tweets_count / 200)
      count = remainder+1
      remainder_num=@client.user(user_name).tweets_count-200*remainder
    end
    1.upto(count) do |num|
      pages.push(num)
    end
    pages
  end

メソッドごとに処理の解説していきます。

まずは、number_of_pages_judgmentメソッドについて解説していきます。

def number_of_pages_judgment(user_name)
    pages =[]
    if @client.user(user_name).tweets_count < 200
        count = 1
    elsif @client.user(user_name).tweets_count % 200==0
        count = @client.user(user_name).tweets_count / 200
    else
      remainder =  (@client.user(user_name).tweets_count / 200)
      count = remainder+1
    end
    1.upto(count) do |num|
      pages.push(num)
    end
    pages
  end

number_of_pages_judgmentメソッドでは、配列pagesにユーザのタイムラインの全ページ数を格納します。

ページ数を求める意図は、get_all_tweetsメソッドでタイムラインを情報を取得する際に、pageというオプションを付与するからです。このオプションは、ページ数を指定する事により、そのページのツイートを取得することができる様になります。デフォルトだと1ページ目のツイート数のみ取得できます 。

なので、ユーザのタイムラインのページ数を調べ、そのページ数ぶん、ループ処理を回せば、タイムラインの全ての情報を取得する事が可能になります。

pages =[]

まずは、ページ数を格納する配列pagesを定義します。

 if @client.user(user_name).tweets_count < 200
        count = 1
    elsif @client.user(user_name).tweets_count % 200==0
        count = @client.user(user_name).tweets_count / 200
    else
      remainder =  (@client.user(user_name).tweets_count / 200)
      count = remainder+1
    end

こちらは、ツイート数を評価しています。

  • ツイート数が200に届かない場合
    →ページ数=1
  • ツイート数を200で割り切れる場合
    →ページ数=ツイート数 /200
  • 端数が発生する場合
    →ページ数=ツイート数/200+1

となります。

今回は、1ページあたりの表示数は200になりますので、上記の様な計算方法になりました。

  • ツイート数が200に届かない場合
  • 端数が発生する場合

上記の様な場合は、1を足します。この1は端数対策です。

 1.upto(count) do |num|
      pages.push(num)
 end

ページ数が格納された変数countの分だけuptoメソッドを用いて、ループ処理を行っています。uptoメソッドとは引数に指定された数まで 1 ずつ増やしながら繰り返すメソッドです。

  pages.push(num)

pushメソッドを用いてページ数変数pagesに格納しています。

pages

最終的にページ数が格納された配列pageを返り値として返します。

以上で、number_of_pages_judgmentメソッドの解説は終了になります。続いて、get_all_tweetsメソッドについて解説していきます。

def get_all_tweets(user_name,pages,type )
  total_like=0
  total_retweeet = 0
  case type[:mode]
    when "WRITE"
      CSV.open("#{user_name}.csv","w") do |data|
          data << ["id","投稿日","投稿内容","いいね数","リツイート数"]
          pages.each do |page|
          @client.user_timeline(user_name,{ count: 200 ,page:page} ).each do |timeline|
            tweet = @client.status(timeline.id)
            puts"--"*100
            puts  tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )
            puts tweet.text
            puts "いいね数#{tweet.favorite_count}"
            puts "リツート#{tweet.retweet_count}"
            puts "--"*100
            total_repetition+=1
            total_like+=tweet.favorite_count
            total_retweeet+=tweet.retweet_count
            data << [timeline.id,tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' ),tweet.text,tweet.favorite_count,tweet.retweet_count]
          end
        end
        puts "ツイート数#{@client.user(user_name).tweets_count}"
        puts "トータルいいね数#{total_like}"
        puts "トータルリツイート#{total_retweeet}"
        data << ["", "",@client.user(user_name).tweets_count,total_like,total_retweeet]
      end
    when "COMPARISON"
     #次回実装
  else
    puts "無効の値です"
  end
end

timelineメソッドと同じ様な処理内容になっていますので、一部、解説を省略します。

get_all_tweetsメソッドは2つの挙動を持ちます。

 case type[:mode]
    when "WRITE"
    when "COMPARISON"
 end
  • WRITE
    →CSVファイルに生成
  • COMPARISON
    →いいね数ORリツイート数を算出する

となります。COMPARISONについては、次回、実装するので省略します。なのでWRITEの処理を解説していきます。

 when "WRITE"
      CSV.open("#{user_name}.csv","w") do |data|
          data << ["id","投稿日","投稿内容","いいね数","リツイート数"]
          pages.each do |page|
          @client.user_timeline(user_name,{ count: 200 ,page:page} ).each do |timeline|
            tweet = @client.status(timeline.id)
            puts"--"*100
            puts  tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )
            puts tweet.text
            puts "いいね数#{tweet.favorite_count}"
            puts "リツート#{tweet.retweet_count}"
            puts "--"*100
            total_repetition+=1
            total_like+=tweet.favorite_count
            total_retweeet+=tweet.retweet_count
            data << [timeline.id,tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' ),tweet.text,tweet.favorite_count,tweet.retweet_count]
          end
        end
        puts "ツイート数#{@client.user(user_name).tweets_count}"
        puts "トータルいいね数#{total_like}"
        puts "トータルリツイート#{total_retweeet}"
        data << ["", "",@client.user(user_name).tweets_count,total_like,total_retweeet]
      end
CSV.open("#{user_name}.csv","w") do |data|
end

まずは、CSVファイルを作成します。既に同じ名前のファイルがある場合は、そのファイルを開きます。

  data << ["id","投稿日","投稿内容","いいね数","リツイート数"]

ヘッダーを作成してデータに名前を付けておきます。

 pages.each do |page|
    @client.user_timeline(user_name,{ count: 200 ,page:page} ).each do |timeline|
    end
 end

引数で受け取った、pagesをeach文を用いて値(ページ数)を取り出します。

@client.user_timeline(user_name,{ count: 200 ,page:page} ).each do |timeline|
end

波括弧の部分でオプションを指定しています。

  • count
    →取得するツイート数
  • page
    →ページ数

となります。

上記の2つのオプションを指定するとタイムライン上の情報を全て取得する事ができます。

 tweet = @client.status(timeline.id)
            puts"--"*100
            puts  tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )
            puts tweet.text
            puts "いいね数#{tweet.favorite_count}"
            puts "リツート#{tweet.retweet_count}"
            puts "--"*100
            total_repetition+=1
            total_like+=tweet.favorite_count
            total_retweeet+=tweet.retweet_count
            data << [timeline.id,tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' ),tweet.text,tweet.favorite_count,tweet.retweet_count]
          end
        end
        puts "ツイート数#{@client.user(user_name).tweets_count}"
        puts "トータルいいね数#{total_like}"
        puts "トータルリツイート#{total_retweeet}"
        data << ["", "",@client.user(user_name).tweets_count,total_like,total_retweeet]

ブロック内の処理は、timelineメソッドをほぼ一緒なので、解説は省略します。

以上で、タイムライン(max)の実装は終了になります。ruby コマンドを実行して CSVファイルを作成してみてください。

画像

作成したCSVファイルをgoogleスプレッドシートで

  • いいね数
  • リツイート数

をグラフ化してみました。グラフ化すると、どのツイートが伸びたか、すぐに分かりますね。

現状のソースコードは、下記に貼り付けておきますので、ご確認をお願いします。

require 'twitter'
require './config.rb'
require 'csv'
class Tweet
  attr_accessor :client
  def initialize(current_time_weather)
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key        =  CONSUMER_KEY
      config.consumer_secret     =  CONSUMER_SECRET
      config.access_token        =  ACCESS_TOKEN
      config.access_token_secret =  ACCESS_TOKEN_SECRET
    end
    @current_time_weather =  current_time_weather
  end

  def updata
    text = "#{@current_time_weather[:dt_txt]}\n#{@current_time_weather[:city]}の天気\n天気:#{@current_time_weather[:description]}\n気温:#{@current_time_weather[:temperature]}"
    @client.update(text)
  end

  def account_setting
    puts "アカウント名:#{@client.user.name}"
    puts "プロフィール文\n#{@client.user.description }"
    puts "[1]アカウント名を変更する"
    puts "[2]プロフィール文を変更する"
    puts "[3]閉じる"
    num = gets.to_i

      case num
        when 1
          name =gets.chomp
          @client.update_profile({name:name} )
        when 2
          description = gets.chomp
          @client.update_profile({description:description} )
        when 3
          return
      end
  end

  def search_account_information(user_name,analsis=false)
   puts  @client.user(user_name).screen_name   # アカウントID
   puts  @client.user(user_name).name          # アカウント名
   puts  @client.user(user_name).description   # プロフィール
   puts "こちらのアカウントのでお間違い無いですか?"
   puts "[1]YES"
   puts "[2]NO"
   num = gets.to_i
   case num
    when 1
      if analsis
        nil
      else
        search_target(user_name)
      end
    when 2
      return
    else
      puts"無効な値です"
   end
  end

  def search_target(user_name)
    puts "#{@client.user(user_name).name}さんどの情報が知りたいですか?"
    puts "[1]タイムライン"
    puts "[2]フォロー数"
    puts "[3]フォロワー数"
    puts "[4]タイムライン情報全件取得"
    num =  gets.to_i
    case num
      when 1
        timeline(user_name)
      when 2
        puts @client.user(user_name).friends_count
      when 3
        puts @client.user(user_name).followers_count
      when 4
        pages=number_of_pages_judgment(user_name)
        show_recently_twieet(user_name,pages )
    end
   end

   def timeline_style(user_name)
    puts "CSVファイルにデータを書き込みますか❓"
    puts "[1]YES"
    puts "[2]NO"
    num = gets.to_i
    case num
      when 1
        timeline_write(user_name)
      when 2
        timeline(user_name)
    else
      puts "無効の値です"
    end
   end

   def timeline(user_name,write=false)
      total_repetition = 0
      likes = 0
      retweets = 0
      data=[] if write
        @client.user_timeline(user_name).each do  |tweet|
          puts "---------------------------------------------"
          puts "更新日#{tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )}"
          puts tweet.full_text
          puts "いいね数:#{tweet.favorite_count}"
          puts "リツイート数:#{tweet.retweet_count}"
          puts "---------------------------------------------"
          likes += tweet.favorite_count
          retweets +=tweet.retweet_count
          total_repetition +=1
          data << [ total_repetition,tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' ),tweet.text,tweet.favorite_count.to_i,tweet.retweet_count] if write
        end
        puts "ツイート数:#{ total_repetition}"
        puts "トータルいいね数:#{likes}"
        puts "トータルリツイート数:#{retweets}"
        data if write
   end


   def timeline_write(user_name)
    puts "ss"
    CSV.open("#{user_name}timeline.csv","w") do |data|
      data << ["id","投稿日","投稿内容","いいね数","リツイート数"]
      tweets=timeline(user_name,true)
      tweets.each do |tweet|
        data<<tweet
      end
    end
  end


def get_all_tweets(user_name,pages,type )
  total_repetition = 0
  total_like=0
  total_retweeet = 0
  case type[:mode]
    when "WRITE"
      CSV.open("#{user_name}.csv","w") do |data|
          data << ["id","投稿日","投稿内容","いいね数","リツイート数"]
          pages.each do |page|
          @client.user_timeline(user_name,{ count: 200 ,page:page} ).each do |timeline|
            tweet = @client.status(timeline.id)
            puts"--"*100
            puts  tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' )
            puts tweet.text
            puts "いいね数#{tweet.favorite_count}"
            puts "リツート#{tweet.retweet_count}"
            puts "--"*100
            total_repetition+=1
            total_like+=tweet.favorite_count
            total_retweeet+=tweet.retweet_count
            data << [timeline.id,tweet.created_at.getlocal.strftime('%Y年%m月%d日 %H時%M分%S秒' ),tweet.text,tweet.favorite_count,tweet.retweet_count]
          end
        end
        puts "ツイート数#{@client.user(user_name).tweets_count}"
        # puts "繰り返すた回数#{total_repetition}"
        puts "トータルいいね数#{total_like}"
        puts "トータルリツイート#{total_retweeet}"
        data << ["", "",@client.user(user_name).tweets_count,total_like,total_retweeet]
      end
    when "COMPARISON"
      #次回
  else
    puts "無効の値です"
  end

end
  def number_of_pages_judgment(user_name)
    pages =[]
    if @client.user(user_name).tweets_count < 200
        count = 1
    elsif @client.user(user_name).tweets_count % 200==0
        count = @client.user(user_name).tweets_count / 200
    else
      remainder =  (@client.user(user_name).tweets_count / 200)
      count = remainder+1
      remainder_num=@client.user(user_name).tweets_count-200*remainder
    end
    1.upto(count) do |num|
      pages.push(num)
    end
    pages
  end
end


def tweet(current_time_weather,num)
  tweet = Tweet.new(current_time_weather)

  case num
  when 1
    tweet.updata()
    puts "ツイートが完了しました。"
  when 3
    tweet.account_setting()
  else
    puts "無効の値です"
  end
end

require './analysis.rb'
require 'csv'
class Search<Tweet
    def initialize()
      super(client)
    end

  def search()
    puts "ユーザー名を入力してください。"
    input = gets.chomp
    search_account_information(input)
  end

  def search_target(user_name)
    puts "#{@client.user(user_name).name}さんどの情報が知りたいですか?"
    puts "[1]タイムライン"
    puts "[2]フォロー数"
    puts "[3]フォロワー数"
    puts "[4]タイムライン情報全件取得"
    puts "[5]比較する"

    num =  gets.to_i
    case num
      when 1
        timeline_style(user_name)
      when 2
        puts "フォロー数:#{@client.user(user_name).friends_count}"
      when 3
        puts "フォローワー数#{client.user(user_name).followers_count}"
      when 4
        pages=number_of_pages_judgment(user_name)
        get_all_tweets(user_name,pages,{mode: "WRITE"} )
      when 5
        target_user = user_to_compare()
        analysis = Analysis.new()
        analysis.comparison_user_menu(user_name,true,target_user)
    end
   end

   def user_to_compare()
    puts "比較したいユーザのidを入力してください。"
    target_user  = gets.chomp
    search_account_information(target_user,true)
    target_user
  end
end
def search
    search= Search.new
    search.search()
end

まとめ:Twitter bot 検索機能[拡張編]

今回はTwitter botに検索機能を追加してみました。検索機能を追加した事により、更に便利なTwitter botになりました。しかし、「比較する」の項目が実装できていませんので、未完成です。次回の「Twitter bot 分析機能[拡張編]」にて実装していきますので、楽しみにお待ちください。
以上、kazutoでした。

関連記事

※この記事は、下記の3つの記事をご覧いただき、天気予報botを作成してから読み始めていきましょう。