もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

勢いで作ったslackグループで書いていない人にメンション送るようにした。

先日作ったslackグループにどんどん人が入ってきてくれて、若干引いています。

それはそれとして、書いてない人にリマインド飛ばせるようにしたいなと思ったので、lambda + cloudwatchで定期的に通知飛ばせるようにしました。

SlackにRSS登録してその通知を受け取って、通知がきていない = 書いていない人とみなして連絡するようにしました。

この手法のデメリットは毎回RSSを登録してもらう必要があるんですよね。。。

書いたコードが実際に動くのが来週なので、もしかしたらバグってる可能性ありますが、一旦公開しておきます。

実際動いてバグってたら修正します。

# coding: UTF-8
import os
import sys
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'vendor'))

import urllib
import requests
import json
import datetime
import yaml


def getMessageApi():
    u"""
    Slackの特定チャンネルからメッセージを取得する 
    特定の投稿のみを抜き取るのが難しいので、1週間単位で取得するようにした
    @return array
    """
    config_data = getConfigData();
    latest      = datetime.datetime.now()
    oldest      = latest + datetime.timedelta(weeks=-1)
    params      = urllib.parse.urlencode({
        'token'   : config_data['slack_token'],
        'channel' : config_data['slack_get_message_channel_id'],
        'oldest'  : oldest.timestamp(),
        'latest'  : latest.timestamp(),
        'count'   : 1000
    })

    results  = []
    response = requests.get(config_data['slack_get_message_api_url'] + '?' + params).json()
    for message_data in response['messages']:
        if 'username' in message_data:
            results.append(message_data['username'])

    return results



def sendMessage(message_data):
    u"""
    Slackの特定チャンネルにメッセージを投稿する
    @param array message_data
    @return none
    """
    config_data = getConfigData();
    requests.post(config_data['slack_send_message_api_url'], data = json.dumps({
        'text'       : makeSendText(message_data),
        'channel'    : config_data['slack_send_message_channel_name'],
        'link_names' : 1
    }))



def makeSendText(message_data):
    u"""
    Slackへ送信するようのメッセージを作成する
    @param array message_data
    @return string
    """
    config_data  = getConfigData()
    target_users = []
    for config in config_data['mapping_table']:
        if not config['blog_name'] in message_data:
             target_users.append("<@" + config['user_name'] + ">さん")

    text_data = "<!channel>\n今週ブログを書けていないユーザーがいます!\n今週中に書けるようみんなで煽りましょう!\n書けていないユーザー\n================\n" + "\n".join(target_users)

    return text_data



def getConfigData():
    u"""
    コンフィグデータを取得する
    @return array
    """
    with open('./config.yml', 'r') as yml:
        config_data = yaml.load(yml)

    return config_data


def lambda_handler(event, context):
    message_data = getMessageApi()
    sendMessage(message_data)