top of page
Akira Mizuno

(9) Teamsに投稿

更新日:10月26日

変更履歴:

2024/10/26 「9.2.テスト結果の確認」でTeamsにメッセージが追加された画面例を追加



1.はじめに

 

今回の記事では、ツイート文章に投稿者前などを加えてTeamsに投稿する処理を追加します。



2.最近のツイートデータを分解

 

最近のツイート一覧データを一件毎に分解して処理します。


2.1.アクションの追加

フローの末尾の一つ上の+をクリックして、「アクションの追加」を選択します。

(巡回リストを分解」アクションのループ内の最後に追加します。)


2.2.アクションの選択

「Control」の中から「それぞれに適用する」を選択します。


2.3.アクション設定

(1)アクションの名前を「最近のツイートデータを分解」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。

▼パラメーター

名前

設定する値

Select An Output From Previous Steps

@variables('varRecentTweetData')


(3)「▼設定」の表に従って、「設定」タブから以下を赤枠のように「並列処理の次数」を「1」に設定します。

(「コンカレンシーの制御」及び「並列処理の次数」は、それぞれ「Concurrency control」及び「Degree of parallelism」の表記になっているかもれません。)

▼設定

名前

設定する値

コンカレンシーの制御

ON

並列処理の次数

1


3.投稿者情報を抽出

 

「最近のツイート一覧を取得」アクションで取得したデータの中から、処理中のツイートデータの投稿者情報を抽出します。


3.1.アクションの追加

「最近のツイートデータを分解」の中の+をクリックして、「アクションの追加」を選択します。


3.2.アクションの選択

「Data Operation」の中から「アレイのフィルター処理」を選択します。


3.3.アクション設定

(1)アクションの名前を「投稿者情報を抽出」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

名前

設定する値

From

@body('最近のツイート一覧を取得')?['includes']?['users']

Filter Query

※下記参照

Filter Queryの設定値

@item()?['id']

is equal to

@items('最近のツイートデータを分解')?['author_id']



4.添付メディアデータの処理

 

後日、添付メディアデータの処理のアクションを追加するための目印として、スコープを追加しておきます。


4.1.アクションの追加

「投稿者情報を抽出」の下の+をクリックして、「アクションの追加」を選択します。


4.2.アクションの選択

「Control」の中から「スコープ」を選択します。


4.3.アクション設定

(1)アクションの名前を「添付メディアデータの処理」に変更します。

※パラメーター指定はありません。



5.参照ツイートの処理

 

後日、参照ツイートの処理のアクションを追加するための目印として、スコープを追加しておきます。


5.1.アクションの追加

「添付メディアデータの処理」の下の+をクリックして、「アクションの追加」を選択します。(最近のツイートデータを分解」アクションのループ内の最後に追加します。)


5.2.アクションの選択

「Control」の中から「スコープ」を選択します。


5.3.アクション設定

(1)アクションの名前を「参照ツイートの処理」に変更します。

※パラメーター指定はありません。



6.投稿メッセージの作成

 

「最近のツイート一覧を取得」アクションで取得したデータの中から、処理中のツイートデータの投稿者情報を抽出します。


6.1.アクションの追加

「参照ツイートの処理」の下の+をクリックして、「アクションの追加」を選択します。

(最近のツイートデータを分解」アクションのループ内の最後に追加します。)



6.2.アクションの選択

「Data Operation」の中から「作成」を選択します。


6.3.アクション設定

(1)アクションの名前を「投稿メッセージの作成」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

名前

設定する値

入力

@replace(items('最近のツイートデータを分解')?['text'], decodeUriComponent('%0A'), '<br>')


7.IDからツイートページのリンクを作成

 

ツイートデータに含まれるIDを元に、そのツイートのURLリンクを作成します。


7.1.アクションの追加

「投稿メッセージの作成」の下の+をクリックして、「アクションの追加」を選択します。


7.2.アクションの選択

「Data Operation」の中から「作成」を選択します。


7.3.アクション設定

(1)アクションの名前を「IDからツイートページのリンクを作成」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

名前

設定する値

入力

<a href="@{variables('varXApi')?['xUrl']}/@{body('投稿者情報を抽出')?[0]?['username']}/status/@{items('最近のツイートデータを分解')?['id']}">@{items('最近のツイートデータを分解')?['id']}</a>



8.Teamsにツイートメッセージを投稿

 

Teamsの指定されたチャネルにツイートのメッセージを投稿します。


8.1.アクションの追加

「IDからツイートページのリンクを作成」の下の+をクリックして、「アクションの追加」を選択します。


8.2.アクションの選択

「Microsoft Teams」の中から「チャットまたはチャネルでメッセージを投稿する」を選択します。

(ランタイムの種類は「組み込み」ではなく、「標準」に含まれます。)


8.3.アクション設定

(1)アクションの名前を「Teamsにツイートメッセージを投稿」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。

(フローの保存後は、Messageの内容が少し変わりますが問題ありません。)


▼パラメーター

名前

設定する値

投稿者

フローボット

投稿先

Channel

Team ※1

@items('巡回リストを分解')?['teams_group_id']

Channel ※1

@items('巡回リストを分解')?['teams_channel_id']

Message ※2

