DataSpiderをつかってPepperと連携する方法

#はじめに
Pepperと他のアプリケーション、サービスと連携をするにはいくつか方法があるが、ハッカソンという限られた時間の中で実装するにはDataSpiderを利用するとわりと簡単に連携処理を実現することができます。
今回はその連携方法のひとつをご紹介したいと思います。

##その前にDataSpiderは何を解消してくれるのか
この記事[「Pythonボックスの考え方 (Pepper TechFes技術セッション)」](http://qiita.com/Atelier-Akihabara/items/f6a05ca14be786f9a94c)にもあるようにPepperではPythonを用いて外部のAPIに直接アクセスするコードを記述することができます。
なのでDataSpiderは不要と思われることがあるのですが、以下のようなポイントを考えると便利かも！と思っていただけるかもしれません。

 - APIを利用する際の認証方式が複雑で実装に時間がかかる
    - DataSpiderはBasic、Digest、WSSE、OAuth 20、OpenID Connect1.0、カスタムヘッダーに対応しているので簡単な設定を行うだけ
 - jsonにパースするのが面倒
    - DataSpiderのマッパー画面で線を引くだけ
 - 文字列を変換処理が多数あると修正が面倒
    - 変換テーブル（設定、CSV、DB、etc…）を用意すればパターンを定義するだけ
 - 実装しなければいけないことがたくさんある。（そもそも時間がない！）
    - 担当者を分割することができる。I/Fとなるjson or XML等の仕様を伝えるだけで手分けして作業を行うことができる。
    - DataSpiderを利用すると作りながらすぐに動かすことができる。

前置きはこの程度として、実際にどのような連携方法があるのかについて書いていきたいと思います。

#コミュニケーションの方向
「<b>Pepperと連携する</b>」と、ひとことで言ってもまずはその「<b>方向</b>」について考えたいと思います。
つまり「<b>イベント</b>」がどちらで発生するのか、ということです。たとえば、

- Pepperに人が触れたときにLINEにメッセージを送るとか、
- slackにpostされたときにPepperが手を振り上げるとか。

こんな感じで、その<b>イベント</b>が発生したタイミングで色々と連動させたいので、ポーリング方式ではなく、HTTPリクエストを送信するような方式で考えたいと思います。

##Pepperで発生するイベントで処理を起動
###処理概要図
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/4902e13e-1090-dbe3-bc13-82a2bd5c06e5.png)
###実装方法
####- PepperでHTTPリクエストを送付する方法
以下のリンクを参考にしてみてください。
（※私はPepper回りが詳しくないので、参考になるリンク先を教えていただけると助かります^^;）

 - [PepperのHTTP通信にRequestsを使う](http://qiita.com/bugcloud/items/6631b2a534446393e214)
 - [pepperに外部モジュール追加してみる。とりあえずrequestsで。](http://qiita.com/n0bisuke/items/5b782bb758ce5611cc90#_reference-353a402536aaffd58ae1)
 - [HTTP Getボックスの作成](http://qiita.com/Atelier-Akihabara/items/acc8d2ad6c3881f112a4)

####- DataSpider上の設定
リクエストするURLはDataSpider上で定義するので、こちらをご参考に。

 - [HTTPトリガーを使ってWebAPIを作成する](http://qiita.com/appresso_wakino/items/c6845dab7c2acdebf0ff)
 - [JSON形式のレスポンスデータを作成する](http://qiita.com/appresso_wakino/items/d8fa8c3cd77531e2f371)

##外部アプリケーションで発生するイベントでPepperに変化を与える
###処理概要図
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/a4ace60f-94ad-937e-856f-8ec86091f4e1.png)
※【TB】Thunderbusの略称です。今回の連携方法において必須ではありません。
###実装方法
今度は先ほどとは逆のパターンです。
この場合Pepper側にWebサーバを立てエンドポイントを生成し、DataSpiderがリクエストを送るという仕組みになります。
####- PepperにWebサーバを構築するには
SimpleHTTPServerを利用する方法や、（~~Pepperに標準で含まれている機能を利用する方法があり、標準機能については~~）そのベースクラス、BaseHTTPServer を利用する方法が考えられます。
このあたりは@tkawata1025さんが詳しく書かれていますのでぜひご一読を！
※私の認識違いの記述であったため修正しました。@tkawata1025さんアドバイスありがとうございます！

- [20.19. SimpleHTTPServer — 簡潔な HTTP リクエストハンドラ](http://docs.python.jp/2/library/simplehttpserver.html)
- [Pepper アプリプロジェクト内に独自の Webサーバーを立てる](http://qiita.com/tkawata1025/items/a4f249a981a406b262c9)

上記の方法でエンドポイントが生成されれば、普通にHTTPリクエストを送付することができるようになります。

##オンプレにあるPepperにHTTPリクエストをする仕組み
しかし、エンドポイントが生成されたとしてもPepperはローカルネットワーク上に存在しているため、インターネット上からそのエンドポイントを簡単にコールすることはできません。
そこで<b>Thunderbus</b>を利用します。ローカルネットワーク内に接続可能なPCにThunderbus HTTPエージェントを導入し、Thunderbus経由でリクエストを送ります。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/8446bf9f-5a9b-9df7-6d0d-99fe5924c612.png)
※ハッカソンではアプレッソスタッフがPCを用意している場合があるので、確認してみてください。
※Pepperにインストール可能なThunderbus Agentがあるともっといいなと思うので開発部に相談してみよっと・・・

#最後に
その他にもPepper上にFTPサーバを起動させる場合、DataSpiderのFTPアダプタを利用して一定のポーリング間隔で取得させるという方法もあります。