こんにちは、サイオステクノロジー武井です。Logic AppsとAzure Table Storageを使って、ランダムつぶやきするTwitter Botをノンコーディングで作成してみました。
Azure Logic Appsって?
ノンコーティングで使えるワークフローサービスです。「Aというイベントが発生したらBをする」のような形式で定義をします。この「A」をトリガー、「B」をアクションと呼びます。トリガーやアクションには様々なビルトインサービスがあります。例えば、「毎朝7時になったら、決められた内容のつぶやきをTwitterにする」という要件を実現したい場合、「毎朝7時になったら」というのがトリガーになり、「決められた内容のつぶやきをTwitterにする」がアクションになります。もちろん、これらのトリガーはコードを書くことなく、GUIで予め決められたパラメータを与えることで動作します。この他にも様々なビルトインのトリガーやアクションがあるので、複雑な内容でなければ、コードを書くとこなく色んなことが実現出来ます。
Azure Table Storageって?
Azureで提供されているマネージドなKey-Valueストアです。ざっくりいいますと、RDBのようにテーブルの結合など複雑なことは出来ません。ただし、単純にキーと値だけを格納するという要件だけであれば、RDBのようにスキーマの定義をする必要もないですので、簡単に始められることが出来ます。今回の用途(Twitterでつぶやくためのつぶやきを格納する)にはドンピシャなサービスかと思います。
今回やること
あらかじめストックされたつぶやきの中から、毎日ランダムに抽出して、特定の時刻にTwitterにつぶやきます。情報の定期発信なんかにはとても便利ですね!!しかもノンコーディング!!
つぶやきをストックする場所は、先ほどご紹介したAzure Table Storageです。つぶやきを登録しておくだけなので、RDBなどは大げさですよね。Azure Table Storageであればスキーマの定義もいらず、ライトな感じで使えるので今回の用途にはピッタシです。
Twitterへのつぶやきを実現するのは、Azure Logic Appsです。Twitterにつぶやくアクションもあらかじめ用意されています(•ө•)♡
Azure Table StorageにストックしたつぶやきをLogic Appsでランダムに抽出して、毎日決まった時刻にTwitterでつぶやきます。Logic Apps使ってTwitterでつぶやくのはありますが、Azure Table Storageを織り交ぜるのは多分なかなかないのではないでしょうか?
早速実践してみよう!!
ではいつものように、手を動かして実践してみましょう!!
処理フロー
リソースを作成する前に処理フローを確認します。
- Azure Table Storageに登録してあるつぶやきを全て取得して配列に格納する。
- 配列の数をカウントして変数に格納する。
- 0から配列の数までの乱数を生成する。
- 生成された乱数の添字に対応した配列の値(つぶやき)を取得する。
- 4で取得した値をTwitterにつぶやく
3で全件取得するのかよと思いますが、Azure Table Storageに対するクエリはcount文のようなものがないので、この方法しかないのです。
Azure Table Storageの作成
まずはつぶやきを格納するAzure Table Storageを作成します。Azureポータルにて「storage account」と入力してエンター押します。
「作成」をクリックします。
サブスクリプション名やストレージアカウント名、場所などはご自身の環境にあったものでOKですが、「アカウントの種類」だけは「StorageV2」にしてください。「確認および作成」をクリックします。
内容に問題がなければ「作成」をクリックします。
先ほど作成したストレージアカウントのリソースにアクセスして、「テーブル」をクリックします。
「+テーブル」をクリックしてテーブルを追加します。テーブル名は「tweets」とします。次に左部メニューの「Storage Explore(プレビュー)」をクリックします。
「テーブル」をクリックすると、先ほど作成したテーブル「tweets」が表示されるのでクリックします。次に「+追加」をクリックします。
エンティティ(RDBでいうところのレコード)の追加の画面が表示されます。「PartitionKey」には「tweet」、RowKeyには「0001」と入れます。Azure Table StorageはPartitionKeyとRowKeyの組み合わせで一意になればいいので、今回のケースでは扱いやすい値であれば何でもいいです。「tweet」というプロパティを追加して、Twitterにつぶやきたいメッセージを入れます。同様の手順でランダムにつぶやきたい複数のつぶやきをこのテーブルに登録します。
Logic Appsの作成
次にLogic Appsを作成します。Azureポータルのトップ画面にて「リソースの追加」をクリックして、「logic app」
「Logic App」をクリックします。
「作成」をクリックします。
「サブスクリプション」と「リソースグループ」と「リージョン」は適宜環境に合わせたものを入力します。「ロジックアプリ名」はこのLogic Appsを識別するためのわかりやすい名称でOKです。最後に「確認および作成」をクリックします。
内容に問題なければ「作成」をクリックします。
先ほど作成したLogic Appsのリソースにアクセスして、「空のロジックアプリ」をクリックします。
「ビルトイン」をクリックして「スケジュール」をクリックします。
「繰り返し」をクリックします。
毎日7:30につぶやく設定にしてみます。「間隔」を1、「頻度」を「日」にして、「Add new parameter」をクリックして「設定時刻(時間)」「設定時刻(分)」をチェックします。
「設定時刻(時間)」「設定時刻(分)」にそれぞれ「7」「30」を設定します。これで毎日7:30にこのLogic Appsが実行されます。「+新しいステップ」をクリックします。
ここからは、今後使ういくつかの変数を初期化する作業をします。プログラムで言うところの変数の宣言ですね。まず、Azure Table Storageから取得したエンティティを格納sる変数を初期化します。デザイナーの画面で「変数」をクリックします。
「変数を初期化する」をクリックします。
変数名である「名前」は「tweets」とします。変数の型である「種類」は「アレイ」とします。「値」は初期値ですが、空でOKです。
わかりやすいようにステップの名前を「変数を初期化する」から「Azure Table Storageから取得したエンティティを格納する配列の初期化」に変更します。ステップの右上の「・・・」をクリックして、「名前の変更」をクリックして、変更したい名前を入力します。
同じような要領で以下の変数を初期化します。
ステップの名前 |
Azure Table Storageから取得したレコードの数を格納する変数の初期化 |
変数の名前 | count |
変数の種類 |
整数 |
変数の値 |
なし |
ステップの名前 |
0からつぶやきの数の最大値までの乱数を格納する変数の初期化 |
変数の名前 | randvalue |
変数の種類 |
整数 |
変数の値 |
なし |
ステップの名前 |
つぶやきを格納する変数を初期化 |
変数の名前 | tweet |
変数の種類 |
文字列 |
変数の値 |
なし |
次にAzure Table Storageからエンティティを取得します。「+新しいステップ」をクリックして、検索テキストボックスに「azure table storage」と入力します。すると「Azure Table Storage」のアイコンが表示されますのでクリックすると、色んなアクションが表示されます。「エンティティの取得」を選択してほしいのですが同じ名称のが2つあります。「i」をクリックして以下の内容が表示される方の「エンティティの取得」を選択して下さい。
「接続名」には任意の文字列、「ストレージアカウント」は先ほど作成したストレージアカウントを選択して「作成」をクリックして下さい。
「テーブル」では先ほど作成したテーブルを選択して下さい。
次は、先のステップで取得したエンティティの一覧(JSON形式)の解析を行います。「+新しいステップ」をクリックして、検索テキストボックスに「json」と入力します。「JSONの解析」をクリックします。
「コンテンツ」をクリックして、「動的なコンテンツ」→「エンティティの結果を取得」の順にクリックします。
「スキーマ」の部分には以下の内容を入力して下さい。
{ "type": "object", "properties": { "odata.metadata": { "type": "string" }, "value": { "type": "array", "items": { "type": "object", "properties": { "odata.etag": { "type": "string" }, "PartitionKey": { "type": "string" }, "RowKey": { "type": "string" }, "Timestamp": { "type": "string" }, "tweet": { "type": "string" } }, "required": [ "odata.etag", "PartitionKey", "RowKey", "Timestamp", "tweet" ] } } } }
JSONの解析の場合、ステップの名前が日本語だとおかしな動作をすることがあるらしいので、「jsonparse」に変更しておきます。
Azure Table Storageから取得したつぶやきの一覧を、先ほど事前に初期化した配列「Azure Table Storageから取得したエンティティを格納する配列の初期化」に格納します。「変数の設定」をクリックします。
「名前」のところには「tweets」、「値」には以下を入力して「OK」をクリックします。
ステップの名称をわかりやすいものに変更します。
Azure Table Storageから取得したつぶやきの数を数えて、変数に格納します。処理は、先ほどAzure Table Storageから取得したつぶやきを格納した配列の数をカウントするだけです。先と同じように変数の設定をクリックして、「名前」に「count」を選択、「値」をクリックして「式」のところに以下の値を設定します。
Twitterの認証画面が表示されますので、つぶやきたいTwitterアカウントのユーザー名とパスワードを入力して、最後に「連携アプリを認証」をクリックします。
次に「Add new parameter」をクリックして、「ツイートテキスト」をチェックします。
「ツイートテキスト」をクリックして、「動的なコンテンツ」から「tweet」(先ほど作成したつぶやきが格納されている変数名)を選択します。
これで設定はOKのはずなのですが、このまま動かすと何故かTwitterからの応答が400エラーになることがあります。その場合は、以下を試してみて下さい。
Logic Appsのリソースのトップ画面にアクセスして「API接続」をクリックします。するとTwitterのAPI接続が表示されますので、それをクリックします。
「認証の種類」で「共有済みの規定アプリケーションを利用する」を選択して、「承認する」をクリックします。
再度、Twitterの認証画面が表示されますので、ユーザー名とパスワードを「連携アプリを認証」をクリックします。
「保存」をクリックします。
これで完了です。結局フロー全体は以下のようになりました。
「実行」をクリックすると、作成したフローを試すことができます。
注意点
生成される乱数の値によっては2度続けて同じツイートがされることがあります。ただし、Twitterでは、短期間に同じツイートを連続してAPIから投稿するとエラーになります。
なので、十分時間をおいてから(24時間くらい間隔あくと大丈夫そう)投稿するか、たくさんのつぶやきのストックを用意しておいて、できるだけダブらないようにする必要があります。
もっとちゃんとしたつくりにして、前回と同じツイートをしないようにもできますが、今回はシンプルさをメリットにしようと勝手に心に決めたので、こんな感じになってます(´・ω・`)ショボーン
まとめ
ノーコードでここまでできるって感激ですね。もうあなたなしでは生きてゆけない。No Logic Apps,No Life!!