2011年8月23日火曜日

Google ドキュメントにファイルをアップロード,ダウンロードする方法 #googledocs

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.

Uploading files of any type

おそらく以前の 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 で作成したドキュメントをそのままアップロードしたい場合は変換を無効にすること。

変換を有効(下)、無効(上)でdoc形式ファイルをアップロードした場合

一覧を取得する

ファイルの一覧を取得するには 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 コメント:

コメントを投稿