【PowerAutomate】とあるTwitterアカウントのSpacesの開始をGmailで通知するクラウド フロー

# 概要
先日 IFTTTによる、Space開始をGmailで通知するアプレットの作成を行った。

https://qiita.com/libraplanet/items/940dddc2ce8372dff180

しかし、思いの他レスポンスが遅く。
20時40分ごろに開始されたSpacesに対して、21時17分ごろに通知メールで飛んできた。
30以上遅れての通知で遅いなぁ、、、。

というわけで。今度は ``Microsoft PowerAutomate`` で同様のことをしてみた。

# ``Microsoft PowerAutomate`` 
## 特徴
* 条件分岐ができる。
* 1つのトリガーに複数の処理を作ることができる。
* Gmailで任意のアドレスにメール送信ができる。
* 複数のTwitterと連携ができる。
* 複数のGoogleアカウントと連携ができる。
* ~~``.NET Passport``~~  ``Microsoftアカウント`` で一応それなりに無料で使えるっぽい。
* UIが日本語 (江戸っ子にはありがたい)

## 結論
* Twitterの検索は1時間周期。
* メールの本文を自分で作るのは柔軟性がある反面、テンプレートがザコなので面倒くさい。
* ツイートで@マークつきの投稿が出来ない (発言元のアカウントへリンクできない)。
* 複数アカウント使えるのは便利。 ⇒ 検索垢と投稿垢を分けられる、など。
* 無料でここまでできるのは、正直ありがたい。
* しかし、``Power Automate Desktop`` (≒ RPA) の情報に掻き消されて、 ``Power Automate`` の 有償/無償 とで ``クラウド フロー``` にどう差が出るのかわからない。


## フローの作成
### ⓪ サマリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/2d22579a-c7ac-68e8-cfe4-5f49e7c2a7ad.png)

### ① トリガー
* 条件
   * ``-from@myaccount`` : 自分のアカウントを ``-`` で指定して、自分を除外する。
   * ``lang:ja`` : 日本語に絞る
   * ``filter:spaces`` : スペースの投稿に絞る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/98fe6362-9440-55d2-38f5-d8fccb677c79.png)

```text:検索テキスト
-from:@myaccount lang:ja filter:spaces
```
検索条件の応用で、色々と活用ができる。

### ② アクション
#### ① Gmailを送信する。
自分自身のアドレスをベタに指定するので良いと思うけど。``+`` でGmailのサブ アドレス機能を使えば、フィルタリングは楽かと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/d0394783-f936-e1ce-1938-076f803704b7.png)

```text:件名&#x20;(サンプル)
【Twitter Space Notif】@{triggerOutputs()?['body/UserDetails/FullName']} ( @{concat('@', triggerOutputs()?['body/TweetedBy'])} )   @{triggerOutputs()?['body/TweetText']}
```

```text:ボディ&#x20;(サンプル)