<p>@{body('投稿者情報を抽出')?[0]['name']} @@{body('投稿者情報を抽出')?[0]['username']} @{formatDateTime(convertFromUtc(item()?['created_at'],'Tokyo Standard Time'),'M月d日 HH:mm')} id:@{outputs('IDからツイートページのリンクを作成')}</p><p>@{outputs('投稿メッセージの作成')}</p>

※1 Team及びChannelは、以下のような「カスタム値の入力」を選択してから、表中の値を貼り付けます。


※2 Messageは、右の「<>」ボタンでコードビューに切り替えてから、表中の値を貼り付けます。(NormalやArial等のフォント指定がグレー表示になっていれば、コードビューに切り替わっています。)



9.動作確認

 

フローを保存して、ツイートメッセージをTeamsに投稿できるかどうか確認します。


9.1.フローの保存、フローチェック、テストの実行

画面上部の「保存」をクリックして、フローの作成状態を保存します。

その後、以前の記事と同様に、「フローチェッカー」、「テスト」を順番に実施します。


9.2.テスト結果の確認

上部に「ご利用のフローが正常に実行されました。」と表示され、すべてのアクションに緑色のチェックが表示されていることを確認します。


また、設定したTeamsのチャネルに新規メッセージが表示されていることを確認します。

(検索条件の設定によっては、メッセージが存在しない場合があります。)


例えば、次のようにチャネルに新規メッセージが追加されると思います。



10.補足

 

▼「3.投稿者情報を抽出」のアレイのフィルター

「条件」アクションを使っても同様の処理ができますが、フローが分岐して入れ子が増えるのでこのアクションは積極的に使いたいです。

配列のデータから条件のあうもののみをフィルターして取り出すことができます。


X APIの応答データは以下のようになります。

ツイートデータは"data"ブロックにあります。author_idが含まれていますが、それ以外の投稿者情報は含まれていません。

投稿者名等の情報は"includes"ブロックの"users"内に含まれているので、author_idを元に取り出す必要があります。

(応答データの本体=bodyの例です)
{
  "data": [
(ここにツイートデータが配列で格納されています)
    {
      "id": "xxxxxxxxxxxxxxxxxxxx",
(途中略)
      "created_at": "2024-10-14T04:29:56.000Z",
      "referenced_tweets": [
        {
          "type": "quoted",
          "id": "yyyyyyyyyyyyyyyy"
        }
      ],
      "text": "",
      "author_id": "投稿者のID",
      "edit_history_tweet_ids": [
        "xxxxxxxxxxxxxxxxxxxx"
      ]
    }
  ],
  "includes": {
    "users": [
(ここにツイートデータの投稿者情報が配列にまとめて格納されています)
      {
        "id": "投稿者1のID",
        "name": "投稿者1の表示名",
        "username": "投稿者1のユーザー名"
      },
      {
        "id": "投稿者2のID",
        "name": "投稿者2の表示名",
        "username": "投稿者2のユーザー名"
      },

したがって、"includes"ブロックの"users"の配列の中からauthor_idがそのidに一致するものを取り出します。


具体的には、「アレイのフィルター処理」アクションで指定するFrom欄はフィルター対象の配列、すなわちbody('最近のツイート一覧を取得')?['includes']?['users']」となります。

("includes"ブロックは"data"ブロックと同列のため「body('最近のツイート一覧を取得')」の下になります。)


前述の応答データは「2.最近のツイートデータを分解」アクションによって"data"ブロックの配列を一つずつループ処理しているため、author_idは「items('最近のツイートデータを分解')?['author_id']」として取り出すことができます。

idFromで指定した配列内にあるため、「item()?['id']」として指定できます。

上記二つが一致したときに目的とする投稿者情報になるため、Filter Query欄にはequals関数を使用します。


▼「6.投稿メッセージの作成」の改行処理

ツイート本文に改行が含まれるとき、改行コード(%0A)が追加されます。

Teamsに投稿するときにHTMLを使用しているため、replace関数を使用してその改行コード(<br>)に変換しておきます。


▼「8.Teamsにツイートメッセージを投稿」について

Xアプリの実際の表示内容を参考にしながら、HTMLで表示しています。

式をそのまま埋め込めるため手軽に表示するには便利です。

(投稿ユーザー名の前に付与するアットーマークは式を意味するため、全角文字にしています。)


投稿者の表示名等は「3.投稿者情報を抽出」でアレイのフィルター処理を使用しましたが、これは結果が配列で返ってきます。

投稿者の表示名の場合には、「body('投稿者情報を抽出')?[0]['name']」のように配列の0番目を指定して値を取り出します。


▼コードビュー(Code view)による設定値の確認

例えば「8.Teamsにツイートメッセージを投稿」のMessage欄は、設定値を入力したあとには式が自動変換されて元の値と比較することが難しくなります。


そのようなときは上部メニューの「Code view」に切り替えて値を比較すると便利です。

JSON形式ですが、設定した値が何処にあるか何となく分かると思います。



11.おわりに

 

フローを再度実行すると前回と同じメッセージが投稿されると思います。

次回の記事では、メッセージが重複しないように処理を加えます。


なお、今回は以下の赤枠部分のフローを追加しました。



bottom of page