Googleドキュメントにファイルをアップロードしたりダウンロードしたりする方法をメモしておく。言語はPython。
準備
gdata-python-client から gdata-2.0.14.zip をダウンロードする。
$ tar zxvf gdata-2.0.14.tar.gz $ cd gdata-2.0.14 # setup.py install
日時処理を拡張するためモジュール python-dateutil もインストールする。ドキュメントの更新日時は文字列になっているので datetime 型に変換する処理に必要。
Google ドキュメントにログイン
ログイン方式は複数あるが、ここでは ClientLogin でログインする方法を示す。
class gclient(object):
def login(self, username, password):
client = gdata.docs.client.DocsClient()
client.ssl = True
client.http_client.debug = False
try:
client.ClientLogin(username, password, client.source, service='writely')
except gdata.client.BadAuthentication:
exit('Users credentials were unrecognized')
return False
except:
exit('Login Error')
return False
# Login succeeded.
self.client = client
return True
※ スプレッドシートは別サービスとなっている。client.ClientLogin の引数 service='writely'をservice='wise'にすること。
アップロードする
client.Upload を使う。このAPIはアップロードできるファイルタイプに制限がある。
Note: This feature is only available to Google Apps for Business accounts.
おそらく以前の Google ドキュメントでは Document, Spreadsheet, Presentation しか扱えなかったためだと思われる。現在の Google ドキュメントでは任意のファイルタイプが扱える。任意のファイルタイプをアップロードするには resumable protocol を使う。
def PutDoc(self, filename, title):
content_type = GetMimeType(filename)
if content_type is None:
content_type = 'application/octet-stream'
ms = gdata.data.MediaSource(file_path = filename,
content_type = content_type,
content_length = os.path.getsize(filename))
ru = ResumableUploader(client = self.client,
file_handle = ms.file_handle,
content_type = ms.content_type,
total_file_size = ms.content_length,
desired_class = gdata.docs.data.DocsEntry)
u = '/feeds/upload/create-session/default/private/full/?convert=false'
new_entry = gdata.docs.data.DocsEntry(title = atom.data.Title(text = title))
updated_entry = ru.UploadFile(resumable_media_link = u, entry = new_entry)
return updated_entry
URI に引数 convert=false を付けると、Google ドキュメントネイティブ形式への変換が無効となる。Word や Excel で作成したドキュメントをそのままアップロードしたい場合は変換を無効にすること。
一覧を取得する
ファイルの一覧を取得するには client.GetDocList を使う。引数 uri にパラメータを指定でき、特定のフォルダ(コレクション)の内容や全文検索の結果を得ることができる。以下はルートフォルダにあるドキュメントの一覧を得る。showfolders=false を指定し、配下にあるサブフォルダを表す項目は戻り値に含まれないようにしている。
def GetRootColl(self):
u = gdata.docs.client.DOCLIST_FEED_URI + 'folder%3Aroot/contents?showfolders=false'
feed = self.client.GetDocList(uri = u)
for entry in feed.entry:
print "%s , %s , %s" % (entry.title.text, entry.GetDocumentType(), entry.resource_id.text)
print " in %s" % ([f.title for f in entry.InFolders()])
実際に取得してみるとルートフォルダには無いドキュメントを含むことがある。どうやら一度ブラウザでルートフォルダにアップした後 "Organize" で別のフォルダを指定した場合に起こるようだ。(所属フォルダからルートフォルダが削除されない?)
ダウンロードする
client.Download を使う。Google ドキュメントネイティブ形式を doc や xls に変換してダウンロードするには client.Export を使う。以下は client.Download 使った例で、一致するタイトルのドキュメントをダウンロードする。
def GetDoc(self, title):
u = gdata.docs.client.DOCLIST_FEED_URI + 'folder%3Aroot/contents?showfolders=false'
feed = self.client.GetDocList(uri = u)
for entry in feed.entry:
if entry.title.text == title:
print 'download %s %s' % (entry.title.text, entry.GetDocumentType())
self.client.Download(entry, entry.title.text)
return

0 コメント:
コメントを投稿