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


#初めに
メール確認が十分できているという方は問題ないので本記事は必要ありません。
それとGoogle Chromeにもいい拡張機能がたくさんありますので、そちらを検討する方がいいと思います。（実際に後悔しました。）

##対象
新卒。僕みたいにメールを確認できず、「え？何のこと？」となる人

##おことわり
* なぜSlack?
	* チーム内でSlackを使っている
	* チーム全員にメール確認を促す
	* 先輩にメールを見ていることをアピールする
* なぜGmailAPI?
	* 個人宛の未読、既読を使って何かしたかった
	* うちがGmailだから
* なぜruby?
	* 気分
	* まったく書いたことがないから

###参考にしてくださる際は
あらかじめ個人宛ラベルを設定しておいてください。

##Gmail API
###認証情報取得
まずは[Google API Console](https://console.developers.google.com/?hl=JA)へ入り、
プロジェクトを作成します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/78d6760a-9de9-87f4-3485-9f53c4f647aa.png" width="480px">


入ったらGmailAPIをクリックし、有効にします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/ecd8bd27-f42f-13b3-dc23-3e6416490abe.png" width="480px">

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/6ccd0d73-5413-8550-ca60-19b9ebdb2a29.png" width="480px">

サービス名を決めろと言われるので、OAuth同意画面で設定する。
その後適当にAndroidなどを選ぶと（ここでは適当にその他）作成できます。
下の画像が出てきたら成功です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/b6d6867a-de92-1602-b94b-3a4a952654cb.png" width="480px">

###Access Tokenの取得
<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/a0ad5e7a-2bbd-f2bd-8715-02388181452e.png" width="24px">を押します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/a928b7f8-a518-e5f3-efc3-27341e4e3749.png" width="480px">

DLしたファイルをclient_secret.jsonなどとしておき、保存します。

```
gem install google-api-client
```
をします。

[Ruby Quickstart](https://developers.google.com/gmail/api/quickstart/ruby?hl=ja)からソースコードを引っ張ってきて実行。（ソースファイルは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は設定しなくても問題ありません。）

```ruby: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を控えておきます。

```ruby: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!!
↓こんな感じになります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/d9862d87-e733-3a6a-c918-ee3a76bdc1a6.png" width="480px">


##参考
* [Google Gmail APIでメールを取得する](http://qiita.com/ryurock/items/4b063372ede81780c3c8)
* [Ruby Quickstart](https://developers.google.com/gmail/api/quickstart/ruby?hl=ja)
* [10分コーディング！　Rubyでつくる Slack時報](https://moneyforward.com/engineers_blog/2015/02/18/slack-timer/)