<p>
@{triggerOutputs()?['body/UserDetails/FullName']} ( <a href="@{concat('https://twitter.com/', triggerOutputs()?['body/TweetedBy'])}"> @{concat('@', triggerOutputs()?['body/TweetedBy'])} </a>)<br>
<img src="@{triggerOutputs()?['body/UserDetails/ProfileImageUrl']}" alt="@{triggerOutputs()?['body/TweetId']}"><br>
@{triggerOutputs()?['body/CreatedAtIso']}
</p>
<p>
@{triggerOutputs()?['body/TweetText']}
</p>
<p>&nbsp;</p>
<p>@{concat('https://twitter.com/', triggerOutputs()?['body/TweetedBy'], '/status/', triggerOutputs()?['body/TweetId'])}</p>
<p>&nbsp;</p>
<p>powerd by microsoft powerautomate.</p>
```
#### ② ツイートする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/42d3887e-638b-6955-d13d-d91286895fed.png)

```text:ツイートの投稿&#x20;(サンプル)
started spaces by @{triggerOutputs()?['body/UserDetails/FullName']} ( @{concat('@', triggerOutputs()?['body/TweetedBy'])} ) .
@{triggerOutputs()?['body/CreatedAtIso']}
@{triggerOutputs()?['body/TweetText']}
```

## 補足
### 属性と関数
#### Twitterの属性
多いんだけど分かりづらい。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/cbbe44ba-0bbc-4c89-0daa-71d0d183654b.png)

一応以下の6項目がわかれば十分かと。

|項目|説明|(補足)|
|:-----|:-----|:-----|
|ユーザー名|ユーザーのスクリーン ネーム|(ツイートのTwitterアカウント)|
|名前|ユーザーの名前|(ツイートのアカウントのプロフィールの名前)|
|プロフィール画像URL|プロフィール画像URL|(ツイートのアカウントのプロフィールのアイコン画像)|
|作成日時|ツイートが投稿された時刻|(ツイートの投稿日時)|
|ツイート ID|ツイートのID|(ツイートのID)|
|ツイート テキスト|ツイートのテキスト コンテンツ|(ツイートの本文)|

※中には反復処理が必要な属性があるため、選ぶとフローが変わってしまうので注意が必要。

### 関数を用いて情報を作る
#### アカウント名に@をつける
``ユーザー名`` には ``@`` がついていないため、``concat`` 関数を使って文字列を結合する。

```text:式
concat('@', triggerOutputs()?['body/TweetedBy'])
```

#### ツイート ユーザーのURL
メールにツイートのアカウント元を乗せる際に、ハイパーリンクもつけたいので、``concat`` 関数を使ってURLを作成する。

```text:式
concat('https://twitter.com/', triggerOutputs()?['body/TweetedBy'])
```

#### ツイートのURL
``ツイート ID`` もID部分しか無いので、``concat`` 関数を使ってURLを作成する。

```text:式
concat('https://twitter.com/', triggerOutputs()?['body/TweetedBy'], '/status/', triggerOutputs()?['body/TweetId'])
```

### 投稿日時のタイムゾーンの変更

``UTC+0`` から ``UTC+9`` ( ``UTC`` から  ``Tokyo Standard Time`` )
`に変更する必要がある。

```text:式
convertTimeZone(triggerOutputs()?['body/CreatedAtIso'], 'UTC', 'Tokyo Standard Time', 'yyyy/MM/dd(ddd) HH:mm:ss')
```

```test:出力例
2021/08/28(Sat) 02:19:47
```

* 式関数のリァレンス ガイド - Azure Logic Apps | Microsoft Docs
  https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#convertTimeZone

* カスタム日時形式文字列 | Microsoft Docs
  https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings


* Time Zone IDs (Compact 2013) | Microsoft Docs
  https://docs.microsoft.com/en-us/previous-versions/windows/embedded/gg154758(v=winembedded.80)?redirectedfrom=MSDN

カルチャの指定の仕方がわからん。。。


### 複数のアカウントでの運用
#### 切り替え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/fd70ff09-7990-1e19-ce1a-5c9b562b5477.png)

#### 紐付いているアカウントの管理・確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/18781c28-ff8e-9962-babb-cfcf995300ad.png)


# 結果
## メール
テストで検索条件を雑にしてたら、メールが大変なことに。。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/e3d8435e-d4c6-c26a-264d-391503fc9b4e.png)


## ツイート
ツイートもされまくって、削除をするのが大変だった。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/0d1257fa-34b2-fd1f-49cf-38647125992c.png)
※ ツイートにはアカウントの ``@`` がうまく乗せられないので試行錯誤中

## 実行履歴
細かい実行履歴が結構良い感じ。ツイートしすぎて、投稿の失敗も一応あった。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/aa7d701a-8c37-208a-65a1-b14f028e5995.png)



# まとめ
ツイートの検索が1時間周期のため、思ったよりも差を埋めることが出来なかった。しかし、セール情報のツイートなど、緊急度がそこまで高く無い内容であれば、全然有用に思える。IFTTTよりも無料の幅が広く、柔軟性もありそうなので。 ~~``.NET Passport``~~  ``Microsoftアカウント`` を持っているのなら、結構活用してみても良さそうに思う。

なにより、日本で使えるしね！

しかし、こういうサービスでSpacesの開始の検出は、流石に限界あるのかなぁ。。。

#謝辞
* Microsoft Powerautomate  
  https://flow.microsoft.com/