2019/04/30

Twitterに投稿された画像を自動保存するMicrosoft Flow

今すぐ唐揚げ陳麻飯の画像を保存したい!
(西鉄バスアプリの広告調で。でも…今すぐバスに! なんていう状況ってあるのかな? 本当に急いでいたらタクシー拾うんじゃないの? と広告を聞くたびにいつも思う)

そう思ったことはありませんか。ありませんか、そうですか。
でも「唐揚げ陳麻飯」の文字列を任意に変更したらどうですか。
そんな使い方もありますが、ここでの対象は唐揚げ陳麻飯です。

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にある通り以下の通りです。
実行と見なされるものを教えてください
自動トリガーによるか手動での開始かにかかわらず、フローはトリガーされるたびに、1 つの実行と見なされます。 新しいデータの確認は実行とは見なされません。
つまり、トリガーされなければカウントされないので、Twitterの「新しいツイートが投稿されたら」で指定する検索条件(新しいデータの確認の実行)の結果が0であれば、トリガーされたことにならず実行回数にカウントされません。

検索対象によっては検索条件をうまく組み合わせれば、この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のフォルダには自動的に陳麻飯画像が保存されていきます。
俺の唐揚げ陳麻飯フォルダが火を噴くぜ!

0 件のコメント:

コメントを投稿