EvernoteのAPIでアップロード容量をチェック

evernote-logoEvernote で調子に乗ってガンガンアップロードしていたら、月半ばで早々と月間のアップロード容量に到達してがっかり、ということを何度も繰り返さなくて済むように、日々の使用状況を Evernote Cloud API から取得してみた。

作業の流れ

  1. 環境の構築
  2. Cloud API のアカウントを取得
  3. API を利用

環境の構築

evernote の Python SDK を利用する。

まずは SDK が依存する OAuth ライブラリをインストール

$ pip install oauth2

次に SDK をインストール

$ git clone https://github.com/evernote/evernote-sdk-python.git
$ cd evernote-sdk-python
$ python setup.py install

Cloud API のアカウントを取得

API 検証用の sandbox が用意されているので、次の URL からテストアカウントを登録する。

https://sandbox.evernote.com/

今回の場合、API はあくまでも個人用途。
このようなケースでは OAuth 認証ではなく、長い有効期間が設定されたトークン(Developer token)を使いまわして認証できる。

Using developer tokens
If you are building a script or application that will only access your own personal Evernote account, then you don’t need to implement OAuth. Instead, you can get a developer token that will allow you to use the API to access your own personal Evernote account.

http://dev.evernote.com/start/core/authentication.php#devtoken

次の URL から Devloper Token を取得。

https://sandbox.evernote.com/api/DeveloperToken.action

ついでに本番向けの Devloper Token は次の URL から取得。

https://www.evernote.com/api/DeveloperToken.action

evernote-developer-token

APIの利用

Developer Token を利用して API からアップ容量を取得する。SDK にある次のサンプルコードをベースにする。

evernote-sdk-python/sample/client/EDAMTest.py

ちなみに EDAM は Evernote Data Access and Management のアクロニム。

クライアントの初期化

個人目的なので、OAuth ではなく 取得した Developer Token で認証する。
auth_token に取得したトークンを設定

import evernote.edam.userstore.constants as UserStoreConstants
from evernote.api.client import EvernoteClient
# Real applications authenticate with Evernote using OAuth, but for the
# purpose of exploring the API, you can get a developer token that allows
# you to access your own Evernote account. To get a developer token, visit
# https://sandbox.evernote.com/api/DeveloperToken.action
auth_token = "your developer token"
if auth_token == "your developer token":
    print "Please fill in your developer token"
    print "To get a developer token, visit " \
        "https://sandbox.evernote.com/api/DeveloperToken.action"
    exit(1)
# Initial development is performed on our sandbox server. To use the production
# service, change sandbox=False and replace your
# developer token above with a token from
# https://www.evernote.com/api/DeveloperToken.action
client = EvernoteClient(token=auth_token, sandbox=True)

バージョンのチェック

サーバのサポートする API バージョンでクライアントがアクセスしていることを確認。

user_store = client.get_user_store()
version_ok = user_store.checkVersion(
    "Evernote EDAMTest (Python)",
    UserStoreConstants.EDAM_VERSION_MAJOR,
    UserStoreConstants.EDAM_VERSION_MINOR
)
print "Is my Evernote API version up to date? ", str(version_ok)
print ""
if not version_ok:
    exit(1)

正常であれば、version_okTrue を返す。

SDK が古いまま放置されていたりすると False がかえってくる。

ユーザ情報の取得

次に、目的のユーザー情報を取得する。

user = user_store.getUser()
note_store = client.get_note_store()
sync_state = note_store.getSyncState()
print '%s,%s,%s,%s' % (user.accounting.uploadLimit,
                       user.accounting.uploadLimitEnd,
                       sync_state.uploaded,
                       sync_state.currentTime,
                      )

どうやれば必要な情報をとれるのかは、検索するなりマニュアルをよむなりリファレンスを grep するなりする。

月間アップロード上限と月間アップロード済みサイズは NoteStore.SyncStateUser.Accounting 経由で次のようにして取得できた。各値の意味は以下。

Accounting.uploadLimit

The number of bytes that can be uploaded to the account in the current month. For new notes that are created, this is the length of the note content (in Unicode characters) plus the size of each resource (in bytes). For edited notes, this is the the difference between the old length and the new length (if this is greater than 0) plus the size of each new resource.

Accounting.uploadLimitEnd

The date and time when the current upload limit expires. At this time, the monthly upload count reverts to 0 and a new limit is imposed. This date and time is exclusive, so this is effectively the start of the new month.

SyncState.currentTime

The server’s current date and time.

SyncState.uploaded

The total number of bytes that have been uploaded to this account in the current monthly period. This can be compared against Accounting.uploadLimit (from the UserStore) to determine how close the user is to their monthly upload limit. This value may not be present if the SyncState has been retrieved by a caller that only has read access to the account.

実行

実行すると、次のように CSV 形式で出力される。

1073741824,1363676400000,86311960,1362837603712

あとは、API の通信先を本番に変更し(auth_token の変更と EvernoteClient の sandbox フラグを False にする)、データを蓄積して適当な閾値でアラートを上げるようにすれば OK。

Advertisements
Tagged with:
Posted in python, web

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: