MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Azure Functions+Power Automateで、ローコーディングにMicrosoft TeamsとLINEでチャットしてみた

はじめに

5/28に行われたLINE Developer Communityのイベントで登壇された ひらりんさんの発表内容に感銘をうけ、もうすこしローコーディング寄りに、かつオペレータサイドのチャットインターフェースを作らずに済む方法はないかと考えたのが、今回の投稿のきっかけです。

ひらりんさんが登壇された際の補足ブログは下記を参照してください。 himanago.hatenablog.com

タイトルにもあるとおり、非常に簡単なAzure Functionsを1つと、Power Automateのフローを1つ用意するだけで、Microsoft TeamsとLINE間でリアルタイムのチャットコミュニケーションを実現できました。

f:id:mofumofu_dance:20200610153722p:plain
LINE→Teamsへのメッセージ送信概要

f:id:mofumofu_dance:20200610153824p:plain
Teams→LINEへのメッセージ送信概要

実際には、もう少し、オリジナルに近づけたかったので、自動応答モードを用意してあって、LINE側からの問い合わせに対して、Azure のサービスであるQnA Makerを用いて自動返信していますが、今回は省略します。

※自動返信がなければFunction 1つでも実現できるかと思います。

f:id:mofumofu_dance:20200610154301p:plain
QnA Makerでの自動返信時

LINE→Teamsへのメッセージ

2つのチャットは、2種類のBotを介してメッセージが受け渡されます。 LINE側はLINE botとして、Teams側からのメッセージが表示され、Teams側ではTeams botとして、LINEからのメッセージが表示されます。

LINE→Teamsでは、Power Automate を経由しています。QnA Maker部分を除けば非常にシンプルで、下図のようになります。

f:id:mofumofu_dance:20200610155426p:plain

トリガーには「HTTP要求の受信時」を選びます。このURLがLINE botのWebhook URLになります。

Webhookを受信したらひとまず200を返しておきます。

最後に、Teamsにメッセージを届けるために、Teams の Incoming Webhook を利用します。

たぶんここはそれほど迷わないかと。

Teams→LINEへのメッセージ

ここは TeamsのOutgoing Webhook を利用するのですが、同じようにPower AutomateのHTTP要求受信トリガーで処理しようとしたところ、何度やっても f:id:mofumofu_dance:20200610160833p:plain こんな感じで、そもそもAutomate側が一切反応していませんでした。。。残念。理由の解明はとりあえずおいておいて、別の方法を模索します。

悩んでいると素晴らしいブログを発見!!

takeru0620.hatenablog.com

これで丸パクリ 参考にすれば、LINEにもメッセージが送れそうです!

ということで、さっそくAzure FunctionsをPowershell Coreで作っていきます。

FunctionのトリガーはHTTPとします。Outgoing webhookでこのFunctionのURLにPOSTでデータが飛んできたときに反応するようにしています。

f:id:mofumofu_dance:20200610161506p:plain

書いたコード (run.ps1)は以下の通りです。

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# TeamsでBotにメンションしたメッセージをそのままLINEに送信するパート

# Botにメンションすることで送信Webhookが機能するので、メンション部分をreplaceで取り除いたものを
$text = $Request.Body.text -replace "<at>Outgoing用Teams bot名</at>", ""
$text = $text -replace "&nbsp;" , ""
# 最後に不要な改行が含まれるので、削除
$text = $text.Remove($text.length-1,1)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."
# LINE messaging API のPushメッセージのURI
$URI ="https://api.line.me/v2/bot/message/push"

# Pushメッセージ用にJSONオブジェクトを定義 (ConvertTo-Jsonまで)
$tmp = @{
  to="送信対象のLINE User ID";
  messages=@(
    @{
      type="text";
      text=$text;
    }
  )
}
$body2 = $tmp|ConvertTo-Json

#Authorization headerを設定。ここでLINE Messaging APIのチャンネルアクセストークンを設定する
$auth = @{
    'Authorization' = "Bearer ここにトークン" 
    }
Invoke-RestMethod -uri $URI -Method Post -body $body2 -ContentType 'application/json;charset=utf-8' -Headers $auth



# Teamsへの受け答え。これはbodyを入れないとエラーになる
$body = @{
    type="message";
    text = "Sent message";
    }

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body |ConvertTo-Json
})

とっても簡単、ローコードな感じです。

実際の動作はTwitterに投稿したものをご覧ください。

おわり

すごく簡単に、Azure Functions で1個 Functionを作って、Power Automateで1個Flowを作るだけで、異なるチャット(機能)がつながれました! 感動!

冒頭にも書きましたが、実際には、SharePoint上で、自動応答かマニュアル応答かを判別していて、自動の場合には間髪入れずにQnA Makerが反応してくれて、マニュアルの場合にはリアルな人-人のコミュニケーションが、片やTeams、片やLINEで行われます。

このように、Azure+Power Platformのローコード・サーバーレスな簡単な仕組みでいろんなことが実現できますので、皆様もぜひ試してみてください。