Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
45
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

PepperのHTTP通信にRequestsを使う

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

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

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
45
Help us understand the problem. What are the problem?