(西鉄バスアプリの広告調で。でも…今すぐバスに! なんていう状況ってあるのかな? 本当に急いでいたらタクシー拾うんじゃないの? と広告を聞くたびにいつも思う)
そう思ったことはありませんか。ありませんか、そうですか。
でも「唐揚げ陳麻飯」の文字列を任意に変更したらどうですか。
そんな使い方もありますが、ここでの対象は唐揚げ陳麻飯です。
Microsoft Flowって
Microsoft FlowはFlowの名前の通りプロセスとタスクを自動化するツールです。類似のサービスとしてIFTTTがあります。
2016年に登場した頃はできることが限られていましたが、そのあと進化して色々なサービスと連携を取ることができるようになりました。
ざっくり仕様
・「陳麻家」または「陳麻飯」の文字を含み、写真が添付されているツイートを検索し、ツイート本文と写真を保存する。・ツイートの保存先はExcel Online(OneDrive内)の「/ドキュメント/tw_chinma.xlsx」とする。
・写真保存先はOneDriveの「/画像/tw_chima/YYYY/MM/」配下とする。
・週に一度(毎週 月曜日 10:02)に起動する。
・保存した画像のリンクをまとめたメールを送付する。
準備するもの
Microsoftアカウント(Flowや保存先のOneDriveを使うために必要)Twitterアカウント (今回の情報ソースとして)
Flowを作成する前に、保存先のExcelと画像保存フォルダを作成します。
Excelはテーブルを作成しておく必要があります。今回は以下のような列を作成しました。
列名 | 説明 |
---|---|
DATE | ツイート日時(UTC) |
TWEET-ID | ツイートID(twitterが付与するツイートに対する固有のID) |
ID | ユーザ名(@で始まるもの) |
NAME | スクリーンネーム |
TWEET | ツイート本文 |
URL-LINK | 画像ファイルへのリンク |
ORG | 予備 |
実装にあたり
Flowにはプラン別に毎月実行できる数に制限があります。あまり書かれていませんがOffice 365 solo はFree扱いなので、1ヶ月あたり750回、Flowの実行頻度15分です。15分ごとに実行すると 1週間で使い切る計算です。が、実行回数の考え方は公式サイトのQAにある通り以下の通りです。
実行と見なされるものを教えてくださいつまり、トリガーされなければカウントされないので、Twitterの「新しいツイートが投稿されたら」で指定する検索条件(新しいデータの確認の実行)の結果が0であれば、トリガーされたことにならず実行回数にカウントされません。
自動トリガーによるか手動での開始かにかかわらず、フローはトリガーされるたびに、1 つの実行と見なされます。 新しいデータの確認は実行とは見なされません。
検索対象によっては検索条件をうまく組み合わせれば、この15分ごとに施行されるトリガーでも制限内に収まるでしょう。
しかし、検索対象が頻繁にツイートされると制限数に達してしまうので、ここはあえて組み込みスケジュールのトリガーを使用して、週に1回の実行にします。
(陳麻飯の画像は多く流れていないので、これくらいの頻度で大丈夫。他の検索条件なら 1日1回などのスケジュールで)
Let's Flow!
組み込みの「繰り返し」トリガーを使用します。オプションでタイムゾーンと毎週月曜日10:02に実行されるようにスケジューリングします。これで毎週月曜日のランチは陳麻家に行きたくなるでしょう。
Flow内で使用するパラメータは変数定義しておきます。
以下はFlow内で随時変更する変数なので、nullにしておきます。
URLS_all : 検索したツイートに含まれていた唐揚げ陳麻飯画像すべてのリンク
URLS : 1ツイートに含まれていた唐揚げ陳麻飯画像のリンク
メール送信する際の宛先や件名など。
MAIL_to : 宛先
MAIL_subj : 件名
MAIL_body : 本文
ツイッター検索文字列と検索数(100が上限)
TW_SEARCH : ("陳麻家" OR "陳麻飯") filter:images exclude:retweets
NumOfGetTweet : 100
画像保存先ディレクトリ
SAVEPATH : /画像/tw_陳麻飯/
保存先ディレクトリをyyyy/MMにするため、「現在の時刻」アクションでこのFlow実行時刻(UTC)を取得し、JSTに変換すると共に出力フォーマットを指定してyyyy/MM文字列を作成します。
Twitter検索条件で「年月日以降にツイートされたもの since:YYYY-MM-DD」を指定するため、「過去の時間の取得」アクションを使って7日前の日付(UTC)を取得し、先ほどと同様にJSTに変換しつつyyyy-MM-DD文字列を作成します。
日付の扱いは意外と面倒なので、あらかじめこの様なアクションがあるのはとても有り難いです。
これで前準備が完了。
「ツイートの検索」アクションで変数定義した TW_SEARCH と 先のアクションで作成した 7日前の日付を since: で接続して検索します。
ツイートの検索結果が1つ以上あれば、ツイート毎のループ(loop_tw本文)に入ります。
1つのツイートに最大4つの画像を添付できるので、ループがネスト(loop_twメディアURL)しています。
細かく内容を見ていきます。
変数URLSは「1ツイートに含まれていた唐揚げ陳麻飯画像のリンク」なので、1ツイートの処理ごとに一度クリアします。
ネストした(loop_twメディアURL)の処理は以下の通りです。
変数URLS に画像リンクURLを追加する。
変数URLS_all に画像リンクURLを追加する。
OneDriveにURLからのファイルをアップロードする。
もう少し細かく。
「文字列変数に追加」アクションで 現在のアイテム=ループ処理中のURL文字列 を追加します。改行を入れて整形しておきます。
OneDriveにファイルを保存します。リンクURLと保存先ファイル名の指定が必要です。
ソースURLは loop_twメディアURL の現在のアイテム。
このループで使用している現在のアイテムは以下のような値です。
https://pbs.twimg.com/media/tekitounamojiretsu.jpg
この "tekitounamojiretsu.jpg"部分を使用したいので、uriPath関数で "/media/tekitounamojiretsu.jpg"を抜き出し、さらにreplace関数で"/media"部分をnullにしています。
具体的には replace(uriPath(items('loop_twメディアURL')), '/media', '') という式を使用して
/tekitounamojiretsu.jpg
の文字列を作成します。
それを保存先ディレクトリ(変数SAVEPATH)と変換後の時間(yyyy/MM)と連結し最終的に以下を保存先とします。
/画像/tw_陳麻飯/yyyy/MM/tekitounamojiretsu.jpg
ちょっとわかりづらいですかね…方法はとにかく上記文字列を作りたかったのです。
ファイル名に気にしない人は、現在時刻などから独自に生成しても良いと思います。
Excel Online の「表に行を追加」アクションで作成済みテーブルに各種Twitterからの情報を保存します。URL_LINK列は先ほど値を入れた作成した変数URLSです。
最後に自分宛にメールで通知します。
メール本文には保存した画像すべてのURL(変数URLS_allの値)を書いておきます。
以上でFlow終わり。
正しくFlowが実行され、画像が一つでも保存されればメールが届きます。
Excelには次のように保存されます。 1ツイートに複数リンクがあるときでも 1ツイート1列にするためにループをネストさせる必要がありました。焦るんじゃない、俺は唐揚げ陳麻飯の画像だけが欲しいんだ という要件であればシングルループで実装できます。
OneDriveのフォルダには自動的に陳麻飯画像が保存されていきます。
俺の唐揚げ陳麻飯フォルダが火を噴くぜ!