TwitterをトリガーにしたTouchDesignerのコントロール < IFTTTによるソーシャルメディア連携 >

#はじめに
はじめまして。アメリカ ロサンゼルスの[VT Pro Design](https://vtprodesign.com/)にて、主にTouchDesignerを使った案件に関わっています。また、Ableton LiveとTouchDesignerを使ったパフォーマンスをやったりしています。[Instagram](https://www.instagram.com/atsushi_kb/)
今回Qiitaに初投稿させて頂きました。せっかくなので少し毛色の違う内容を選んでみました。
タイトルには"Twitter"と書きましたが、あくまで一例です。**IFTTT**を使って色々な外部サービスからTouchDesignerをコントロールしてしまおうという話です。

##IFTTTとは?
異なるソーシャルメディアやプラットフォームを連携・仲介するWebサービスです。**IF This Then That**の略で（Aが起きたらBを行う）、このA,Bに色々なサービスを当てはめることができます。
![IFTTT_apps.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/ede076c2-8653-c788-e3ee-efd9523a48d1.jpeg)


##方針
###・TouchDesigner内ではWeb Server DATを使用して通信を行います

###・ローカルPCと外部サービスをWeb Requestで連携させるため、[ngrok](https://ngrok.com/) を使用します
[**ngrok**](https://ngrok.com/)はローカルサーバを外部からアクセスできるようにするサービスです。[@mininobu さんの記事](https://qiita.com/mininobu/items/b45dbc70faedf30f484e)にもまとめられています。ちなみに読み方ですが、うちの同僚たちは「エングロック」と発音しています。

ちょっと難しそうと感じる方もいるかもしれませんが、手順通りにやれば特別な知識がなくても動くので、ぜひ試してみてください。

#1. ngrokの設定
ユーザ登録後、[こちら](https://ngrok.com/download)にあるように、
**1, exeファイルのダウンロード**
**2, exeファイルをどこかに解凍する**
**3, トークンを認証する**
**4, サーバを実行してURLを取得する**
の手順で準備完了です。3番以降の手順についてポイントをまとめます。

##トークンを認証する
ngrokにログイン後、`Dashboard`へ行き、`③ Connect your account` をクリックして、そこに表示されているngrok以降のテキストをコピーします。(./は不要)
![token.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/3244b6c0-23bc-1e8d-4658-70cbf6e6d5e4.jpeg)

ダウンロードしたngrok.exeファイルをダブルクリックして実行し、コピーした文字をペースト後、Enterキーを押します。`Authtoken saved to～`と表示され、認証用の.ymlファイルが保存されればOKです。
![ngrok0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/fe6b676f-9c9c-1489-3401-fb51d4fe389f.jpeg)

##サイトの公開
以下のようにコマンドでポートを指定して公開します(例：ポート80を開ける場合)。
以下をコピーしてngrokのウィンドウにペースト後、Enterキーを押して実行してください。
<code>ngrok http 80</code>

以下のようにURLが表示されれば準備OKです。
![ngrok2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/b33225ac-5b29-f92a-2427-3be33deac7a0.jpeg)

FowardingされるURLアドレス `http://～.ngrok.io` の部分は、後にIFTTTの設定で使用するため、コピーしておいてください。

#2. IFTTTの設定
※事前にPCからTwitterへログインしておくと、その後がスムーズです

IFTTTにユーザ登録後、トップページ右上にあるアカウントアイコンをクリックして表示されるプルダウンメニューから**`[Create]`**を選択する
![IFTTT1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/8cbb3799-1cda-cc69-ed74-312d23c5dad6.jpeg)

##起点となるサービスの選択 「Aが起きたらBを行う」の「A」の部分の設定

**`[+Then]`**の部分をクリックして、起点となるサービスを選択する。
![IFTTT2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/ae793323-45a9-c113-36b8-2c6b4e83a857.jpeg)



今回はTwitterを使用するため、検索窓に入力してTwitterを選択します。
![IFTTT3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/bcaec0db-caa7-8e0b-42e5-43b57e336a4a.jpeg)


トリガーイベントの選択画面において、自分がツイートしたら処理をTouchDesignerに送りたいので、左上の**` [ New Tweet by you ]`**を選択します。
![IFTTT4.5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/9a209e85-96a9-ee7b-d6e1-7fb1578ad5cf.jpeg)


その後に表示されるウィンドウ内の** `[ Create Trigger ] `**ボタンを押して次のウィンドウへ移行します。

##処理を行うサービスの設定 「Aが起きたらBを行う」の「B」の部分の設定
**`[+That]`**をクリック後、Web Requestを行う**`Webhook`**を選択します。
![IFTTT5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/927a804e-6816-71d4-d1b2-071f9ad1dd7d.jpeg)

![IFTTT6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/71b9af5f-fb16-84b1-ddf3-7eb59601ef71.jpeg)

その後の **`[ Choose action ]`**の画面では**`[ Make a web request ]`**を選択します。
![IFTTT7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/50edc7fa-71fe-08c8-62de-62a0daaad362.jpeg)

##TouchDesignerに送信するツイートデータの設定

**`[ URL ]`** の記述が最大のポイントになります。ngrokからコピーしたURLをペーストし、末尾に本イベントのキーとなる任意の文字を追加してください。これによってTouchDesigner側の処理を分岐させます。例として `/ifttt`と記入しています。
**`[ Body ]`** に送信したいデータを記述します。今回は数値の1を送ります。

|||
|:--|:-:|
| URL | **http://～ngroc.io/ifttt** |
| Method | **POST** |
| Content Type | **text/plain** |
| Body | **1** |

その後**`[Create action]`** ⇒ **`[Finish]`**で完了です。

![IFTTT10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/d5a0ca8f-eeac-b5e9-12ea-ac43a0c98815.jpeg)


#3.TouchDesignerの設定
IFTTTから送信された数値1を受け取って、`Switch TOP`を切り替えるところまでをゴールとします。事前に以下のように組んでおきます。
![switch0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/4631da1a-b2a4-4181-de6c-6d4250f46a6e.jpeg)


`Web Server DAT`をシーンに追加し、ノードの右下の↓をクリックして`callbacks`を表示します。
![webserverDAT0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/bd277346-d771-88e0-ee3b-142bf128358f.jpeg)


`callbacks`にHTTPリクエストを受け取ったときの処理を追加します。`def onHTTPRequest`に以下の3行を追加します。IFTTTのWebhookから送信された`/ifttt`をキーとして、やりたい処理を書きます。
受信したデータをデコードしたものが`request.get('data').decode('utf-8')`になります。

```python:WebServerDAT_Callbacks
def onHTTPRequest(webServerDAT, request, response):
	uri = str(request.get('uri'))
	if uri == '/ifttt':	
		op('switch1').par.index = request.get('data').decode('utf-8')
```
次に`Web Server DAT`のパラメータに公開したポート80を入力し、`Active`をOnにします。
![webserverDAT1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/12ef1191-2aad-d6d5-fc37-32965a347368.jpeg)

##Twitterからのデータ送信テスト
自身のアカウントからツイートすると、`Switch TOP`の`Index`が0⇒1に切り替わるはずです。
※環境によっては1分ほどかかります。
![switch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/2d7149f3-3ab0-21b9-cdc8-d78f5ef21bdb.png)

複数のデータを送信したい場合はIFTTTのWebhookにおいて

|||
|:--|:-:|
| Content Type | **application/json** |
| Body | **送信したいJSONファイル** |

のように設定し、TouchDesignerでJSONファイルをロードして処理を行わせることも可能です。

##ツイート本文の取得
ツイート本文の送信は以下のように設定します。ポイントはBodyの入力欄右下の`[Add ingredient]`をクリックしてTwitter側のデータを指定するところです。
![IFTTT8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/c3d54212-ea93-003a-0706-e382641bc585.jpeg)

`Web Server DAT`のCallbacksに、tableへの処理を入れれば以下のようにツイートの本文を取得することができます。
![webserverDAT2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/3bbb5dbb-55e8-ac5f-420d-8e4395f52fe3.jpeg)


![webserverDAT3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553058/1d51ef41-7c17-dc4e-eb1f-5ada84132d0c.jpeg)

#まとめ
今回はTwitterを例に挙げましたが、IFTTTで提供されているサービスであれば、同様の手順で何でもTouchDesignerと連携することが可能になります。例えばAndroid端末、Google Home、Facebookなどと連携したインスタレーションなど、アイデア次第で色々な可能性が広がります。TouchDesignerの一番の魅力は、他のアプリ・デバイスとの柔軟な連携ができるところだと思うので、映像以外の用途ももっと模索していければと思います。
[Instagram](https://www.instagram.com/atsushi_kb/)