Evernote SDK for Python 3 を使ってノート情報を取得する

## 概要

- Evernote SDK for Python 3 を使って Evernote のノート情報を取得する
- 環境: Python 3.8.5 + Evernote SDK for Python 3 (evernote3 パッケージ) 1.25.14 + macOS catalina

## Evernote SDK for Python 3 について

現時点 (2020年9月27日現在) ではまだテスト的なものとなっており、Python 用の公式 SDK は Python 3 をサポートしていないとのこと。

[GitHub \- evernote/evernote\-sdk\-python3: Testing the Evernote Cloud API for Python 3](https://github.com/evernote/evernote-sdk-python3)

> This is a test SDK! The official Evernote SDK for Python doesn't support Python 3 yet; this repository is an experiment as we try to migrate.
> 
> This SDK contains wrapper code used to call the Evernote Cloud API from Python.

API Reference は [All Thrift declarations](https://dev.evernote.com/doc/reference/) にあるが、Python 用のものではないのでソースコードの該当箇所も合わせて確認したほうが良いかもしれない。

- [evernote\-sdk\-python3/client\.py at master · evernote/evernote\-sdk\-python3 · GitHub](https://github.com/evernote/evernote-sdk-python3/blob/master/lib/evernote/api/client.py)
- [evernote\-sdk\-python3/NoteStore\.py at master · evernote/evernote\-sdk\-python3 · GitHub](https://github.com/evernote/evernote-sdk-python3/blob/master/lib/evernote/edam/notestore/NoteStore.py)
- [evernote\-sdk\-python3/ttypes\.py at master · evernote/evernote\-sdk\-python3 · GitHub](https://github.com/evernote/evernote-sdk-python3/blob/master/lib/evernote/edam/notestore/ttypes.py)

## ライブラリのインストール

Evernote SDK for Python 3 をインストールする。

```
$ pip install evernote3==1.25.14
```

oauth2 もインストールする必要がある (依存関係で自動的にインストールされないため)。

```
$ pip install oauth2
```

## ノート情報を取得するサンプルコード

```py
from datetime import datetime, timezone, timedelta

# Evernote SDK for Python 3 を使う
from evernote.api.client import EvernoteClient
from evernote.edam.notestore.ttypes import NoteFilter, NotesMetadataResultSpec

# evernote.api.client.EvernoteClient を初期化
client = EvernoteClient(
  token   = 'YOUR_AUTH_ACCESS_TOKEN', # アクセストークンを指定
  sandbox = False # Sandbox ではなく Production 環境を使う場合は明示的に False を指定
)

# evernote.api.client.Store を取得
store = client.get_note_store()

# ノートブック evernote.edam.type.ttypes.Notebook のリストを取得
notebook_list = store.listNotebooks()
print(f'ノートブックの数: {len(notebook_list)}')

# evernote.edam.type.ttypes.Notebook を取り出す
for notebook in notebook_list:

  print(f'ノートブック名: {notebook.name}')

  # 取得するノートの条件を指定
  filter = NoteFilter()
  filter.notebookGuid = notebook.guid # ノートブックの GUID を指定

  # NoteMetadata に含めるフィールドを設定
  spec = NotesMetadataResultSpec()
  spec.includeTitle      = True
  spec.includeCreated    = True
  spec.includeAttributes = True

  # ノートのメタデータのリスト evernote.edam.notestore.ttypes.NotesMetadataList を取得
  notes_metadata_list = store.findNotesMetadata(
    filter,
    0, # offset 条件にヒットした一覧から取得したいインデックス位置を指定
    1, # maxNotes 取得するノート数の最大値。今回は最大で1つだけ取得する
    spec)

  print(f'ノートブックに含まれるノートの数: {notes_metadata_list.totalNotes}')

  # evernote.edam.notestore.ttypes.NoteMetadata を取り出す
  for note_meta_data in notes_metadata_list.notes:

    print(f'  ノートのタイトル: {note_meta_data.title}')

    # evernote.edam.type.ttypes.Note を取得
    note = store.getNote(
      note_meta_data.guid, # ノートの GUID を指定
      True, # withContent
      True, # withResourcesData
      True, # withResourcesRecognition
      True) # withResourcesAlternateData
    print(f'    タイトル: {note.title}')
    print(f'    作成日時: {datetime.fromtimestamp(note.created / 1000, timezone(timedelta(hours=9)))}')
    print(f'    内容(XHTML): {note.content[0:64]}') # 長いので先頭64文字だけ取り出す

    # メモに埋め込まれていたり添付されているメディアファイル情報を取り出す
    if note.resources is not None:
      # evernote.edam.type.ttypes.Resource を取り出す
      for resource in note.resources:
        print(f'    添付データファイル名: {resource.attributes.fileName}')
        print(f'      データタイプ: {resource.mime}')
```

## サンプルの実行例

サンプルコードを my_notes.py というファイル名で保存して実行。

```
$ python my_notes.py
ノートブックの数: 4
ノートブック名: Todoist
ノートブックに含まれるノートの数: 6
  ノートのタイトル: Completed Todoist Tasks
    タイトル: Completed Todoist Tasks
    作成日時: 2017-09-02 09:43:19+09:00
    内容(XHTML): <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "
ノートブック名: 音声データ
ノートブックに含まれるノートの数: 5
  ノートのタイトル: 五十音メッセージ
    タイトル: 五十音メッセージ
    作成日時: 2016-08-14 20:03:58+09:00
    内容(XHTML): <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE
    添付データファイル名: あいうえお.m4a
      データタイプ: audio/x-m4a
ノートブック名: webclip
ノートブックに含まれるノートの数: 2
  ノートのタイトル: サンプルページ
    タイトル: サンプルページ
    作成日時: 2015-03-19 17:34:03+09:00
    内容(XHTML): <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE
    添付データファイル名: None
      データタイプ: image/jpeg
    添付データファイル名: None
      データタイプ: image/png
ノートブック名: 技術系資料置場
ノートブックに含まれるノートの数: 15
  ノートのタイトル: ハッカソン資料
    タイトル: ハッカソン資料
    作成日時: 2018-02-23 15:26:58+09:00
    内容(XHTML): <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE
    添付データファイル名: IMG_2741.HEIC
      データタイプ: image/jpeg
    添付データファイル名: IMG_2618.HEIC
      データタイプ: image/jpeg
```

## 参考資料

- [Home \- Evernote Developers](https://dev.evernote.com/)
- [Evernote Cloud API — Python Quick\-start Guide \- Evernote Developers](https://dev.evernote.com/doc/start/python.php)
- [evernote3 · PyPI](https://pypi.org/project/evernote3/)
- [GitHub \- evernote/evernote\-sdk\-python3: Testing the Evernote Cloud API for Python 3](https://github.com/evernote/evernote-sdk-python3)
  - [evernote\-sdk\-python3/client\.py at master · evernote/evernote\-sdk\-python3 · GitHub](https://github.com/evernote/evernote-sdk-python3/blob/master/lib/evernote/api/client.py)
  - [evernote\-sdk\-python3/NoteStore\.py at master · evernote/evernote\-sdk\-python3 · GitHub](https://github.com/evernote/evernote-sdk-python3/blob/master/lib/evernote/edam/notestore/NoteStore.py)
  - [evernote\-sdk\-python3/ttypes\.py at master · evernote/evernote\-sdk\-python3 · GitHub](https://github.com/evernote/evernote-sdk-python3/blob/master/lib/evernote/edam/notestore/ttypes.py)
- [API Reference (All Thrift declarations) \- Evernote Developers](https://dev.evernote.com/doc/reference/)
- [Developer Tokens \- Evernote Developers](https://dev.evernote.com/doc/articles/dev_tokens.php)
- [Get an Auth Token \- Evernote Developers](https://dev.evernote.com/get-token/)
- [EvernoteのAPIを使ってみる \- kkobayashi\_a’s blog](https://kkobayashi-a.hatenablog.com/entry/20180529/p1)
- [Pythonで使って覚えるEvernote API \(1/6\)：CodeZine（コードジン）](https://codezine.jp/article/detail/10055)