PepperとLINE（Message API）を接続するまで

# この記事の内容
　Pepperとメッセージのやり取りをするアプリは既にペパメがありますが、専用のメッセージアプリを使うため自由度はさほど高くはありません。もっとやりたいことが色々あるので、LINE Message APIを使って、Pepper * LINEの可能性を探ってみたいと思います。

　LINE Message APIは公式アカウント（Businesアカウント）と友達登録をしたLINE利用者と直接メッセージのやり取りを行うAPIサービスです。LINE Message APIを使い既存のサービスを接続すると、LINEを通したインターフェイスを短時間で構築できます。　
## 前提条件
### Pepper
 - NAOqi 2.4.3（今回は一般販売モデルで試しましたが、OSが2.4.3異常であればモデルは関係ないと思います）
 - LINEアカウント
 - メールアドレスが登録されているLINEアカウント
 - 確認コードを受信できる携帯電話端末

### Webhookコールバック用サーバー
- HTTPS通信が可能なサーバー（Linux + PHP環境で解説します）
- SSLサーバー証明書（別途ご用意ください）

## LINE側の準備
### ビジネスアカウントの発行
LINE Message APIの利用にはLINE Businessアカウントの登録が必要です。
1. サイトhttps://business.line.me/ja/ にアクセスします
2. ［ログイン］をクリックしログインします（ログインには確認コードを受け取れる携帯電話端末が必要です）
3. 必要事項を入力しBusinessアカウントを作成します
### LINE＠Manager
　LINE＠ManagerはBusinessアカウントのプロフィールや基本的な動作を設定するサイトです。API利用のための最低限の設定をします。
1. サイトLINE@Managerにアクセスします
2. ［アカウント設定］-［Bot設定］をクリックします
3. ［APIを利用する］をクリックします
4. 「下記の機能が利用できなくなります……」のメッセージがありますが、APIを有効化します
5. ［リクエスト設定］にてWebhook送信を有効化します。Webhookを有効化することでWebhookで指定するBot用サーバーに投稿内容やユーザー情報が送信できるようになります。Webhookの設定（サーバー側）は後程行います。

　携帯電話端末から作成したBusinessアカウントを友達登録します。以下の手順で友達登録用のQRコードが参照できます。
1. サイトLINE@Managerにアクセスします
2. ［アカウント設定］-［基本設定］をクリックします
3. ［QR］に表示されているQRコードにて友達登録を行います
#### LINE Developers
　LINE Developerは”Channel Access Token”の取得やWebhook URLを設定するサイトです。
1. サイト LINE Developersにアクセスします
2. ［Channel Access Token］-［ISSUE］をクリックします
3. “Channel Access Token”が発行されます。ここで発行されるTokenはAPI実行のために後程使いますので、テキストエディタなどにコピーします。TokenはAPIを利用する鍵情報と考えてください。
4. ［EDIT］をクリックし、［Webhook URL］にWebhookを受け取れるURLを入力します（HTTPSである必要があります）。URLには登録したBusinessアカウントにイベントがあるとメッセージが飛びます。［VERIFY］を押してサーバー側でメッセージの受信を確認してください。メッセージを受信する方法には事項で解説いたします（ここでサーバー側に届くメッセージが確認できないとAPIは利用できません）。
## Webhook（サーバー側）
　Webhookの情報を受信するには、サーバー環境の用意が必要になります。本来はPepperにてサーバーを構築したいところですが、サーバー証明書の設定やroot権限が必要な操作が含まれており実現できません。
　本稿は、Pepper単体で動作することを諦め以下の環境を用意しました。
　（環境の構築は割愛させていただきます）

### 環境
|項目||
|:---------|:---------|
|HW|Raspberry Pi 3|
|OS|Linux Raspbian 4.4.23-v7+|
|httpd|Apache Apache/2.4.10 + modSSL|
### 受信プログラム
　Webhookで指定したURLに対応するプログラムを記述します。本プログラムではToken情報を取得できればよいので、以下のPHPスクリプトをWebサーバーに設置します。
#### Webhook受信用PHPスクリプト（サンプルコード）
~~~php
<?php
ob_start();
$inputData = file_get_contents('php://input');
var_dump($inputData);
$inputData = ob_get_clean();
file_put_contents('<OutputPath>', $inputData."\n", FILE_APPEND);
~~~
　上記PHPスクリプトは<OutputPath>に受け取ったデータを追記するプログラムです。（<OutputPath>にはPHPスクリプトの書き込み権限があるパスを指定してください）LINE Developersにて［VERIFY］ボタンを押すと以下のようなテストデータが出力されます。
#### VERIFY出力サンプル
```
string(474) "{"events":[{"replyToken":"00000000000000000000000000000000","type":"message","timestamp":1451617200000,"source":{"type":"user","userId":"Udeadbeefdeadbeefdeadbeefdeadbeef"},"message":{"id":"100001","type":"text","text":"Hello,world"}},{"replyToken":"ffffffffffffffffffffffffffffffff","type":"message","timestamp":1451617210000,"source":{"type":"user","userId":"Udeadbeefdeadbeefdeadbeefdeadbeef"},"message":{"id":"100002","type":"sticker","packageId":"1","stickerId":"1"}}]}"
```
　上記メッセージが受信できれば、サーバー側の設定は成功です。
　この段階で、作成したBusinessアカウントに対してメッセージを送って下さい。LINE側からメッセージがWebhookで指定したURLに対して送られていることが確認できます。送られたJSONファイルには、返信に必要な”replyToken”や”userId”が確認できます。
　これらの情報をもとにして通常はチャットボット等のシステムとつなぎ込むことになりますが、本サンプルはPepperとつなぐことが目的のためサーバーサイドについては割愛させていただきます
## アーキテクチャ
　LINE Message APIのアーキテクチャを示すと以下のようになります。

