HOME > 技術レポート > IoT > RaspberryPiを利用した勤怠打刻システムからSlackへのリアルタイム通知

2019年8月20日

RaspberryPiを利用した勤怠打刻システムからSlackへのリアルタイム通知

RaspberryPiを利用した勤怠打刻システムからSlackへのリアルタイム通知方法を説明する。

1.概要

RaspberryPiを利用した勤怠打刻システムを開発し、ICカードタッチした際にSlackへリアルタイム通知を行う仕組みをAWSを利用して実装した。
その仕組みおよび実装内容を記載する。

2.システム構成

RaspberryPiに電源投入すると、自動起動で打刻用プログラムが起動する。
「出勤」もしくは「退勤」ボタンをタッチパネルで選択し、ICカードをタッチする事で打刻が完了する。
ICカード情報(IDm)からユーザを特定し、勤怠打刻ファイルに追記した後にAWS(API Gateway)にWebAPIリクエストする事で、
Lambdaが起動しリアルタイムにSlackに通知する。
1.jpg

3.打刻用画面(タッチパネル)

2.jpg

4.Slack側設定

Slackにアプリケーション追加

Slackに対してアプリケーションを追加する。「Create New App」を押下する。
App Nameに適当なアプリケーション名を設定し、Development Slack Workspaceにインストール先のワークスペースを選択する。

3.jpg


Bot User設定

Bot User設定で、「Add a Bot User」ボタンを押下し以下のように設定する。

4.jpg


Installed App

「Installed App」で「Install App to Workspace」ボタンを押下する。

5.AWS Lambda設定

ソースコード

サービスからLambdaの関数を選択し作成する。ソースコードは以下の通り。

【ソースコード】
import json
import os
import urllib.request

def lambda_handler(event, context):

  _Postchannel="XXXXXXXXXX"

  #
  # 入力チェック処理(省略)
  #

  post_message_to_channel(_Postchannel, event.get("data"))

  return "OK"

def post_message_to_channel(channel, message):
  url = "https://slack.com/api/chat.postMessage"
  headers = {
   "Content-Type": "application/json; charset=UTF-8",
   "Authorization": "Bearer {0}".format(os.environ["SLACK_BOT_USER_ACCESS_TOKEN"])
  }
  data = {
   "token": os.environ["SLACK_BOT_VERIFY_TOKEN"],
   "channel": channel,
   "text": message,
  }

  req = urllib.request.Request(url, data=json.dumps(data).encode("utf-8"), method="POST", headers=headers)

  try:
   with urllib.request.urlopen(req) as res:
    body = res.read()
  except urllib.error.HTTPError as err:
   print(err.code)
   return "NG"
  except urllib.error.URLError as err:
   print(err.reason)
   return "NG"


Lambdaの環境変数設定

Lambdaの環境変数として以下を設定する。
SLACK_BOT_USER_ACCESS_TOKEN=SlackのBot User OAuth Access Tokenの値
SLACK_BOT_VERIFY_TOKEN =SlackのVerification Tokenの値

5.jpg

6.AWS API Gateway設定

Lambdaの設定としてAPI Gatewayをトリガーとして追加する。
メソッドをPOSTのみ可能とし、不要なメソッド(ANY等)は削除しておく。
APIをprod環境にデプロイする。
APIエンドポイントが打刻機からPOSTするURLとなる。

6.jpg

7.打刻機からAPI Gatewayに対してPOSTできるように実装

打刻機から、以下のリクエストができるようにプログラムを実装。

curl -X POST -H "Content-Type: application/json" -d '{"channel":"XXXXXXXX","data":"a_tarou, Leaving, 2019-6-17 21:13:24"}' https://XXXXXXXXXXXXXXXXXXX.amazonaws.com/prod/timerec

 ※POSTでJSONデータを送付している
 ※POSTするデータはファイル追記するデータと同一

8.動作確認(Slack側への通知)

打刻機にICカードをかざすと以下のような形式でSlackにリアルタイム通知される。

7.jpg