チャネルのすべての投稿にイイネするフロー

# はじめに
推しのあの子の投稿には一番にリアクションしたい！
上司氏の投稿にリアクションし忘れてると怒られる！

みなさんもそんなお困りごとありませんか？
今回はそんなお悩み事を解決するフローです！

https://x.com/ksgiksg/status/1767923816133791982

:::note alert
この記事はネタフローです。
お休みの日やオフラインのときにも機械的にリアクションされることで、自動化してることが発覚すると、怒られるのでやめときましょう。
:::

# フローの解説
先にフローの全体像を貼っておきます。（今回は短いです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/98fe49c8-9af8-f8d6-cac0-82141156cc2d.png)



## 使用するトリガー
新しくチャネルのメッセージが投稿されたときに起動できるトリガーには以下の4つがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/25ef40bd-bcca-d870-0e8c-345d864a3a62.png)

|No|トリガー|
|:---|:---|
|①|チャネルに新しいメッセージが追加されたとき|
|②|チャネルのメッセージで自分がメンションされているとき|
|③|キーワードが言及された場合|
|④|自分が @mentioned である場合|

このうち①はチャネルの**親投稿のみで動作する**ため、スレッドの返信としての投稿には使えません。

②,④は**自分がメンションされていないとトリガーされない**ため、すべての投稿を取得することはできません。

③は返信でもトリガーされますが、**指定した特定のキーワードが含まれていないとトリガーされない**ため、すべての投稿を取得することはできません。

…が、**キーワードを工夫することでチャネルのすべての投稿を取得することができます！**


## トリガーの設定
`キーワードが言及された場合`を追加し、投稿を取得したいチームとチャネルを指定します。
肝心の「検索キーワード」ですが、`"?"`と入力することでワイルドカードのような検索ができるのか、すべての投稿が取得できるようです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/57c18516-d5d5-0557-c591-bed1ff6131a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5669508f-07e4-dd49-e298-22c2eaaeeeb0.png)

## リアクションを付ける
リアクションを付けるには、TeamsのGraph API を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c855b003-9c39-1d00-90ef-16feedb7f7fb.png)

https://learn.microsoft.com/ja-jp/graph/api/chatmessage-setreaction?view=graph-rest-1.0

詳しいやり方は、ささみさんが解説してくれているのでそちらをご参照ください！

https://sasami-axis.hatenablog.com/entry/2024/03/13/201345

トリガーで取得した`teamId`,`channelId`,`messageId`を使用して、以下のように設定します。
（※動的なコンテンツを使用して設定しようとすると、`Apply to each` は自動的に挿入されます）

```powerfx:URI
https://graph.microsoft.com/v1.0/teams/@{items('Apply_to_each')?['teamId']}/channels/@{items('Apply_to_each')?['channelId']}/messages/@{items('Apply_to_each')?['messageId']}/setReaction
```

```json:本文
{
    "reactionType": "👍"
}
```

これだけでフローは完成です👍

# 適切なリアクションにしたい
どんな投稿でも👍してると、不適切な場面が出てくると思います。
「病気で休みます」とか「この資料まるでなってないけどどうなってますか？」とかに👍してると、顰蹙を買うこと間違いなしです。

ここは、流行りの生成AI の力を借りて適切なリアクションを設定してみましょう！

少しフローが複雑になり、全体像はこのようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/857a0f58-3bed-d9ed-887b-d3ede203d44f.png)


## 感情分析を追加
投稿の本文をAIにインプットし、ポジティブな投稿なのかネガティブな投稿なのか、感情分析を行います。

先に投稿本文を取得するために、１つアクションを追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e7fc0ec5-a88f-ca9e-c5ca-d616408bb64e.png)

親投稿の場合でも返信の場合でも、メッセージの詳細が取得できるように`Parent Message ID`に`replyToMessageId`を入れておくことがちょっとした注意点ですね。

取得した投稿本文をAI Builder を利用して、感情分析を行います。
Htmlタグを含むとノイズになるかな？と思い、PlainTextを使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/4a2f8164-5328-e180-e618-ca2bbd727222.png)

## 分析結果から適切なリアクションを設定
感情分析結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/79aac2b4-8b30-9808-2c3e-4ff01ee2bfe1.png)

細かい数値も出ますが、ここでは単純に`テキスト全体の感情`を使用しましょう。
この結果は「positive/neutral/negative」の３種類から出力されるようです。

https://learn.microsoft.com/ja-jp/ai-builder/flow-sentiment-analysis


出力結果を使って、事前に設定しておいた変数からリアクションを設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/2f38334e-5b85-66ff-f8cb-a8b0269b2f11.png)

```json:変数を初期化する
{
  "positive": "😍",
  "neutral": "😐",
  "negative": "😭"
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8ef087ff-d494-0587-f875-ef63a4635fce.png)

```powerfx:リアクション
variables('reaction')?[outputs('テキスト内の肯定的または否定的な感情を分析する')?['body/responsev2/predictionOutput/result/sentiment']]
```

もう少し簡単に、スイッチ分岐を使ってもいいかもしれないですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/bdedd484-f313-28da-a666-f23dc76656dc.png)


# おわりに
TeamsコネクタにGraph API が使用できるアクションが実装され、前からやりたかった(?)リアクションマシーンを実装することができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8abf04f3-2483-a6e3-6b2e-23948489e3c5.png)

チャットの投稿に対してはこのアクションでは`chats`に対応していないため、まだできませんが、今後も研鑽を積んでいきたいです(?)

Teams コネクタにはもともと多くのアクションがあったので、「これがないとできない！」という要求はあまり少ないかもしれません。

個人的には、**プライベートチャネル・共有チャネルの扱い**に対して可能性を感じているので、もう少し確認ができ次第、また何か記事を書こうと思います💪