Help us understand the problem. What is going on with this article?

PepperのHTTP通信にRequestsを使う

More than 5 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"
    }
}

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

bugcloud
中学20年生ぐらい
http://bugcloud.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away