43
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PepperのHTTP通信にRequestsを使う

Posted at

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](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アドレスでアクセスできるようになります。

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

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

43
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?