最強のWebサービス連携ツールIntegromatを使って、Mastodonに無限の可能性を

これは Mastodon Advent Calendar 2017 の記事では**ありません。**~~気付いたら全部埋まってました。~~ ちなみに、昨日の晩ごはんは立川マシマシ総本店のエクストラバージンマシライスでした。
##で、あんただれ
 - **takenoko**と申します。
    - きのこでは**ありません。**
    - **大学生**です。
    - 合法的に**飲酒可能な年齢**です。
    - **芋焼酎**が好きです。
 - 最近はMastodonの**[個人鯖](http://nokotaro.com)**に居ます。
    - 4月の例の記事でMastodonを知り、中規模インスタンスを渡り歩いた末に、**[ベイブレー丼](http://beyblader.top)**を開設、その後先述の個人鯖を立ち上げました。

Qiitaに記事を投稿するのは今回が初めてで、しかも今まで自分のホームページもブログも持たずに生きてきたので、長文の記事を作成するのに慣れてなさ過ぎてすでにしんどいです。

##Webサービス連携ツールあれこれ
今回はタイトルにもある通り、Webサービス連携ツール「[**Integromat**](https://www.integromat.com)」を紹介します。
似たようなサービスとして「[IFTTT](https://ifttt.com)」「[Zapier](https://zapier.com)」「[Microsoft Flow](https://flow.microsoft.com)」などがありますが、SNSの流行やスマートフォンの普及、じわじわと進む**IoT化**に伴ってこのような**異なるWebサービス同士を連携させるツール**の注目度も高まっています。
特にIFTTTは、7年間もサービスが続いているということもあり比較的知名度が高く、基本的な使い方や活用方法を解説した記事も多く出回っています。
Mastodonユーザーの間でも、[mstdn.jp](https://mstdn.jp)の管理人である[ぬるかるさん](https://mstdn.jp/@nullkal)が[IFTTTを利用してMastodonのトゥートをTwitterに転送するアプレット](https://edge.mstdn.jp/@nullkal/98900039530776033)を公開したことで、その名前が広まりました。

###IFTTTと比較
今回紹介するIntegromatはIFTTTと比較すると**多機能**で、それ故に最初はやや玄人向けのサービスだなといった印象でしたが、使っていくうちに「こんなこともできるのか！」と驚かされました。

例えば、IFTTTでは

***「Aという状態になったらBを実行する」***

くらいの単純な動作しかできない（無理矢理数珠つなぎにもできますが動作遅延などを考慮すると現実的では無い）です。なにより、IFTTTはややサーバーが不安定なのか、それともユーザーが多いためにわざと処理速度を下げているのかは分かりませんが、とにかくエラーが多発したり、定期的にデータを取得する動作を設定してもその間隔が適当だったりするので、ヘビーな使い方はできないと思ってください。

一方、Integromatだと

***「毎日午前4時にAの状態をチェックし特定の状態である場合にはBの値を新しい物から10個取得し、それぞれの値から取り出したいデータのみを正規表現で抽出してからCというサイトにHTTPでPOST、返ってきた値を10個結合しまとめたものをDに投稿、同じ内容をEにも投稿し、最後にAの状態を書き換えて終了」***

くらいの複雑な動作ができちゃいます。

###ZapierやMicrosoft Flowと比較
また、ZapierやMicrosoft Flowと比較すると、**多機能である**ことや**有料プランが存在する**こと（IFTTTには個人向けの有料プランが無い）など、いくつかの点は似ていますが、Zapierは無料プランだと使い物にならない上に一番安い有料プランが$20/月という導入のハードルの高さ、Microsoft Flowはそもそも連携可能なサービスが少なくUIも分かりづらい、というデメリットがあります。

その点、Integromatは無料プランでもそれなりに動かせますし、**一番安い有料プランだと$9/月から始められます。**UIも、多機能さが仇となってごちゃごちゃになりがちなところを上手くまとめていて、比較的洗練されていると思います。

###Integromatでの動作の一例
![FireShot Capture 4 - Integromat - The glue of the internet - https___www.integromat.com_en_.png](https://qiita-image-store.s3.amazonaws.com/0/178165/bade7180-0c92-d41f-fb72-b270b9a3f171.png)
Integromatの連携動作の一例。Gmailに新着メールが来たら、Googleスプレッドシートに行を追加しセルにデータを挿入、メールの添付ファイルをZipでまとめてGmailに添付、そのデータはDropBoxにも補完しつつ、別途画像ファイルに関してのみFacebookにも投稿、という流れになっています。（多分）

しかも、各サービスのサーバーが落ちていてデータが取得できなかった場合などの、**エラー時の動作も設定できます。**例えば上記の例で説明するなら、Googleがサーバーダウンして上手く動作しなかったときにiPhoneへ通知でメッセージを飛ばす設定を付け加えることで、**いち早くエラーに気付くことができます。**

###Integromatは使い方の習得に時間が掛かる
そんなIntegromatですが、洗練されているとはいえIFTTTと比較すると圧倒的に**複雑怪奇**ですし、そもそもシステム言語が**チェコ語**と**英語**しか対応してない（本社がチェコのプラハにあるらしい）ので**英語がさっぱりなユーザーにとってはハードルが高い**です。

そんなわけで**「使い方を解説した記事を作ればIntegromatの利用率が高まって、日本語の解説記事がもっと増えるんじゃないかな～」**という淡い期待を込めて記事を書くことにしました。~~言い出しっぺのクセして最終的に他力本願なタイプのクズです。~~

ただ、Integromatくんはあまりにもいろいろな事ができちゃうので一体どこから解説すればよいのやら……と悩みました。今回は、一応**Mastodonユーザーに向けて記事を書く**ことに決めたので、分かりやすくシンプルに**「毎日特定の時間になったらあらかじめ指定しておいた内容のトゥートする」**という動作を自動で行ってくれるように設定します。

##Integromatを使ってみよう
なにはともあれ、まずはアカウントを取得しないことには始まりません。実際に[**Integromat**](https://www.integromat.com)を開き、アカウントを新規登録しましょう。
###アカウントを作成する
![1.png](https://qiita-image-store.s3.amazonaws.com/0/178165/03a4fd0d-1d68-330d-42a5-abde9cf88510.png)
トップ画面に出てくるフォームに入力してもいいですが、もし**Google**、**Facebook**、**GitHub**のいずれかのアカウントを持っていて、連携を行いたい場合は左上の**Sign up**に進んでください。

![FireShot Capture 5 - Sign up I Integromat - https___www.integromat.com_en_register.png](https://qiita-image-store.s3.amazonaws.com/0/178165/2370dbfb-48c1-a703-6f07-a8bf4673fa2b.png)
当該のサービスをクリックして連携させてから、フォームを入力し、規約を読んでチェックボックスを入れて**SIGN UP FOR FREE**をクリックすれば登録完了です。右側にも書かれていますが、基本料金は**永久的に無料**、**クレジットカードの登録も強制ではありません。**

その後、チュートリアル画面が出てきますが、これはスキップしても構いません。恐らく初歩的な英語スキルがあれば説明の内容は理解できますし、書いてある内容がわからなくても直感的に学べる部分もあるかと思います。ですが、Integromatの公式がYouTubeにラーニング用の動画をアップロードしているので、まずはこの記事の以下のプロセスを試してみてから、動画を見ながら手を動かして基本的な操作方法を覚えていく、というやり方もオススメです。

###Scenarioを作成する
![FireShot Capture 6 - My Lab I Integromat - https___www.integromat.com_org_174321#_=_.png](https://qiita-image-store.s3.amazonaws.com/0/178165/f2d6f8c8-104f-eff2-73b8-264cb35e2021.png)
次にこの画面が出てくると思います。これが、**Dashboard**ページになります。ここで、**現在のプラン**、**残りOperations数**と**残り転送可能データ容量**が確認できます。右上の**Create a new scenario**をクリックして、早速新しいScenarioを追加してみましょう。まだ説明していませんでしたが、Integromatでは1回に実行する動作の流れのことを**Scenario**と言います。IFTTTでいうところの**Applet**にあたります。

![FireShot Capture 9 - New scenario I Integromat_ - https___www.integromat.com_scenario_add.png](https://qiita-image-store.s3.amazonaws.com/0/178165/f845492f-cc5a-5b5d-7eb6-040ae6f5097a.png)
クリックすると、*何のサービスを連携させたいですか？*という画面になります。下にスクロールすると、大量のWebサービスのアイコンが並んでおり、具体的にどんなWebサービスと連携可能なのかが分かると思います。で、いくら探しても**肝心のMastodonがどこにも見当たりません。**これでは意味が無いと一瞬思ってしまうかもしれませんが、Integromatでは**HTTPリクエスト**が送信可能です。MastodonのAPIの叩き方は[GitHub](https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md)にありますが、Mastodon以外のWebサービスでIntegromatが個別に連携可能としていないサービスでも、APIが公開されておりHTTPリクエスト等でデータを送受信できる場合は連携できる可能性があります。ひとまず右上の**Skip**をクリックし、次の画面に進みましょう。

![FireShot Capture 10 - New scenario I Integromat_ - https___www.integromat.com_scenario_add.png](https://qiita-image-store.s3.amazonaws.com/0/178165/95b52e34-b916-a3ad-8cc6-3c9ade5da025.png)
さて、いよいよこの画面までたどり着きました。この画面が、Scenarioを**Edit**する画面です。ここからは実際に新しいScenarioを作っていくので淡々と解説します。まずは真ん中のでっかい**？**をクリックしてください。

![FireShot Capture 11 - New scenario I Integromat_ - https___www.integromat.com_scenario_add.png](https://qiita-image-store.s3.amazonaws.com/0/178165/5681f1ba-cdbd-1861-0c08-d32e7f44b2a1.png)
すると四角いウィンドウが現れるので、下部の入力欄に**「http」**と入力し絞り込みを行い、**HTTP**を選択してください。今回はMastodonにTootするScenarioを作りますが、例えばTwitterにTweetするScenarioならここで**Twitter**を選択するし、**Evernote**や**Instagram**なんかも選択できます。連携可能なサービスが多いので、スクロールで見つからないときは適宜絞り込んでください。この丸の事を**module**といい、Scenarioの中でmoduleをいくつも連結させることで、異なるサービス同士を連携させることができます。

![FireShot Capture 12 - New scenario I Integromat_ - https___www.integromat.com_scenario_add.png](https://qiita-image-store.s3.amazonaws.com/0/178165/9c890ea9-d2a8-ddb5-fb6b-e24b5653f8ac.png)
一口にHTTPでデータの送受信といっても、単純にHTTPリクエストを送るのか、指定したURLのファイルを取得するのか、あるいはOAuthのリクエストの送信もできちゃったりします。今回はHTTPリクエストを送信したいので、**Make a request**を選択しましょう。

![FireShot Capture 13 - Integration HTTP I Integromat_ - https___www.integromat.com_scenario_add.png](https://qiita-image-store.s3.amazonaws.com/0/178165/d801c64e-f8b9-8c90-0ec6-d24b2980192d.png)
まず最初に、**Method**を**POST**に、**Body type**を**Application/x-……d**に変更してください。次にURLに
```https://（インスタンスのドメイン名）/api/v1/statuses```
と入力します。例えば、mstdn.jpでしたら
```https://mstdn.jp/api/v1/statuses```
と入力してください。ここまでできたらその画面は一旦放置して、別のウィンドウで連携するMastodonのいつものページを開き、設定画面に行きましょう。

![FireShot Capture 17 - 新規アプリ - nokotaro.com - https___nokotaro.com_settings_applications_new.png](https://qiita-image-store.s3.amazonaws.com/0/178165/e7ef55de-01fc-faba-eb30-d34631a75c4f.png)
今回はMastodon側の設定で新規にアプリを作成していきます。Mastodonのバージョンが1.6.0以降のインスタンスでは、いつものインスタンスのWeb画面の設定画面の**アプリ**から、外部アプリとの連携に必要な**アクセストークン**が取得可能です。アプリ名は適当に、ここではhogehogeとしましたが、トゥートの詳細画面に記載されるので、例えば今回のようなBotを作成する場合はアプリ名からBotであることが分かるとよいかと思います。アプリのウェブサイトは省略可能ですが、設定すると詳細画面のアプリ名をクリックした際にそのページが開きます。例えば、スマホ用のクライアントアプリを作る際には、アプリの公式サイトや作者のホームページなどを設定しておくことでそのアプリの情報にアクセスしやすくなります。**アクセス権**は、今回作るアプリにどこまで権限を付与するかを設定できます。自分自身のみで使用するアプリであれば、基本的には3つ全てにチェックを入れて大丈夫です。設定を確認したら、送信をクリックしてください。すると、3つの64桁の文字の羅列が出てきます。今回使うのは**アクセストークン**ですので、この欄の64桁の半角英数字をコピーしておきます。

![FireShot Capture 13 - Integration HTTP I Integromat_ - https___www.integromat.com_scenario_add.png](https://qiita-image-store.s3.amazonaws.com/0/178165/5e90976b-fe46-09cf-d314-562200233e7e.png)
そうしたら先程の画面に戻り、**Fields**の**Add item**をクリックしてください。出てきた画面の**Key**に**access_token**と入力し、その下の**Value**には先程コピーした64桁の半角英数字を貼り付け、**Save**をクリックしてください。これと同じような入力を繰り返し行います。**Add item**をクリックし今度は**Key**に**status**と入力し、**Value**にはトゥートしたい内容を入力します。同じように今度は**Key**に**visibility**と入力するのですが、**Value**には**public**、**unlisted**、**private**、**direct**の4種の中から1つ選んで入力してください。それぞれ、公開、未収載、非公開、DMという意味で、トゥートの公開範囲を決めることができます。ここで注意したいのが、**インスタンスごとにBotを使って投稿可能な公開範囲が指定されている場合がある**、ということです。詳しくは**各インスタンスの管理者に聞くのが一番**ですが、マナーとして**public**では投稿しないのが無難です。ここまで設定できたら、**OK**をクリックしましょう。

![FireShot Capture 14 - Integration HTTP I Integromat_ - https___www.integromat.com_scenario_add.png](https://qiita-image-store.s3.amazonaws.com/0/178165/66532196-db5f-1f9a-1424-92522a2e4a9c.png)
最後に、投稿する日時を決めましょう。時計アイコンのボタンをクリックすると**Schedule setting**画面が出ます。ここで**Scenario**が動作するタイミングを選びます。今回は、**毎日午後10時に動作**するように設定してみましょう。**Run scenario**は**Every day**を選び、**Time**は**10:00 PM**に設定しましょう。各項目を全て説明したい気持ちは山々ですが、それは流石に面倒すぎるので、英単語の意味が分からなければ**Google翻訳**に聞きましょう。設定できたら**OK**をクリックして、左下の各種CONTROLSアイコンの右端の**Save**ボタンをクリックし、保存完了です。保存をしない限りはScenarioの変更が反映されないので、変更後は必ずクリックしましょう。左上の矢印の隣の**Intedration HTTP**の部分をクリックすれば、**Scenarioの名前を変更することができます。**自分なりに分かりやすい名前を付けておくのをオススメします。最後に左上の**←**をクリックして完了です。

![FireShot Capture 16 - Integration HTTP I Integrom_ - https___www.integromat.com_scenario_498086_edit.png](https://qiita-image-store.s3.amazonaws.com/0/178165/f7776fae-2e89-2690-6da3-a3f099660965.png)
おっと忘れるところでした、動作を自動で行って欲しい場合は必ずScenarioのスイッチを**ON**にしてください！ここがOFFになっていると、いつまで経っても自動で動作してくれません。

###慣れたらどんどんScenarioを改造しよう
ここまで駆け足でやってきましたが、うまくBotは作れましたでしょうか？もし作れなかった場合は、Mastodonで私に質問するもよし、あれこれ試行錯誤して見るもよし、色々試してみてください。ただし、投稿しすぎてインスタンスに迷惑を掛けないように。そこは自己責任でお願いします。過去に、visibilityの設定をpublicにしたままScenarioのスイッチをONにしたら、溜まっていたJobが一気に作動してLTLに30トゥートくらい超爆速で連投するハメになってしまったことがあるので。よいこのみんなは必ずpublic以外を設定しよう。あれこれ試すときは、念のためdirectにした方が安全かも。

そもそも、今回作ったレベルのBotだったら、**すでに存在しているMastodonのWebサービスで作れる気がする**ので、**ここからどうやって改造していくか**がミソになってきます。例えばTwitterと連携すれば、**MastodonのトゥートをTwitterにクローンしてツイート**できますし、ただクローンするだけじゃなくIntegromatなら140字以上のトゥートでも、例えば**いくつかのツイートに分けて投稿するやり方**もあれば、**140字以降は切り捨ててトゥートへのリンクをツイートの文末に加えるやり方**もあるわけで、**自分で工夫してあれやこれやできる訳です。**

###（参考）課金プランについて
課金をするとどんないいことがあるの？という疑問が湧いてきたかもしれません。大きい違いは**プランによってoperationsの上限が変わる**ことと、**Scenarioを実行する間隔を短くすることができること**です。operationsのカウントについてですが、Scenario内のmodule1つを動作させるごとに1operationを消費します。例えば20個のmoduleが連結されたScenarioがあるとして、このScenarioが実行されたときに全てのmoduleが動作したら20operationsが消費されます。Scenarioが実行されても、途中でフィルターに引っかかりそれ以上の動作がされなくなったり、エラーが発生して途中でignoreされた場合は必ずしも20operationsが消費されることはなく、途中までのmodule動作分のoperationsが消費される仕組みです。

無料プランは上限が決まっている（1ヶ月最大1,000operations）ので、先程の例のように1日に1回くらいの動作であれば余裕で動かせますが、10分に1回データを取得し、更新があったときのみ最後までScenarioを実行するような設定だとすると、最低でも1(operation)×6(回)×24(h)×30(d)=4,320(operation)となり、毎月$9の課金が必要になります。その代わり、きっちり10分間隔で動いてくれる上に、複雑な動作が可能ですし、サーバーが落ちることも滅多にありません。

##おわりに
それなりにコードが書ける方であれば、そもそもこんなサービスにわざわざ課金せずに自分でコード書いて動かしちゃうよ、って気持ちも分かるのですが、Integromatの良いところは「基本的にノンプログラミングで連携ができちゃう」ってところや「各サービスのAPIといちいちにらめっこする必要がない」ってところなので、細かいところに手が届く的なツールだと思います。

あとは、Integromatに一本化せずとも、簡単な連携はIFTTTで、ちょっと複雑な連携はIntegromat、サービスによってはZapier、という具合に使い分けするのも良さそうです。GAS(GoogleAppsScript)なんかと組み合わせても面白そうですね。とにかく、この手の連携ツールの中では飛び抜けて多機能なので、ちょっと触ってみて気に入った方はいじり倒してくれると嬉しいです。

個人的には、mailhookをトリガーにすることで無駄なoperationsを消費することなく、即時的にScenarioを作動させる方法が気に入っています。あとは、Mastodonのその他のAPIももちろん使えますので、TLを取得してfavしたり、特定のハッシュタグが付いたトゥートを一定時間経過後に削除したり、本当に色んな使い方ができるんです。

というわけで、ノリと勢いだけで書き殴ったので、色々ツッコミどころあるかと思いますが、見つけたらそっと教えてください。あとは、みんなIntegromatを使ってみて、もしいいなって思ったら記事書いてください。ここまでプッシュしてるとなんか怪しいけど、Integromat社からは1銭も受け取ってないです(((

以上、Mastodon Advent Calendar 2017に参加し忘れた人の戯れ言でした。
明日の晩飯はラーメンが食べたいです。

2017/12/23追記
誤字を修正しました。あと、次の日の晩飯はラーメンじゃなくて[まぜそば](https://mastportal.info/3309)でした。