PepperのHTTP通信にRequestsを使う

[Pepper ニコニコ超会議 参加作品選抜ハッカソン](https://pepper.doorkeeper.jp/events/22550)に参加した時のメモ。

「目の前にいる人にPepperの動きに合わせて面白い動きをしてもらって、その様子をPepperのカメラで動画に撮影する」というアプリをつくっているチームに参加させてもらいました。
自分は動画アップロードサーバーの開発と、Pepper⇔サーバー間のHTTP通信部分を担当しました。外部ライブラリのimport方法がわからなくてちょっと時間をくったので、最終的に動いたやり方を書いておきます。
PepperもPythonもほぼ素人なので、ツッコミもらえるとありがたいです。

# Pepperにやらせたかったこと

ローカルPCに起動しているRailsで作った動画アップロードサーバーに、撮影した動画ファイルをマルチパートアップロードしたかっただけです。curlのコマンドなら

```
curl -F 'item[video]=@/SOMEDIR/FILE.avi' http://localhost:3000/api/items.json
```

です。

# ライブラリを使いたい

[urllib2というPythonのライブラリはPepperで使えるらしい](http://qiita.com/Atelier-Akihabara/items/acc8d2ad6c3881f112a4)のですが、もっと簡単に使えるライブラリがいい。。ググるとPythonでHTTP通信をするのは、[Requests](https://github.com/kennethreitz/requests)が定番みたいなのでこれを使うことにしました。

```
> pip install requests
> python

Python 2.7.9 (default, Dec 19 2014, 06:00:59)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('https://api.github.com/repos/vmg/redcarpet/issues?state=closed')
>>> print r
<Response [200]>
>>>
```

使い勝手よさそうです。


# Pepperボックス内での利用方法

* [Pepper用Tweetボックスをつくる](http://qiita.com/yacchin1205/items/3422b5066dcbfca63def)
* [[Pepper] Pepperアプリケーション開発　～外部ライブラリの読み込み～](http://arit-clt.com/2014/11/19/pepper-pepper%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%80%80%EF%BD%9E%E5%A4%96%E9%83%A8%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE/)

を参考にしました。```import```の前にPATHに追加すればいいみたいです。プロジェクト全体で```import```出来て欲しいんですが、こういうものなんでしょうか...。

## ライブラリの配置

Bundlerやnpmのようにプロジェクトで使うパッケージやモジュールを管理する方法がよくわからず、今回は単純にプロジェクト内にディレクトリを作ってコピーしました。。
（mac環境下でpipでインストールしたライブラリは```/usr/local/lib/python2.7/site-packages/```にありました）

```
> cd PEPPER_PROJECT_ROOT
> mkdir lib
> cp -r /usr/local/lib/python2.7/site-packages/requests ./lib/
```

Choregrapheを開くと

![image](https://qiita-image-store.s3.amazonaws.com/0/3063/cfa9c4a1-4121-3065-dc2b-0aa2afd0e176.png)

と聞かれるので、「全てにはい(A)」を選びます。

## ライブラリのimport

スニペット的にはこんな感じらしいです。

```py
import sys, os

# ライブラリまでのパスを取得
self.folderName = os.path.join(
            self.framemanager.getBehaviorPath(self.behaviorId), "../lib")

# パスを追加
if self.folderName not in sys.path:
    sys.path.append(self.folderName)

# 読み込み
import requests
```

# ファイルのアップロード

Pepperアプリで撮影した動画ファイル（out.avi）が***html/***に保存されているとして、それを***http://127.0.0.1:3000***に起動しているサーバーにPOSTするコードはこんな感じになりました。[RequestsのQuickstart](http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file)のサンプルコードそのままです。

※余談ですが、RailsのWEBrickは

```
bin/rails s -b 0.0.0.0
```

と***-b***オプションをつければ、IPアドレスでアクセスできるようになります。

```py
def onInput_onStart(self, p):
    import sys, os

    # ライブラリまでのパスを取得
    self.folderName = os.path.join(
                self.framemanager.getBehaviorPath(self.behaviorId), "../lib")

    # パスを追加
    if self.folderName not in sys.path:
        sys.path.append(self.folderName)

    # 読み込み
    import requests
    url = 'http://127.0.0.1:3000/api/items.json'
    fileName = os.path.join(
                self.framemanager.getBehaviorPath(self.behaviorId), "../html/out.avi")
    f = { 'item[video]': open(fileName, 'rb') }
    req = requests.post(url, files = f)
    jsonData = req.json()
    self.log(json.dumps(jsonData, indent = 4));

```

Pythonカスタムボックスを作成して、上記コードを動かすと

```
[INFO ] behavior.box :log:287 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1140386960576864__root__videoUpload_1: {
    "item": {
        "video": "http://localhost:3000/uploads/ce255e08-43c3-4911-be26-b93e2d591528.mp4"
    }
}
```

こんな感じのログが出力され、動作が確認できました。