2019/3/3

アレクサでTeamsに勤怠連絡をチャットするスキルを作った[Alexa Skill]


誰しも会社への勤怠連絡を、朝のあったかい布団の中から、さらに目をつむったままできたらいいと思うものです。この記事では社内チャットのTemasに勤怠連絡を投稿するスキルの作成方法を紹介します。

仕組み

システム構成

アレクサが休暇区分(全休/半休)と理由を取得し、Lambdaに渡します。 そして、Lambdaでチャットのメッセージを生成し、Microsoft TeamsのWebhookを用いて投稿します。 例えば、「アレクサ、勤怠連絡、お腹痛いから半休」のように言えば、下記のように勤怠連絡がチャンネルに投稿されます。

手順

  • Alexaスキルの作成
  • Microsoft Teamsのコネクタ(IncomingWebhook)の構成
  • Lambda関数の作成

Alexaスキルの作成

インテント

インテント(lambda_handler)には下記のように設定します。

{reason} で {type}  
{reason} なので {type}  
{reason} だから{type}  
{reason} くて {type}  
{reason} から {type} 

スロット

スロットを設定します。 今回は、休む理由を示すreasonと、休暇区分を示すtypeの2つを設定しました。

reason

 値 同義語   私用 しよう,使用,仕様,用事   体調不良 たいちょうふりょう,気分悪い,風邪,おなかいたい     

type

  値 同義語   全休 ぜんきゅう,全球   半休 はんきゅう,半球,阪急      

Microsoft Teamsのコネクタ(IncomingWebhook)の構成

投稿するチャンネルの設定から「コネクタ」を選択します。

「Incomming Webhook」の「追加」を選択します。

「インストール」を選択

名前を入力し、イメージ画像をアップロードします。

URLを控えておきます。

Lambda関数の作成

最後に、Teamsのwebhookにリクエストを送るLambda関数を作成します。

import json
from botocore.vendored import requests
from datetime import datetime,timedelta, timezone
JST = timezone(timedelta(hours=+9), 'JST')

def lambda_handler(event, context):
    print(event)
    try:
        reason = event['request']['intent']['slots']['reason']['resolutions']['resolutionsPerAuthority'][0]['values'][0]['value']['name']
        type = event['request']['intent']['slots']['type']['resolutions']['resolutionsPerAuthority'][0]['values'][0]['value']['name']
    except Exception as e:
        speech_output= '理由と休暇区分を言ってください。'
        end_session_bool = False
        response = build_response(build_speechlet_response(speech_output,end_session_bool))
        return response
        # TODO: write code...
    speech_output = reason+'のため'+type
    speech_output += '、と連絡しておきます。'
    date = datetime.now(JST).strftime("%Y/%m/%d(%a)")
    data = {
        "text": "本日、"+reason+"のため"+type+"とさせていただきます。<br>直前の連絡となり申し訳ございません。<br>ご迷惑をおかけいたしますが、よろしくお願いいたします。",
        "title": "【勤怠連絡】"+str(date)
    }
    headers = {'content-type': 'application/json'}
    url = '<Teams Webhook>'
    requests.post(url,data=json.dumps(data),headers=headers)
    end_session_bool = True
    response = build_response(build_speechlet_response(speech_output,end_session_bool))
    return response

def build_speechlet_response(output,end_session_bool):
    title = '勤怠連絡'

    return {
        'outputSpeech': {
            'type': 'SSML',
            'ssml': '<speak>'+output+'</speak>'
        },
        'card': {
            'type': 'Standard',
            "text": ""
        },
        'reprompt': {
            'outputSpeech': {
                'type': 'SSML',
                'text': title
            }
        },
        'shouldEndSession': end_session_bool
    }

def build_response(speechlet_response):
    return {
        'version': '1.0',
        'response': speechlet_response
    }

上記のコードには実装されていませんが、本来は休暇区分や理由を聞き取れなかったときの処理や、休暇区分のみの発話も対応できるようにするべきです。 この記事を参考にぜひ工夫したアレクサスキルを作成していただければと思います。