LINE BOTで友達に追加されたらメッセージを送る

LINE BOTが友達に追加された時にメッセージを送る。
よく公式アカウントとかで追加時にメッセージを送ってきてくれて使い方とか説明するのを再現できる。

# 前準備
Heroku上で動作確認。
コールバックを受ける必要があるのでFixieを使って固定IPへのプロキシを通しましょう。
参考 [LINE BOT をとりあえずタダで Heroku で動かす](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516)


# 依存パッケージ
package.jsonに書いてある通りです。
expressとか使って、LINEのサーバからのコールバック受けてます。
body-parser入れないと、コールバックの中身を受け取れないので詰みます。

``` package.json
{
  "name": "line-bot",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.15.0",
    "express": "^4.13.4",
    "request": "^2.70.0"
  },
  "engines": {
    "node": "5.9.0",
    "npm": "3.7.3"
  }
}
```


# HTTPサーバ
expressを使ってます。
LINEのBasic informationに登録したCallback URLになるようにルーティングを `/callback` に設定。

``` index.js
var express = require('express')
var bodyParser = require('body-parser')
var callback = require('./routes/callback')

var app = express()
var http = require('http').Server(app)

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.use('/callback', callback)

app.listen(process.env.PORT || 3000)
```


# コールバックを受け取る処理
LINEの設定や、Fixieの設定はjsonファイルから読んでます。
[公式ドキュメント](https://developers.line.me/bot-api/api-reference#receiving_operations)によると今のところ

- 友達へ追加(ブロック解除も含む)
- ブロック

の２種類の操作でもコールバックURLが呼び出されます。
（グループへの追加とかは無いみたい。追加できないし）

このコールバックURL呼び出し時にcontentのparamsに入っているMIDが操作を起こしたユーザのIDです。（友達へ追加した、削除した）
なので、このIDへメッセージを送れば追加時にメッセージを送ることが可能です。

``` ./routes/callback.js
var express = require('express')
var request = require('request')
var line_conf = require('./line_conf.json')
var fixie_conf = require('./fixie_conf.json')

var router = express.Router()
var proxy = request.defaults(fixie_conf)

var headers = {
  'Content-Type': 'application/json; charset=UTF-8',
  'X-Line-ChannelID': line_conf['X-Line-ChannelID'],
  'X-Line-ChannelSecret': line_conf['X-Line-ChannelSecret'],
  'X-Line-Trusted-User-With-ACL': line_conf['X-Line-Trusted-User-With-ACL']
}

function sendMessage(to, content) {
  var options = {
    url: 'https://trialbot-api.line.me/v1/events',
    method: 'POST',
    headers: headers,
    json: true,
    body: {
      'to': to,
      'toChannel': 1383378250,
      'eventType': "138311608800106203",
      'content':content
    }
  }
  proxy(options, (err, res, body) => {
    if (err) {
      console.log(err)
    }
  })
}

function recvOperation(content) {
  var id = [content.params[0]]
  var content = {
    "contentType":1,
    "toType":1,
    "text": 'へい！らっしゃい！！'
  }
  sendMessage(id, content)
}

router.post('/', (req, res, next) => {
  var results = req.body.result
  results.forEach((result) => {
    switch (result.eventType) {
      // receive operation
      case '138311609100106403':
        recvOperation(result.content)
        break;

      // receive message
      case '138311609000106303':
        var content = {
          "contentType":1,
          "toType":1,
          "text": result.content.text
        }
        sendMessage([result.content.from], content)
        break;
      default:
    }

  })
  res.json(req.body)
})

module.exports = router
```

# LINE BOTの設定
Basic informationで取得した情報を入れます。

``` ./routes/line_conf.json
{
  "X-Line-ChannelID": "",
  "X-Line-ChannelSecret": "",
  "X-Line-Trusted-User-With-ACL": ""
}
```

# Fixieの設定
[Fixie](https://dashboard.usefixie.com/#/account)のProxy URLを入れます。

``` ./routes/fixie_conf.json
{"proxy": ""}
```


# 試す
ここまでできたら、Herokuにpushすれば友だち追加した際に 「へい！らっしゃい！！」 と言ってくれる