forked from nomlab/GN-B4-Exercises
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MyTwitterBot.rb
170 lines (130 loc) · 4.53 KB
/
MyTwitterBot.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# -*- coding: utf-8 -*-
##########################################################################
# 【GNグループ新人研修課題】RubyによるTwitterBotプログラムの作成
#
# ファイルの内容: ボットの詳細な挙動を記述
# 起動の仕方 : $ ruby MyTwitterBot.rb
#
# 作成者: 北垣 千拡
#
##########################################################################
require './TwitterBot.rb' # TwitterBot.rbの読み込み
require './GoogleAPI.rb'
require 'open-uri'
require 'csv'
#---------- MyTwitterBot ----------
class MyTwitterBot < TwitterBot
#----------- プロフィールの情報を取得する ----------
def get_credentials
response = @access_token.get('/account/verify_credentials.json')
profile = JSON.parse(response.body)
return profile
end
#----------- 本日の天気を取得する ----------
# return : 文字列型で今日の天気
def get_weather
url = "http://weather.livedoor.com/forecast/webservice/json/v1"
result = open(url + '?' + "city=330010").read
weather = JSON.parse(result)
# 配列の[0]は今日,[1]は明日を意味している
return weather["forecasts"][0]["telop"]
end
#----------- xxx_msg を取得する-----------
# " 「xxx」と言って" という文字列があれば xxx を返す
# なければ nil を返す
def get_xxx_msg( msg )
/「(.+)」と言って/ =~ msg
return $1
end
#----------- CSVファイルからプロフィールを取得する-----------
# return : 名前(String)と誕生日(Date)を含むプロフィール
def get_profile( filename )
profile = []
i = 0
CSV.foreach(filename) do |row|
if(row[1].nil?)
return nil
end
profile[i] = {}
profile[i]["name"] = row[0]
profile[i]["birthday"] = Date.parse(row[1])
i += 1
end
return profile
end
#------------ 指定した日付が今日と一致しているか判定 -----------
# return : 一致していたらtrue,そうでなければfalse
def is_birthday_today( date )
today = Date.today
return ( date.month == today.month && date.day == today.day )
end
#------------ 今日誕生日の人がいたらつぶやく -----------
def tweet_birthday
profile = get_profile('birthday.csv')
if(profile.nil?)
puts "誕生日を記述したCSVファイルの書式が間違っているか,ファイルの中身が空です"
return nil
end
profile.each do |prof|
if is_birthday_today(prof["birthday"])
tweet( "本日は" + prof["name"] + "さんの誕生日です.おめでとうございます! by bot")
end
end
end
#---------- ツイートの要求があればつぶやく----------
def tweet_requested_msg
tweets = get_tweet
tweets.each do |post|
msg = get_xxx_msg( post["message"] )
if msg != nil
tweet( msg + "by bot")
end
end
end
#---------- 本日の天気をツイートする -----------
def tweet_weather
tweet( "今日は" + get_weather + "ですねえ. by bot" )
end
#---------- 一番近い予定が何日前か知らせる -----------
def tweet_close_event
cal = GoogleAPI.new('google-api.yml')
events = cal.get_most_close_events
if events.nil?
puts "GoogleCalendarに予定が登録されていません"
return nil
end
events.each do |event|
if event["summary"] != nil
if event["diff_day"] != 0
tweet( event["summary"] + "の" + event["diff_day"].to_s + "日前です. by bot" )
else
tweet( "本日は" + event["summary"] + "です. by bot" )
end
end
end
end
#---------- 本日が乃村先生の出張なら知らせる -----------
def tweet_business_trip
cal = GoogleAPI.new('google-api2.yml')
events = cal.get_most_close_events
if events.nil?
puts "GoogleCalendarに予定が登録されていません"
return nil
end
today = Date.today
events.each do |event|
if event["start"] <= today && today <= event["end"] && (event["summary"] =~ /乃村先生出張/) != nil
tweet( "本日乃村先生は出張です. by bot" )
end
end
end
end
#################################
# 起動すると以下が実行される
#################################
tw = MyTwitterBot.new
tw.tweet_requested_msg
tw.tweet_weather
tw.tweet_close_event
tw.tweet_birthday
tw.tweet_business_trip