Posted at

PepperのHTTP通信にRequestsを使う

More than 3 years have passed since last update.

Pepper ニコニコ超会議 参加作品選抜ハッカソンに参加した時のメモ。

「目の前にいる人に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で使えるらしいのですが、もっと簡単に使えるライブラリがいい。。ググるとPythonでHTTP通信をするのは、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ボックス内での利用方法

を参考にしました。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

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


ライブラリのimport

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

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のサンプルコードそのままです。

※余談ですが、RailsのWEBrickは

bin/rails s -b 0.0.0.0

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

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"
}
}

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