【 Qiita x Teams 】社内メンバーがQiitaに投稿をすると、Teamsに通知を送る仕組みを作ってみた！

# はじめに

[【 Qiita x Slack 】社内メンバーがQiitaに投稿をすると、Slackに通知を送る仕組みを作ってみた！](https://qiita.com/Futo_Horio/items/6eff81da9d85acbcaecf)
この記事に触発されて作ってみた。
（実は社内から相談がありました）

# やったこと

PowerAutomateで1時間ごとにQiitaのOrganizationページからフィード（Atom）を取得し、
前回取得以降に投稿された記事があればその情報をTeamsに通知する。

ほとんど隠れてるけどこんな感じ。
![teams.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/b503d4cf-24d9-b5af-22d2-b70e0e9b5d86.png)


# 経緯

社内のコミュニケーションツールとしてMicrosoft Teamsを、ワークフローやデータの管理基盤としてkintoneを活用しています。
これらを活用した1つとして、kintoneに社内ナレッジを蓄積するためのアプリを作成し、新規投稿があったらTeamsに通知するという仕組みを作っています。

この運用も軌道に乗り、社内ナレッジも溜まってはきましたが。。。
技術系のナレッジはQiitaに投稿！という流れも。

そこで、Qiitaに投稿した内容もTeamsに通知したらいいんじゃない？
という社内からの提案が！

確かにその通り。
技術系情報はどんどんQiitaで発信！
でも社内のメンバーがその発信がされたことを気がつかないのは悲しい。
だって、技術情報書くのって、仕事通じて詰まった/困ったを解決したんだって時もあるもの。

そんなわけで、**Qiita x Teams**いってみよう！

# ざっくり流れ

[【 Qiita x Slack 】社内メンバーがQiitaに投稿をすると、Slackに通知を送る仕組みを作ってみた！](https://qiita.com/Futo_Horio/items/6eff81da9d85acbcaecf)
によると、QiitaはRSSじゃなくてAtomが仕込まれてるそうなので、
OrganizationのページでAtomあるかなチェック！

https://qiita.com/organizations/kdl/activities.atom

あった！！！

正しくは、[Organizationの「最近の投稿」にRSSフィードを設置しました](https://blog.qiita.com/165064370664-2/)って記事を教えてもらった。

あとはPowerAutomateでこのフィードを取得してTeamsにポイッ


# 詳しく

## フィードのありかを探る
[Organizationの「最近の投稿」にRSSフィードを設置しました](https://blog.qiita.com/165064370664-2/)
というオフィシャルブログ記事より、フィードのありかを突き止める
https://qiita.com/organizations/[organizationId]/activities.atom

## Teamsに発信する方法を決める
Teamsへの発信にはいくつかの方法がありますが、ざっくりとこの2つ。

1. botにする
2. Incoming Webhookを使う

botにするには、色々と面倒だからあんまりやりたくない。
PowerAutomateのTeams用コネクタを使えば楽々実装できますが、発信者がflowアプリか作者自身か・・・となるのでなんかイケてない。

ということで、既存のkintoneからの連携でも使っているWebhookをこちらでも使うことにします。

## 実行環境を決める〜フィードを取得する

元の記事に倣ってGASでやるのも手だけれど、めんどくさいw
もっと手軽に作れて、しかも定期実行ができるもの・・・PowerAutomateがあるじゃん！

PowerAutomateで~~XMLのパーサーあったのでそちらでやってみる~~RSSフィード用のコネクタ使えばめっちゃ簡単。

![スクリーンショット 2020-05-01 13.18.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/160ab1e3-bdcf-b0ce-a967-5a6d5477683e.png)

これだけで1時間おきにフィードを取得してくれます。

## 追加された記事だけを抽出する

これも~~触発された~~相談された[元の記事](https://qiita.com/Futo_Horio/items/6eff81da9d85acbcaecf)を参考にして、現在時刻の1時間前以降に投稿されたものをピックアップ。

こんな感じで1時間前を定義しておいて
![スクリーンショット 2020-05-01 18.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/cc2d6d54-ba8a-bc2e-2672-959bac0a0e7b.png)

フィードの公開日時と比較。
![スクリーンショット 2020-05-01 18.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/44c2d293-dbbc-1557-67db-80fd7d092d6b.png)

これをフィード全体に対して繰り返し適用していけば、通知を発信する対象の記事が抽出できます。

**2020/05/01 21:40頃追記**
RSSフィードのコネクタで取得した`publishDate`をそのまま取得してみると末尾に「Z」ってついてるからUTCかと思いきや、JST。。。でした。
そのため、無理やりタイムゾーン変換してやります。

```
ticks(convertToUtc(substring(items('Apply_to_each')['publishDate'],0,sub(length(items('Apply_to_each')['publishDate']),1)),'Tokyo Standard Time'))
```
かなり無理やり。
最後の「Z」を削っておかないとUTCだろって判断されてしまい、タイムゾーン変換できません。
Zを削ってタイムゾーンを曖昧状態にして、これは「JST」だぞ、UTCに変換してくれよ。と書いてやるとうまいこといきます。

**2022/01/29 20:20頃追記**
いつの間にやら正しくUTCで出力されるようになっていました。
そのため、上記無理やり変換を入れていると逆に正しく時間判定されず、永遠に通知が飛ばない状態になります。
2021/08頃に改修されていた可能性あり。。。ずっと連携されていなかった。。
誰も（自分も）Qiitaに記事書いてないんやなと思っていた。

## Teamsへ通知する

いよいよ、Teamsへ通知します。
Incoming Webhookで通知することにしたので、PowerAutomateのHTTPコネクタを使って・・・
![スクリーンショット 2020-05-01 18.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/a2641e23-d15a-3f7b-6523-2382abeec2c7.png)
`PREMIUM`限定・・・ダメだ。そんな高級品使えない。

別の施策を考えねば。
エンジニアたるもの、諦めたら終わり！

ということで、無いなら（使えないなら）作ればいいじゃない（笑

### カスタムコネクタを作ります

PowerAutomateのメニュー画面で、左側にある「データ」の「カスタムコネクタ」をクリック。
![スクリーンショット 2020-05-01 18.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/18b5f91c-c373-c887-1634-c640dd0c1bea.png)

新規作成します。

![スクリーンショット 2020-05-01 18.44.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/d3cd5e54-6ccc-8095-8939-7a7c30886d0e.png)
こんな感じでTeamsのIncoming WebhookのベースURLを設定します。
アイコンや説明も適当に設定してこの画面はおしまい。

単なるWebhookなので「セキュリティ」の設定は空っぽで、ここからコネクタ本体の定義〜
![スクリーンショット 2020-05-01 18.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/caa9920a-1819-83aa-e237-3b2466354854.png)
適当に埋めます。
`概要`の中身がPowerAutomateで見える名前になるので、簡潔にわかりやすい名前にしましょう。
ここまできたらもう一歩。
要求エリアの`サンプルからインポート`をポチっ！
![スクリーンショット 2020-05-01 19.01.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/00d8af4f-8d3c-1514-bf40-5b9783c3303e.png)
メソッドは`POST`、
URLは`TeamsのIncoming WebhookのURL`、
ヘッダーは空、
本文は

```
{
  "title": "タイトル",
  "text": "本文"
}
```
な感じで送りたい形式に合わせて入力して`インポート`を実行。
すると、完成！
これで保存すればTeamsのIncoming Webhookに送信するコネクタができました。

## カスタムコネクタでTeamsへ通知する

カスタムコネクタができたのでPowerAutomateに組み込みます。
![スクリーンショット 2020-05-01 19.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/7de93c02-d0ab-fcdb-e932-ea556e201a43.png)

カスタムコネクタのタブに先ほど作ったコネクタが追加されているので、これを選択するとアクションにこれまた先ほど作った`Teams's Incoming Webhook`が表示されるのでこいつを選択します。
![スクリーンショット 2020-05-01 19.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/59ce863c-cbd2-30fc-8fab-b9284eec7053.png)
あとはこんな感じでタイトルと本文を組み立てればPowerAutomateの設定も完了。

# 成果物
PowerAutomateの全体像を残しておきます。
これで1時間おきにQiitaのOrganizationのatomフィードをクロールして、新規投稿があればTeamsお知らせしてくれるようになりました。
めでたしめでたしー
![スクリーンショット 2020-05-01 19.16.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/3921a1dc-4444-3aa3-6148-e962cc58ba63.png)