LoginSignup
11
13

More than 5 years have passed since last update.

GmailAPI+Ruby+Slackでメール確認促しBOT!

Last updated at Posted at 2016-06-14

初めに

メール確認が十分できているという方は問題ないので本記事は必要ありません。
それと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は設定しなくても問題ありません。)

sample1.rb
#!/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を控えておきます。

sample2.rb
#!/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_info.json
{
"client_id":"クライアントID",
"client_secret":"クライアントSecret",
"token":"アクセストークン",
"refresh":"リフレッシュトークン"
}

後はcrontabやlaunchdなどでお好みの定時実行を設定すればでOK!!
↓こんな感じになります。

参考

11
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13