-
-
Save kivanio/198e3757be8dbfad950fd2b96e30530c to your computer and use it in GitHub Desktop.
LINE BOT APIを利用してGoogle Calendarの情報を送る
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
require 'rest-client' | |
require 'json' | |
require 'date' | |
require 'gmail' | |
require 'yaml' | |
#google-api-clientはv0.6.4が必要です | |
require "google/api_client" | |
class MyMail | |
#GMail関連の設定 | |
ID = "GMail address" | |
PW = "GMail password" | |
TO = "mail send to address" | |
def self.send(sbj,msg) | |
gmail = Gmail.new(ID, PW) | |
message = | |
gmail.generate_message do | |
to TO | |
subject sbj | |
body msg | |
end | |
gmail.deliver(message) | |
gmail.logout | |
end | |
end | |
class LineBot | |
#LINE関連の設定 | |
ID = "Channel ID" | |
SECRET = "Channel Secret" | |
MID = "MID" | |
TO = "送信先のID" | |
def self.send(msg) | |
headers = { | |
"Content-Type" => "application/json; charser=UTF-8", | |
"X-Line-ChannelID" => ID, | |
"X-Line-ChannelSecret" => SECRET, | |
"X-Line-Trusted-User-With-ACL" => MID | |
} | |
params = { | |
to: [TO], | |
toChannel: "1383378250", | |
eventType: "138311608800106203", | |
content: { | |
contentType: 1, | |
toType: 1, | |
text: msg, | |
} | |
} | |
RestClient.post "https://trialbot-api.line.me/v1/events", params.to_json, headers | |
end | |
end | |
class GCal | |
def initialize(list) | |
@g_list = list | |
yaml_path = File.expand_path(".google-api.yaml",File.dirname(__FILE__)) | |
oauth = YAML.load_file(yaml_path) | |
@client = Google::APIClient.new({:application_name => "line_bot_gcal",:application_version => "1.0"}) | |
@client.authorization.client_id = oauth["client_id"] | |
@client.authorization.client_secret = oauth["client_secret"] | |
@client.authorization.scope = oauth["scope"] | |
@client.authorization.refresh_token = oauth["refresh_token"] | |
@client.authorization.access_token = oauth["access_token"] | |
if @client.authorization.refresh_token && @client.authorization.expired? | |
@client.authorization.fetch_access_token! | |
end | |
@service = @client.discovered_api('calendar', 'v3') | |
end | |
def get_gids | |
gcal_list = @client.execute(:api_method => @service.calendar_list.list) | |
gcal_ids = [] | |
gcal_list.data.items.each do |c| | |
gcal_ids.push [c["summary"],c["id"]] if @g_list.include? c["summary"] | |
end | |
gcal_ids | |
end | |
def get_event(day) | |
@day = day | |
gcal_ids = get_gids | |
params = {} | |
params['timeMin'] = Time.utc(day.year, day.month, day.day, 0).iso8601 | |
params['timeMax'] = Time.utc(day.year, day.month, day.day, 23, 59, 60).iso8601 | |
@event = {} | |
gcal_ids.each do |gcal| | |
params['calendarId'] = gcal[1] | |
params.delete("pageToken") unless params["pageToken"].nil? | |
events = @client.execute(:api_method => @service.events.list,:parameters => params) | |
while true | |
events.data.items.each do |e| | |
@event[gcal[0]] = [] if @event[gcal[0]].nil? | |
@event[gcal[0]].push e | |
end | |
break if !(page_token = events.data.next_page_token) | |
params["pageToken"] = page_token | |
events = @client.execute(:api_method => @service.events.list,:parameters => params) | |
end | |
end | |
end | |
def make_msg | |
d = {} | |
d[:at] = {} | |
d[:from] = {} | |
d[:to] = {} | |
day = @day.strftime("%Y-%m-%d") | |
nday = (@day + 1).strftime("%Y-%m-%d") | |
@event.each do |k,v| | |
v.each do |e| | |
next if e.status == "cancelled" | |
if e.start.date.nil? | |
if e.recurrence.size == 0 | |
next unless e.start.date_time.strftime("%Y-%m-%d") == day | |
end | |
d[:at][k] = [] if d[:at][k].nil? | |
msg = e.start.date_time.strftime("%H:%M") | |
msg = msg + " - " | |
if e.recurrence.size == 0 | |
msg = msg + e.end.date_time.strftime("%m/%d ") unless e.end.date_time.strftime("%Y-%m-%d") == day | |
end | |
msg = msg + e.end.date_time.strftime("%H:%M") | |
msg = msg + " " + e.summary | |
d[:at][k].push msg | |
else | |
type = nil | |
case | |
when ((e.start.date == day) and (e.end.date == nday)) | |
type = :at | |
when e.start.date == day | |
type = :from | |
when e.end.date == nday | |
type = :to | |
end | |
next if type.nil? | |
d[type][k] = [] if d[type][k].nil? | |
d[type][k].push e.summary | |
end | |
end | |
end | |
ret = nil | |
s = {:at => "",:from => "から",:to => "まで"} | |
["at" , "from" , "to"].each do |t| | |
t = t.to_sym | |
unless d[t].size == 0 | |
ret = ret.nil? ? "" : ret + "\n" | |
ret = ret + day + s[t] + "の予定" | |
d[t].each do |k,v| | |
ret = ret + "\n [" + k + "]" | |
v.sort.each do |e| | |
ret = ret + "\n " + e | |
end | |
end | |
end | |
end | |
ret | |
end | |
end | |
#送信したいカレンダー名を列挙する | |
GCAL_LIST = [ | |
"お仕事", | |
"記念日", | |
"遊び", | |
] | |
g = GCal.new(GCAL_LIST) | |
tmr = Date.today + 1 | |
g.get_event(tmr) | |
msg = g.make_msg | |
unless msg.nil? | |
begin | |
LineBot.send(msg) | |
rescue => e | |
print "#{Time.now.to_s} line bot error raise!\n" | |
MyMail.send "line bot error raise",e.response | |
exit | |
end | |
print "#{Time.now.to_s} send event!\n" | |
else | |
print "#{Time.now.to_s} no event.\n" | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment