LoginSignup
15

More than 5 years have passed since last update.

raspi起動時にipをlinebotを使って通知するシステムを作った話

Last updated at Posted at 2017-03-12

概要

  • raspiにsshで入るときにIP調べるために毎回ディスプレイにつなぐのダルくなったので、何かで通知するシステムを作ろうと思った。
  • 勉強用に全く触ったことないnode.jsとlinebotを使って作った。

紹介すること

  • linebotアカウントのプラン選択
  • linebotアカウントの取り方
  • linebotでのreply、pushの仕方
  • node.jsでipを取ってlinebotにpushするコード
  • raspiの起動時に任意の処理を実行する方法

linebotアカウントのプラン選択

linebotのプランには、以下の4種があるらしい

image

  • お金がかからんヤツ
  • push機能(lineの外からlineに通知とかできる)が使えるヤツ

がいいのでDeveloper Trialを取ることにした。

linebotアカウントの取り方

どこから取るねん

linebotアカウントのDeveloper Trialは以下の画面の、
Developer Trialを始める
から取得できる。

LineBusiness Center:Messaging API
https://business.line.me/ja/companies/1360099/services/bot

image

押すとLineのアカウント認証を求められる。
普段使いのlineアカウントでログイン
(PCログインを無効にしてる場合は携帯のアプリから有効にする必要がある。)

入力するんだ

ログインするとBOTアカウントの情報を入れるフォームへ
image

アカウント名を入れるフォームが若干わかりづらい。
カメラのアイコンの下「アカウント名」と書いてあるところをクリックすると入力できる。
カメラのアイコンをクリックするとBOTアカウントのアイコンをアップロードできる。
業種は自分に合ったものを選ぶ。(個人、個人(IT)とか)

BOTの設定をいじるんだ

アカウントができたらLineBusinessCenterの「アカウントリスト」から、アカウントが見られるようになる。

  • Line@:BOTアカウントの管理
  • Messaging API:BOTのメッセージAPIのパラメータとか細かい設定

の分担
まずはLine@からBOTのMessaging APIを有効にする
スクショを残し忘れたけど、

  • Line@Managerから設定開始
  • アカウント設定クリック
  • アカウント設定の下にBot設定とでるのでクリック
  • 「APIを利用する」をクリック(1:1トークできなくなるよ、とかでるけどBotのアカウントだからOK)
  • リクエスト設定でwebhook送信を「利用する」にチェック(大事)
  • 「LineDeveloppersで設定する」から移動
  • BOTアカウントのパラメータが見られるので以下をメモる
    • Channel Access Token: (ISSUEボタンを押すと表示される)このBOTアカウントを特定するようなトークンの様子。(BOTで何をするにも使う)
    • Your userId: 自分の携帯のLineアカウントを特定するID。このID宛にプッシュすると、自分の携帯のLineにBOTからメッセージが届くようなことができる。(ここハマった。普通のLINEアプリのIDとは違う。他の人のを調べたければ、BOTと友達になってBOTに話しかけたときにとぶjsonの中身を見ればわかる。もっと簡単にわかるといいんだが、、、)
  • BOTのQRコードをスマホで読んで、お友達になっておく

ここまででBOTの設定はOK

linebotでのreply、pushの仕方

Line API Refarenceが優秀なので読む(shell,java,ruby,go,php,perl,pythonのサンプルがある!)
https://devdocs.line.me/ja/

Pushしようず

ここまでできたら、とりあえずpushして1回満足しよう
ネットにつながってるLinuxで以下を叩く
(###のところは#ごとさっきメモした値に置き換えてください)

curl -X POST \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer {###Channel Access Token###}' \
-d '{
    "to": "###Your userId###",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}' https://api.line.me/v2/bot/message/push

BOTからHello Worldが2個届けば成功

Replyの使い方

Replyは読んだまま、BOTに話しかけたときに何かの応答をしてくれる機能
応答の処理はLineDeveloppersのBOTのアカウントのページのWebhookURLの先に仕込んでおく必要がある。
仕込み先には条件があって、

  • httpsで受けられること
  • ssl証明書が自己署名だとLineのシステムからNGがでる

ので自分でやるのはちょっとめんどくさい
Herokuだったらすんなり動いたので、Herokuとかに置くといいと思う。

参考:Heroku初心者がHello, Herokuをしてみる
http://qiita.com/Arashi/items/b2f2e01259238235e187

HerokuにデプロイしたアプリのアドレスをLineDeveloppersのBOTのアカウントのページのWebhookURL欄に入れると動く

node.jsでipを取ってlinebotにpushするコード

(参考):第三回 Raspberry Pi 3に最新のNode.jsをインストールする
http://qiita.com/setouchi/items/437e4b62e4210871496f

上記手順などでraspiでnode.jsが動かせる環境を前提で、
npm install request
してrequestパッケージ使えるようにして、以下のコードをnotice_ip.jsとか名前つけて作成

const execSync = require('child_process').execSync;
const result =  execSync('ip addr').toString();


var request = require('request');

var headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {###Channel Access Token###}'
};

// data payload
var data = {
     "to": "###Your userId###",
     "messages":[
        {
            "type":"text",
            "text":result
        }
     ]
};

var options = {
  url: 'https://api.line.me/v2/bot/message/push',
  method: 'POST',
  headers: headers,
  json: data
};

request(options, function (error, response, body){});

node notice_ip.js
で実行

これでraspiのip addrした結果がlinebot経由で届くでしょう。

raspiの起動時に任意の処理を実行する方法

sudo vi /etc/rc.local
して、exit 0より上にさっきのnodeを実行するコマンドを入れる
rc.localはraspi起動時に実行されるので覚えておくと便利

ファイルはフルパスで指定すること(作った.jsのディレクトリでpwdしてパス確認する)

node /home/pi/notice_ip.jsとか

これだけだとraspi起動時にIP取得前にjsが実行されてうまくいかないので、
sudo raspi-configWait for network at BootSlow Wait for network connection before completing boot
を設定しておく。

rc.localはデフォルト無効で、使いたいときは所有者(root)に実行権限をつける必要がある
rc.localをこれまで触ったことがない場合、
sudo chmod u+x /etc/rc.local
して所有者(root)に実行権限をつける必要がある

これでsudo rebootして、raspiが再起動してlineに通知がくれば完成!

お疲れ様でした。

これでraspi起動時に毎回ディスプレイにつながなくてよくなりました。
よかったよかった。

後から思った

line notifyなるものがあるらしい、固定の宛先へのpushだけならこっちのが楽かも

(参考)LineNotifyのサンプルをLaravelでサクッと試してみた
http://qiita.com/ichikawa_0829/items/fd85cd5f73b3d297a5b1

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
15