Pepper의 HTTP 통신에 Requests 사용

8859 단어 Pepper
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 통신을 하는 것은, 요청 가 정평과 같기 때문에 이것을 사용하기로 했습니다.
> 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용 Twitter 박스 만들기
  • [Pepper] 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를 열면



    라고 듣기 때문에, 「모두에는 예(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/에 저장되어 있다고 해서 그것을 htp://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));
    
    

    파이썬 커스텀 박스를 만들고 위 코드를 움직이면
    [INFO ] behavior.box :log:287 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1140386960576864__root__videoUpload_1: {
        "item": {
            "video": "http://localhost:3000/uploads/ce255e08-43c3-4911-be26-b93e2d591528.mp4"
        }
    }
    

    이런 느낌의 로그가 출력되어 동작을 확인할 수 있었습니다.

    좋은 웹페이지 즐겨찾기