LoginSignup
10
10

More than 5 years have passed since last update.

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

Posted at

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

前準備

Heroku上で動作確認。
コールバックを受ける必要があるのでFixieを使って固定IPへのプロキシを通しましょう。
参考 LINE BOT をとりあえずタダで Heroku で動かす

依存パッケージ

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ファイルから読んでます。
公式ドキュメントによると今のところ

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

の2種類の操作でもコールバック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のProxy URLを入れます。

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

試す

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

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10