Twitter bot 検索機能[拡張編]
こんにちは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を作成してから読み始めていきましょう。