드롭박스 API를 활용해 파일 업로드하기

오늘은 회사에서 로컬 PC와 연동하지 않고, 곧바로 드롭박스에 파일을 업로드하는 파이썬 스크립트를 짜봤다.

드롭박스는 API 문서를 잘 제공하고 있어서 나 같은 파이썬 초보도 금방 이해할 수 있었다. 다만 업로드 경로를 한글로 설정할 때 시행착오가 있었기 때문에 꽤 애를 먹었다. 준비 과정과 예제 코드를 포스팅으로 남겨놓고자 한다.

참고로 드롭박스 API는 v1이 2017년 여름에 서비스를 종료하고, v2를 지원하고 있다. 그래서 본 포스팅도 v2를 기준으로 설명한다.


드롭박스 API 활용 준비

드롭박스 API를 활용하려면 을 만들고 access token을 받아야 한다.

아래 드롭박스 개발자 사이트에 접속해서 우측 상단에 보이는 App Console로 들어가 로그인 한 후 Create app을 클릭하면 된다.

그러면 콘솔 화면에 방금 만든 앱이 생성되는 걸 확인할 수 있다. 들어가보면 Settings 탭이 있는데 여기서 Generated access token 부분만 봐도 된다. Generate 버튼을 눌러 생성된 토큰을 확인해놓자.

준비는 끝났다.


드롭박스 API 파이썬 활용 방법

파이썬으로 드롭박스 API를 활용하는 방법은 2가지 선택지가 있다.

  1. Python SDK를 설치해서 dropbox 모듈을 불러오는 방법
  2. REST API를 활용하는 방법

둘 다 다뤄보겠다. 참고로 난 2번에서 한글 인코딩 문제 때문에 상당히 애를 먹었다. 그래서 본 예제도 파일명과 드롭박스 경로를 모두 한글로 소개한다.

1) Python SDK를 설치해서 dropbox 모듈을 불러오는 방법

SDK를 다운받아 설치하는 방법은 단순하다. 맨날 하던 거.

pip install dropbox

파이썬 예제 스크립트는 아래와 같다. access_token에는 위에서 받아놓은 토큰 값을 입력해주면 된다.

import dropbox
dbx = dropbox.Dropbox(access_token)

filename = "테스트파일.txt"
pathname = "/테스트폴더/테스트파일.txt"

with open(filename, "rb") as f:
    dbx.files_upload(f.read(), pathname, mode=dropbox.files.WriteMode.overwrite)

파일을 업로드할 경로는 루트 폴더를 기준으로 하여 슬래시(/)로 시작하면 된다. 단, 끝에 파일명까지 다 적어줘야 한다.

파일을 업로드 할 때는 같은 이름의 파일이 이미 존재할 때 어떻게 할지 WriteMode(add, overwrite, update)를 통해 결정할 수 있다. 본 예제에서는 overwrite로 덮어 썼다.

더 다양한 기능을 활용하고 싶다면 이곳을 참고하자.


2) REST API를 활용하는 방법

파이썬으로 REST API를 호출할 때 많은 사람들이 requests 혹은 urllib(urllib2) 중 하나를 사용한다. 그러나 굳이 따지자면 requests가 대세다. 난 초보니 대세를 따른다.

이제 위와 동일한 작동을 하는 예제 코드를 적어본다.

import requests
import json

filename = "테스트파일.txt"
pathname = "/테스트폴더/테스트파일.txt"

url = "https://content.dropboxapi.com/2/files/upload"

headers = {
    "Authorization": "Bearer " + access_token,
    "Content-Type": "application/octet-stream",
    "Dropbox-API-Arg": json.dumps({"path": pathname, "mode": {".tag": "overwrite"}})
    }

with open(filename, "rb") as f:
    r = requests.post(url, headers=headers, data=f.read())

headers에서 Dropbox-API-Arg를 주의 깊게 보자. 경로가 영어였을 때는 {“path”: pathname }으로 쓰면 끝나는 문제였다. 근데 한글이 들어간 경로는 계속 로컬 인코딩 에러가 났다. 망할 윈도우……

결국 구글링 끝에 답을 얻었다. 나와 비슷한 고민을 하는 사람이 있었던지라 드롭박스 깃헙에 드롭박스 개발자 Greg라는 사람이 직접 json.dumps로 해결하라는 답변을 했다. 파이썬 딕셔너리, 바이너리, 유니코드, 파싱 어쩌구 할 때 발생하는 인코딩 문제였다. 나도 깊이는 모른다. 아무튼 고민 해결!

REST API로 더 다양한 기능을 활용하고 싶다면 이곳을 참고하자. 몇가지 옵션을 넣고 curl, python, HTTP 중 하나를 선택하면 아래와 같이 예제코드를 직접 작성해주기도 한다. 기가 막히게 잘 만들어놨다.

파일 업로드 코드를 짜달라고 할 때
업로드 경로를 한글로 작성하면 이렇게 보인다.

아무튼 위 스크립트들을 실행하면 아래와 같이 파일이 잘 올라가고, 혹은 덮어써지는 걸 확인할 수 있다.

만약 공유 폴더에 파일을 올리고 싶다면 미리 폴더 만들어 공유 설정까지 해놓은 뒤 똑같이 경로만 그쪽으로 지정해주면 된다. 테스트 해보니 매우 잘 올라간다.

오늘의 개고생과 블로그 포스팅 끝.

나도 파이썬 잘하고 싶다.

추천 글

“드롭박스 API를 활용해 파일 업로드하기”의 2개의 댓글

댓글 남기기