初めに
メール確認が十分できているという方は問題ないので本記事は必要ありません。
それとGoogle Chromeにもいい拡張機能がたくさんありますので、そちらを検討する方がいいと思います。(実際に後悔しました。)
対象
新卒。僕みたいにメールを確認できず、「え?何のこと?」となる人
おことわり
- なぜSlack?
- チーム内でSlackを使っている
- チーム全員にメール確認を促す
- 先輩にメールを見ていることをアピールする
- なぜGmailAPI?
- 個人宛の未読、既読を使って何かしたかった
- うちがGmailだから
- なぜruby?
- 気分
- まったく書いたことがないから
参考にしてくださる際は
あらかじめ個人宛ラベルを設定しておいてください。
Gmail API
認証情報取得
まずはGoogle API Consoleへ入り、
プロジェクトを作成します。
入ったらGmailAPIをクリックし、有効にします。

左のバーから認証情報を選び、OAuthクライアントIDを作成します。

サービス名を決めろと言われるので、OAuth同意画面で設定する。
その後適当にAndroidなどを選ぶと(ここでは適当にその他)作成できます。
下の画像が出てきたら成功です。
Access Tokenの取得
DLしたファイルをclient_secret.jsonなどとしておき、保存します。
gem install google-api-client
をします。
Ruby Quickstartからソースコードを引っ張ってきて実行。(ソースファイルはclient_secret.jsonと同じ場所で実行してください。)
その後、出力されたURLをブラウザ上で貼り付けて遷移します。
遷移すると"このコードをコピーし、アプリケーションに切り替えて貼り付けてください"の下にコードが現れますのでそれを控えておきます。
下のコマンドを叩き、access_tokenとrefresh_tokenを取得する。
curl -d client_id={クライアントID} -d client_secret={クライアントシークレット} -d redirect_uri=urn:ietf:wg:oauth:2.0:oob -d grant_type=authorization_code -d code={控えておいたコード} https://accounts.google.com/o/oauth2/token
access_tokenは最悪なくてもいいが、refresh_tokenは控えておく。
Slack API
準備
mkdir local_bots
cd local_bots
https://api.slack.com/web からTokenを取得します。
gem install slack-api
を叩きます。
Ruby
とりあえずソース載せます。
こっちが時報系です。(これだけでよければGmailAPIは設定しなくても問題ありません。)
# !/usr/bin/ruby
require "slack"
require "json"
Slack.configure do |config|
config.token = 'Slack Apiで取得したトークン'
end
now = Time.now.hour
if (now < 9 || 15 < now)
exit(0)
end
text = case now
when 9 then '始業前メール確認の時間だよ!'
when 10 then 'コーヒー飲みつつ、メール確認だよ!'
when 11 then 'そろそろメール確認だよ!'
when 12 then 'もうお昼だよ!メールもいっぱいだよ!'
when 13 then 'そろそろランチの時間です!'
when 14 then '午後も頑張るぞ!メール確認しようね!'
when 15 then '今日のおやつは何かな!?メールも確認してね!'
end
now -= (now > 12) ? 12 : 0;
emoji = ":clock#{now}:"
Slack.chat_postMessage(username: "メール確認bot", text: text, channel: 'ルーム名', icon_emoji: emoji)
こっちが個人宛メール確認です。
curl -H "Authorization: Bearer {先ほど取得したアクセストークン}" https://www.googleapis.com/gmail/v1/users/me/labels
でラベル一覧を取得できますので、その中でラベルのIDを控えておきます。
# !/usr/bin/ruby
require "slack"
require "json"
def getToMeMailInfo(access_token)
# net/httpがうまくいかないのでcurlベタ打ち助けて
f = `curl -H "Authorization: Bearer #{access_token}" https://www.googleapis.com/gmail/v1/users/me/labels/未読件数を表示したいラベルのID`
return JSON.load(f)
end
Slack.configure do |config|
config.token = 'Slack APIで取得したトークン'
end
# clientデータの取得
# この後取得するaccess_tokenとrefresh_token
# とclient_IDとclient_secretを一つのファイルで管理
client_info_json = '/path/to/infoファイル'
client_data = open(client_info_json) do |io|
JSON.load(io)
end
result = getToMeMailInfo(client_data['token'])
# access_tokenは定期的にリセットされる
# access_tokenがリセットされた時の処理
if (result['threadsUnread'] == nil)
response = `curl -d "client_id=#{client_data['client_id']}&client_secret=#{client_data['client_secret']}&refresh_token=#{client_data['refresh']}&grant_type=refresh_token" https://accounts.google.com/o/oauth2/token`
result = JSON.load(response)
client_data['token'] = result['access_token']
open(client_info_json, 'w') do |io|
JSON.dump(client_data, io)
end
result = getToMeMailInfo(client_data['token'])
end
if (result['threadsUnread'] > 0 )
Slack.chat_postMessage(username: "個人宛確認bot", text: "ねぇどうして確認してくれないの?****宛のメールが#{result['threadsUnread']}件来てるよ?", channel: 'ルーム名')
end
{
"client_id":"クライアントID",
"client_secret":"クライアントSecret",
"token":"アクセストークン",
"refresh":"リフレッシュトークン"
}
後はcrontabやlaunchdなどでお好みの定時実行を設定すればでOK!!
↓こんな感じになります。