1.はじめに
今回は、X APIの応答結果に含まれる取得した最新のツイートIDをリストに記憶しておく処理を加えます。
次のフロー実行時にはこのIDより新しいツイートを取得するように指定すると、重複したツイートが表示されなくなります。
2.最新のツイート日時
取得したデータの中で、最新のツイート日時を格納するための変数を追加します。
2.1.アクションの追加
フローの上部にある「最近のツイート一覧データ」アクションの下の+をクリックして、「アクションの追加」を選択します。
2.2.アクションの選択
「変数(Variable)」の中から「変数を初期化する」を選択します。
2.3.アクション設定
(1)アクションの名前を「最新のツイート日時」に変更します。
(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。
▼パラメーター
名前 | 設定する値 |
---|---|
Name | varRecentTweetDate |
Type | String |
Value |
※Valueは空欄とします。
3.前回の続きから取得?
過去に取得したツイートの一番新しいIDとその日時が保存されていることと、その日時が7 日以内かをチェックします。
3.1.アクションの追加
「巡回リストを分解」の中の+をクリックして、「アクションの追加」を選択します。
(「最近のツイート一覧を取得」の前に追加します。)
3.2.アクションの選択
「Control」の中から「条件」を選択します。
3.3.アクション設定
(1)アクションの名前を「前回の続きから取得?」に変更します。
(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。
▼パラメーター
Condition Expression
OR | |||
@{empty(items('巡回リストを分解')?['newest_id'])} | is equal to | @true | |
@{empty(items('巡回リストを分解')?['newest_time'])} | is equal to | @true | |
@items('巡回リストを分解')?['newest_time'] | is less or equal to | @addDays(utcNow(), -7) |
※2行目以降の設定は、以下のように「New item」から「行の追加」(もしくは「(Add row)」)を行って入力します。
4.前回のツイートIDを指定するクエリを作成
前回までに取得したツイートIDを指定するクエリ文字列を作成します。
4.1.アクションの追加
「前回の続きから取得?」アクション内の「False」内の+をクリックして、「アクションの追加」を選択します。
4.2.アクションの選択
「Data Operation」の中から「作成」を選択します。
4.3.アクション設定
(1)アクションの名前を「前回のツイートIDを指定するクエリを作成」に変更します。
(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。
▼パラメーター
名前 | 設定する値 |
---|---|
入力 | &since_id=@{items('巡回リストを分解')?['newest_id']} |
5.「最近のツイート一覧を取得」のパラメーター変更
「6.(2)ツイート一覧の取得」で作成した「6.最近のツイート一覧を取得」アクションのパラメーターを変更します。
使用しているX API(GET /2/tweets/search/recent)呼び出し時にsince_idクエリ文字列を追加します。
5.1.アクションの選択
「前回の続きから取得?」アクションの枠内の下の「最近のツイート一覧を取得」をクリックして、アクションの設定画面を開きます。
5.2.アクション設定
(1)「▼URIの値」に従って、「パラメーター」タブから以下の赤枠のURIの値を変更します。 ※変更すると紫の「出力」が追加されます。
▼URIの値
URIを以下のように変更します。
(赤字部分を追加します。)
@{variables('varXApi')?['endpointUrl']}/2/tweets/search/recent?max_results=@{variables('varXApi')?['maxResults']}&sort_order=recency&query=@{uriComponent(item()['query'])}&expansions=@{variables('varXApi')?['expantions']}&media.fields=@{variables('varXApi')?['mediaFields']}&tweet.fields=@{variables('varXApi')?['tweetFields']}&user.fields=@{variables('varXApi')?['userFields']}@{outputs('前回のツイートIDを指定するクエリを作成')}
6.最新のツイートID?
Teamsに投稿したツイートのIDが、最も新しいIDかどうかをチェックします。
6.1.アクションの追加
「Teamsにツイートメッセージを投稿」の下の+をクリックして、「アクションの追加」を選択します。
(「最近のツイートデータを分解」のループの中に追加します。)
6.2.アクションの選択
「Control」の中から「条件」を選択します。
6.3.アクション設定
(1)アクションの名前を「最新のツイートID?」に変更します。
(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。
▼パラメーター
Condition Expression
AND | |||
@body('最近のツイート一覧を取得')?['meta']?['newest_id'] | is equal to | @items('最近のツイートデータを分解')?['id'] |
7.最新のツイート日時を設定
最も新しいツイートIDが作成された日時を変数に格納します。
7.1.アクションの追加
「最新のツイートID?」アクション内の「True」内の+をクリックして、「アクションの追加」を選択します。
7.2.アクションの選択
「Variable」の中から「変数の設定」を選択します。
7.3.アクション設定
(1)アクションの名前を「最新のツイート日時を設定」に変更します。
(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。
▼パラメーター
名前 | 設定する値 |
---|---|
Name | varRecentTweetDate |
Value | @{items('最近のツイートデータを分解')?['created_at']} |
※varRecentTweetDataという変数もありますので間違えないようにしてください。
8.結果データが存在?
ツイートデータが存在しなかったときにリストを更新すると意図しないデータが反映されてしまいます。
X APIを呼び出した結果、ツイートデータが存在したかどうかをチェックします。
8.1.アクションの追加
「最近のツイートデータを分解」ループの外の+をクリックして、「アクションの追加」を選択します。
(「巡回リストを分解」ループの中の最後に追加します。)
8.2.アクションの選択
「Control」の中から「条件」を選択します。
8.3.アクション設定
(1)アクションの名前を「結果データが存在?」に変更します。
(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。
▼パラメーター
Condition Expression
AND | |||
@body('最近のツイート一覧を取得')?['meta']?['result_count'] | is not equal to | 0 |
※「is equal to」ではないのでご注意ください。
9.巡回リストの最新ツイートIDと日時を更新
巡回リストの最新ツイートIDと日時を更新します。
9.1.アクションの追加
「結果データが存在?」アクション内の「True」内の+をクリックして、「アクションの追加」を選択します。
9.2.アクションの選択
「SharePoint」の中から「項目の更新」を選択します。
9.3.アクション設定
(1)アクションの名前を「巡回リストの最新ツイートIDと日時を更新」に変更します。
(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。
▼パラメーター
名前 | 設定する値 |
---|---|
サイトのアドレス※1 | @variables('varLists')?['sharepointUrl'] |
リスト名※1 | @variables('varLists')?['listsId'] |
ID | @item()?['ID'] |
項目 | { "newest_id": "@body('最近のツイート一覧を取得')?['meta']?['newest_id']", "newest_time": "@variables('varRecentTweetDate')" } |
詳細パラメーター※2 |
※1 「サイトのアドレス」と「リスト名」は、どちらも「カスタム値の入力」を選択して、式を入力します。
※2 「詳細パラメーター」は何も選択しません。
10.「トリガーの設定」の変更
今回の実装によって、フローが繰り返し実行されても続きのツイートから処理されるようになります。フローの最初に作成したトリガーの設定を変更して、短い間隔でツイートを取得するようにします。
10.1.アクションの選択
フローの先頭の「繰り返し」をクリックして、アクションの設定画面を開きます。
10.1.アクションの設定
(1)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠の「Interval」の値を変更します。(「Frequency」が「時間」ではない場合にはそちらも変更してください。)
▼パラメーター
名前 | 設定する値 |
---|---|
Interval | 4 |
Frequency | 時間 |
Time Zone | (UTC +09:00)大阪、札幌、東京 |
Start Time | 設定しない |
11.動作確認
フローを保存して、巡回リストのnewest_idとnewest_timeが更新されることを確認します。
11.1.フローの保存、テストの実行
画面上部の「保存」をクリックして、フローの作成状態を保存します。
その後、以前の記事と同様に、「テスト」を実施します。
11.2.テスト結果の確認
上部に「ご利用のフローが正常に実行されました。」と表示され、すべてのアクションに緑色のチェックが表示されていることを確認します。
11.3 巡回リストの確認
Listsの巡回リストのnewest_idとnewest_timeに値が設定されていることを確認します。
※過去7日間にツイートが存在しない場合には値が設定されません。
11.4. 新着ツイートのみ投稿されることの確認
ある程度時間が経ってから再度フローのテストを実施して、Teamsのチャネルに前回実施したとき以降の新着メッセージが投稿されることを確認します。
ただし、新着が存在しない場合や、投稿されたツイートが新着かどうか判断がつかない場合があるかもしれません。その場合にはこの確認はスキップして問題ありません。
12.補足
▼最新のツイート日時を保存する理由
最新のツイートを取得するX API(GET /2/tweets/search/recent)は、クエリ文字列として渡すsince_idが7日より前のツイートidの場合にはエラーになります。
7日以上フローを実行しないとそのエラーが発生してしまうため、since_idのツイートが作成された日時も「最新のツイート日時」変数(varRecentTweetDate)に保持しています。
その変数は次項で説明する条件アクションで、X API呼び出し時にsince_idを指定するかどうかを判断します。
※since_idはListsの巡回リストではnewest_idとして格納しています。
例えば、7日以前のidを指定すると以下のようなエラーがX APIから返却されてフローが停止します。
▼「3.前回の続きから取得?」の条件
条件は以下のように設定していますが、ORを選択しているためどれかの条件に一致すると後続のtrueブロック、どれも一致しないとfalseブロックのアクションを実行します。
Condition Expression
OR | |||
@{empty(items('巡回リストを分解')?['newest_id'])} | is equal to | @true | |
@{empty(items('巡回リストを分解')?['newest_time'])} | is equal to | @true | |
@items('巡回リストを分解')?['newest_time'] | is less or equal to | @addDays(utcNow(), -7) |
1行目と2行目の条件は値がnullか否かの判定です。
Listsの巡回リスト作成時にnewest_idとnewest_timeを必須としていないため、何も入力されていない場合があります。そのため、empty()関数を使用してnullかどうかを判定しています。empty関数の結果はnullであればtrueになります。
最後の3行目は前項の「最新のツイート日時」変数が7日かそれより古い(is less or equal to)を判定しています。
※数値が小さい(less)=古いことになります。
結果的にすべて一致しない場合にはsince_idのクエリ文字列を作成します。
▼作成アクション
「4.前回のツイートIDを指定するクエリを作成」は変数ではなく作成アクションを使用しています。
変数は初期化忘れや並列実行時の挙動を意識する必要がありますが、作成は後から値を変更できないものの、その場で初期化して値を格納できます。
なお、細かい違いはあるのでPower Automateのドキュメント等を参照してください。
13.おわりに
今回までで最小限のメッセージが表示されるようになりました。
今後は画像や引用の表示等を加えていきます。
なお、今回は以下のフローを追加・変更しました。
2では以下の赤枠部分を追加しました。
3~4では以下の赤枠部分を追加しました。
5では以下の赤枠部分を変更しました。
6~9では以下の赤枠部分を追加しました。
10では以下の赤枠部分を変更しました。