Node-Redを利用して、非エンジニアでもらくらくTwitterなどでエゴサーチを無料で行う。

皆さんエゴサーチしてますか？ こんにちは。

個人で利用することはそんなに無いと思いますが、サービスなどを運営しているとサクッとエゴサーチ的なものをしたくなる時があるかもしれません。
そんな時に非エンジニアの方でもかんたんに無料でできる方法がある、となれば利用しない手はないですよね。

## 利用するもの

- Node-Red
- heroku
- Slack
- twitter

そんなところ。

## 事前に必要なもの

herokuにアカウントを作成しておく必要があります。
https://signup.heroku.com/login
ここからちゃちゃっと作ってしまいましょう。

プラスアルファで、クレジットカードを登録する必要があります。
herokuは1アカウント辺り、1000時間/月の範囲で無料で利用できるようなので、アカウントにひとつだけデプロイしている状態であれば課金されません。安心してクレジットカード番号を預けましょう。（実際に起きた問題などに関しては責任は負いかねます。）

## Node-Redをherokuにインストールする

インストールは超簡単。
Node-RedのGitHubのReadmeにある `Deploy to heroku` ボタンを押すだけ。

一応ここにも置いて置きます。これを「ぽちっとな」します。
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/joeartsea/node-red-heroku)

こんな感じの画面が表示されますが、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/0e9d2b03-4321-478a-b0c3-f2541c09cd69.png)

- App name : アプリケーション名。アクセスする際にドメインにもなるので少しかっこいい感じにしましょう。
- Choose a resion : USとヨーロッパが選択できますが、どっちでもいいと思います。
- NODE_RED_USERNAME : アプリケーションにログインする際のユーザ名です。予測されやすいものはxです。
- NODE_RED_PASSWORD : アプリケーションにログインする際のユーザ名です。これも予測されやすいものは当然xです。

全て入力できたら `Deploy app` を押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/5ce050f2-8407-475c-dd21-81cfc86cab0f.png)

ログが流れていきますので、眺めながら心を落ち着けてのんびりまちましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/a90e1e31-ae14-eb60-9d45-5e6cf277508e.png)

デプロイが終わるとこんなボタンが表示されますので `View` のボタンを押してアプリケーション画面を表示します。

## Node-Redにログインする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/04c06901-e732-50dd-5b49-07760000cfe1.png)

Node-Redの画面が表示されているはずなので、赤い大きめのボタンを押し、先程のIDとパスワードでログインします。

## 画面の説明

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/204e6c92-143b-dd33-cbb0-4f46ab30b61e.png)

いろいろ表示されていると思います。
左側にならんでいる札みたいなものを、真ん中の画面に並べていろいろ作っていく。という感じになります。

### ちょっと脇道。hello-worldと返すwebサーバを作ってみましょう。

入力の `http`　、機能の `template` 、出力の `http response` を以下のように並べてつなぎます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/55a7e345-ca02-748b-5ea8-eaa37d525889.png)

#### GETのパスを決める

httpの入力の札のようなものをダブルクリックし、URLに `/hello` と入力し、完了を押しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/31f89dca-14e5-7917-12ca-92a8444cdc28.png)

#### レスポンスを作成する

テンプレートの札のようなものをダブルクリックし、テンプレートを `<H2>Hello World!!!</H2>` と入力して完了を押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/41cccc1b-6b33-56d1-e763-1db19659a46e.png)

#### デプロイする

右上の `デプロイ` ボタンを押し、デプロイします。

#### 動作確認する

Node-Redの管理画面のURLの末尾を先程の `/hello` に変えてアクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/746d1a8e-16c2-8b2a-8904-be5281664f77.png)

いい感じですね！

## Slackとの接続を設定する

右上のハンバーガーボタンから、「パレットの管理」を選択する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/b13735f3-0655-2fb9-44be-8ef23d8f9334.png)

「ノードを追加」タブを選択し、「Slack」と入力して検索する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/e2398e0a-b3a6-8c52-fed0-dd48c66779ca.png)

「node-red-contrib-Slack」の「ノードを追加」ボタンを押し、追加する。

## フローを作成する

ソーシャルの twitter -> Slack というフローを作成する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/596b0ab7-c656-f13d-ba95-36157d180022.png)

## twitterから検索する条件を設定する

このような画面が表示されるので

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/947bf81d-c159-6954-80ac-0e84c445ad0e.png)

twitterの札のようなものをダブルクリックし、「新規にtwitter-credentialsを追加」を選択し、横のペンボタンをクリックする。

twitter側で連携の認証が表示されるので、許可し、node-redの画面に戻る。

検索範囲は適宜適切なものを選択し、検索条件はtwitterのAPIに準拠したものを入力する。
例として `nvidia` を入力してみます。（書いている現在、ホットなニュースだったので）

### デバッグしてみる

twitter連携がどのような値が取得できているのか確認のためデバッグをしてみる。
twitterの札のようなものに、出力のdebugの札を連結する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/3a501804-fbb9-06c9-8a17-831c5974d0ac.png)

この状態で、アプリケーションをデプロイしてみると、右側の「デプロイ」タブに以下のようにログが流れるので連携が成功していることがわかる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28681/ebab2c72-f879-6666-a841-960f1fb7e93f.png)

## Slackとの連携

Slackの札のようなものをダブルクリックし、
- Webhook URL
- Posting UserName
- Emoji Icon
- Channel
を最低限入力することでSlackにエゴサーチした内容がPostされる！

※イメージ画像はありません。あしからず。

## Appendix

### Slackに投稿する内容を修正したい。

twitterからの入力された `body` の値のみSlackに連携しているため、上で紹介した方法だと本文しか表示されない。
Slackに投稿する内容を返るには `function` ノードが利用できる。
functionノードはjavascriptで記述できますが、サンプルとして以下のような感じで書けます

```javascript:Slackに本文ではなく、twitterのURL（パーマリンク）を投稿する場合
URL = "https://twitter.com/";
STATUS = "/status/";

// tweet のパーマID
PID = msg.tweet.id_str;

// tweet のユーザのスクリーンネーム
PNAME = msg.tweet.user.screen_name;

// tweetのURLを生成してpayloadと差し替える
msg.payload = URL + PNAME + STATUS + PID;

return msg;
```
このようなfunctionを挟み込むことで処理の内容を変えることが出来ます。

### 15分ぐらいすると止まってしまう。

今回使っているherokuは15分ぐらいアクセスがない場合、サーバが停止してしまうという仕様があります。
そのため、twitterの内容をサーチさせておいてもある程度の時間経過すると止まってしまい、困ったことになります。

対応策として
- 定期的にGoogle Apps Scriptなどを利用してトップ画面に定期的にアクセスする
- GCPのStackdriverの死活監視を利用し、定期的にトップ画面にアクセスを行う。

などのような方法を取る必要があります。
今回はそのあたりの細かい手順は割愛しますが、要望があれば書こうと思います。


## おわりに

こんな感じで殆どプログラムを書くこともなく、自分が欲しい情報をかんたんに集めることが出来ます。
今回は一部のみ利用しましたが、ちょっとしたwebサーバを簡単に作ったり、WebSocketサーバをかんたんに用意したりと一人1つ持っていると色々なことに利用できると思います。

それでは、楽しいNode-REDライフを！