![line_arc.png](https://qiita-image-store.s3.amazonaws.com/0/156324/91ab04bc-f038-afc3-7a47-81640a126def.png)

　基本的にPepperはHTTPSのサーバーとして振舞うことができません。実現できるのはアーキテクチャー図で示めした③REST APIをコール、④ユーザーに通知の部分のみになります。
Tokenの種類
　様々なTokenがでてきました。ここでTokenについてまとめてみたいと思います。

|Token|説明|
|:---------|:-----------|:-----------|
|Channel Access Token|APIを利用するための鍵情報（LINE Business アカウントに関連付けられている）|
|replyToken|お友達登録されたユーザーのメッセージに返信するためにToken（送信された特定のメッセージに対して一定時間有効）|
|userId|お友達登録された特定のユーザーを指定するToken（replyTokenのように送信のたびに取得する必要はない）Uから始まる英数字の羅列、LINEで使われているIDではない|

　Pepperはアーキテクチャ図の②で受け取れる情報（”replyToken”および”userId”）を直接受け取る受け取ることができません。あらかじめ”replyToken”や”userId”を受け取っておく必要があります。
　Pepperからメッセージを送信するには”userId”を使うAPIが良さそうです。
## Pepper側のサンプルコード
　APIの利用を簡単にするため、サンプルで提供するボックスでは、requestsライブラリを利用しています。LINE APIを呼ぶためには”Channel Access Token”に加えてWebhookで送信された”userId”ないし”replyToken"が必要です。
　LINE Message API リファレンス：https://devdocs.line.me/en/#messaging-api
### LINEへのアクセス
　APIはHTTPにてリクエストを送信します。送信時にHTTPヘッダに認証情報（Token）と要求情報（Payload）を指定し、”POST"ないし”GET"にてAPIアドレスをコールします。いわゆる、RESTと呼ばれるタイプになります。要求情報（Payload）はJSON形式を用いています。
#### ヘッダ情報と要求情報を作成する例（サンプルコード）
~~~python
import json
import requests
# API URL
url = "https://api.line.me/v2/bot/message/push"
# Get Params
channelAccessToken = <Channel Access Token>
userID = <userId>
msg = <Message>
# Auth Header
authInfo = 'Bearer ' + channelAccessToken
headers = {'content-type': 'application/json', 'Authorization': authInfo}
# Payload
payload = {"to": userID, "messages":[{"type":"text", "text": msg}]}
# API post
r = requests.post(url, data=json.dumps(payload), headers=headers)
~~~
　上記コードは任意のユーザーにメッセージを送信するサンプルです。ここで必要となる<userId>はWebhookで指定したURL側のプログラムより取得してください。
### サンプルの使い方
　［LINE Push Message］ボックスを例に取りサンプルの使い方を解説します。
1. ［SetPathLibFld］ボックスのonReady()出力を［Text Edit］ボックスに結線します。
2. ［Text Edit］ボックスに送信したいメッセージを記入します。
3. ［Text Edit］ボックスの出力を［LINE Push Message］ボックスのonInput_onStart()に結線します。
4. ［LINE Push Message］ボックスのスパナボタンを押します。
5. “Channel Access Token”および”userId”を設定し［OK］を押します。
6. プログラムを実行させます。

![chore_prj_1.png](https://qiita-image-store.s3.amazonaws.com/0/156324/c6634384-0fd1-f097-9057-c38e0e9d99ed.png)

### サンプルボックスの紹介
#### ［SetPathLibFld］ボックス
　サンプルプロジェクト内の”lib”フォルダにあるPythonスクリプトを有効化（パス情報の追加）します。本サンプルではrequestsライブラリを利用するために初めに実行してください。Pythonスクリプトが実行可能になるとonReady()出力にシグナルが送られます。
#### ［LINE Replay Message］ボックス
　投稿されたメッセージに返信を送るボックスです。onInput_onStartには送信したいメッセージを入力してください。スパナボタン”Channel Access Token”と”replyToken”を指定してください。
　本ボックスは、”replyToken”を使うことから利用方法は限定的になると思います。
#### ［LINE Push Message］ボックス
　userIdを指定し、お友達登録されている特定のユーザーに、メッセージを送信できます。onInput_onStartには送信したいメッセージを入力してください。スパナボタンで”Channel Access Token”と、”userId”を指定してください。
#### ［LINE Get Profile］ボックス
　UserIDを指定し、お友達登録されている特定のユーザーの公開プロファイル情報を取得します。onInput_onStartには取得したいUserIdDを入力してください。スパナボタンで”Channel Access Token”を指定してください。onStopped（）出力にユーザーの公開プロファイル情報が出力されます。
## セキュリティについて
　本サンプルでは、”Channel Access Token”をPepper内に保存して実行させています。検証段階では問題ありませんが、実際のアプリケーション開発では認証情報”Channel Access Token”を外部サーバーに保存し、外部サーバを中継させるなどのセキュリティ対策を講じてください。
## サンプル
https://drive.google.com/file/d/0B8s_uY8eHUvqMXN1U3JyNWh0aTA/view?usp=sharing