Microsoft Teams의 태만 관리bot

개시하다
회사의 상사가 부하의 생존을 확인하고 싶은 나이가 되었다.
재택근무도 늘고 상사가 눈을 감고 축구하는 느낌이 들겠죠.
역시'경기장에 올라갔는지 궁금하다'.
나는 비즈니스 메신저인 마이크로소프트 팀스로 부지런 관리bot을 만들어 보았다.
프로비저닝
부하들이 API를 자꾸 쓰려고 할 나이가 됐으니 누설하지 말고 AWS로 손쉽게 만들어주세요.

1. Teams의 Outgoing Webhook 설정
2. Lambda를 통해 정보를 받고 처리
3. DynamoDB에 출퇴근 시간과 이름 저장
4. Flash를 백엔드로 읽고 DynamoDB 데이터 표시
5. 상사가 인터넷에서 태만하게 관리할 수 있어 가볍다
이런 느낌. 1의 웹훅을 좋게 설정하면 슬랙이든 라인이든 모두 좋아하는 플랫폼에서 가능하다.
end2end는 이런 실수야.

단계 상세 정보
상술한 각 단계를 상세하게 발굴하다.
0. 사전 준비
API Gateway의 엔드포인트 URL 및 Lambda와의 연결에 대해서는 여기기쁜 소식를 참조하십시오.이 일대의 준비 작업이 숨을 내쉬는 것처럼 순조롭다면 매우 수월할 것이다.
DynamoDB는attendance-record의 이름으로 아래의 키 규격에 따라 제작되었습니다.
주 키워드:date(string)
정렬 키:name
1. Teams의 Outgoing Webhook 설정
Teams에서 수행한 작업입니다.

팀즈의 팀 화면에서는 ↑1의 세 사람이 함께'웹훅 제작 발송'을 했다.
그러면 웹 페이지를 보내는 제작 화면이 된다.

여기서 이름은 유지보수를 할 때의 이름입니다.위의 예에서'@kintai'로 멤버를 나타낸다.
에서 콜백 URL에 API Gateway의 끝점 URL을 지정합니다.
이 설정을 통해 @kintai로 보내면 API Gateway에서 누설할 수 있다.
2&3. Lambda를 통해 DynamoDB에 정보 저장
Teams가 보낸 내용을 API Gateway를 통해 람다에게 보냅니다.
이번에는 문자에'in'이 들어가면'출근','out'이 들어가면'퇴근'을 뜻한다.
lambda_function.py
import json
import datetime
import boto3
from boto3.dynamodb.conditions import Key, Attr

#-- get dynamodb object
dynamodb = boto3.resource('dynamodb')
table_name = "attendance-record"

def lambda_handler(event, context):

    #-- 0. check event(for debug)
    print(json.dumps(event))

    #-- 1. extract information
    timestamp=event['localTimestamp'] #2022-01-13T14:13:42.108816
    date_today=timestamp.split('T')[0] #2022-01-13
    time=timestamp.split('T')[-1].split('.')[0] #14:13:42
    name=event['from']['name']
    in_out=in_out.replace('kintai','') #[ハマった場所]

    #-- 2. attendance / leaving
    if 'in' in in_out:
        status='出勤'
        msg=msg_name+'今日も楽しんでいきましょう!'
    elif 'out' in in_out:
        status='退勤'
        msg=msg_name+'今日もおつかれさまでした。飲みすぎ注意!'
    else:
        return {
            'type': 'message',
            'text': 'ERROR! put [in] or [out] !'
        }

    #-- 3. item store to dynamodb
    dynamotable = dynamodb.Table(table_name)
    keydata={
        'date':date_today,
        'name':name
        }
    try:
        option = {
            'Key': keydata,
            'UpdateExpression': 'set #in_out=:in_out',
            'ExpressionAttributeNames': {
                '#in_out': status,
            },
            'ExpressionAttributeValues': {
                ':in_out': time,
            },
        }
        res=dynamotable.update_item(**option)
        print('Successed!')
    except Exception as e:
        print("Failed.")
        print(e)

    #-- 4. return
    return {
        'type': 'message',
        'text': msg
    }

받은 정보에 따라 다음 절차에 따라 람바다 처리를 진행한다.
1. 접수 시간, 성명, 정보 내용
2. 정보내용에 따라 가공
3. DynamoDB에 저장
1 에 푹 빠진 곳.
'@kintai'문자열에'in'을 넣었고, 2개 조건의 이견으로 출근 상태에만 들어갔다.이대로 가면 그는 일생을 근사축 지옥노로 살았기 때문에kintai의 글을 삭제했다.
3 의 업데이트item 정보
DynamoDB의 주 키워드에date를 지정하고, 정렬 키에name을 지정하며, 출퇴근이 P 키와 S 키와 일치하는 항목에 대해 업데이트item으로 각인하다.
더 예쁘게 쓰는 방법이 있을 거야...
람바다 끝.
4. 웹에 DynamoDB 데이터 표시(Flash)
웹은 DynamoDB의 데이터를 표시합니다.백엔드는 Flash입니다.
상사가 알면 돼, 책상 위에만 표시되는 초간단 구조야.
여러분들이 더욱 쉽게 이해할 수 있도록 저는'금일'과'이달의 전체'를 분리하여 표합니다.
app.py
from flask import Flask, render_template
import datetime
import boto3
import pandas as pd
import pytz
app = Flask(__name__)
jst = pytz.timezone('Asia/Tokyo')
table_name='attendance-record'

@app.route('/',methods=["GET","POST"])
def index():
    df_today, df_month=get_table_from_dynamodb(table_name)
    return render_template("/index.html",
                           date=df_today['date'].iat[0],
                           tables_today=df_today.to_html(classes='data', header="true",index=False),
                           tables_month=df_month.to_html(classes='data', header="true",index=False),
                           )

def get_table_from_dynamodb(table_name):
    today=jst.localize(datetime.datetime.today()).strftime('%Y-%m-%d')

    #-- dynamodb設定 & 全データ取り出し
    dynamodb = boto3.resource('dynamodb',region_name='ap-northeast-1')
    table = dynamodb.Table(table_name)
    response = table.scan()

    #-- db to df
    df = pd.json_normalize(response['Items']).fillna('-')
    df_today=df[df['date']==today]
    df_month=df[df['date'].str.contains(today[:7])] #2022-01

    #-- reindex column(today:出勤時間順, month:日付順にソート)
    df_today=df_today.reindex(columns=['date','name','出勤','退勤']).sort_values('出勤')
    df_month=df_month.reindex(columns=['date','name','出勤','退勤']).sort_values('date')

    return df_today,df_month

if __name__ == '__main__':
    app.run(debug=True)
DynamoDB->PandasData Frame이 할 수 있는 pd.json_normalize()
HTML Table에서 할 수 있는 df.to_html()
얼마나 편한데.많이 썼어요.
그리고 HTML의 첫 페이지 화면은 이런 느낌이다.설명 필요 없어. 간단해.
index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>attendance record</title>
    </head>
    <body>
        <h2>今日の日付 {{date}}</h2>
        {% for table in tables_today %}
        {{ table|safe }}
        {% endfor %}
        <h3>-- ↓今月の勤務実績↓ --</h3>
        {% for table in tables_month %}
        {{ table|safe }}
        {% endfor %}
    </body>
</html>
그리고 상사가 Flash 페이지를 확인합니다!
어디서나 볼 수 있도록 웹 서버를 디버깅하고 있습니다.
총결산
이번에 마이크로소프트 팀즈에 근태 메시지를 보내 웹에 뜨는'근태 관리 봇'을 제작했다.
API-Lambda-DB와 비교하면 이런 결과가 자주 나타난다구성으로 해봤어요.
봇이라고 하지만 정형문이라고 답해 개선이 필요하다.
상사의 피로를 줄일 수 있기를 바란다.

좋은 웹페이지 즐겨찾기