2015年7月4日土曜日

Evernote Pythonから画像つきノートを作成する時の注意点

日常でもらう書類をスキャンして、Evernoteで管理できるツールを、RaspberryPiで作ったのですが、
その時にPythonからEvernoteに投稿するのにたくさんハマってしまったので、PythonからEvernoteを触る時の注意点をまとめておきます。

■個人利用ならOAuth認証は最後まで必要なし

ここに来た人なら、Evernoteにはサンドボックス用のサーバーがあり、そこでテストをしたうえで本番環境に移行することが推奨されている、ということはご存知かと思います。

しかし、
個人利用に限り、本番環境(プロダクション用サーバー)であっても、OAuth認証をする必要はありません。

ええ、僕はこれを知らずに頑張ってOAuth認証しようとしていましたよ。
公式ガイドに書いてありました。

認証 - Evernote Developers https://dev.evernote.com/intl/jp/doc/articles/authentication.php#devtoken

本番環境にもデペロッパートークンが存在し、それを使うことでOAuth認証の手間が省けるようです。

■公式サンプルコードが例外を吐く

PythonでEvernoteを触ろうと思うとき、まず初めに以下のページに辿りつくと思います。

Evernote Cloud API — Python クイックスタートガイド - Evernote Developers https://dev.evernote.com/intl/jp/doc/start/python.php

このページに記載されているサンプルコードは、import文が完璧ではありません。
詳しくは後述するコードに書いてある通りですが、
from evernote.api.client import EvernoteClient
だけでは、 ノートの作成はできません!

■本番環境用のデベロッパートークンが使えない!

大体が完成、サンドボックスサーバーでの動作テストも終了した後、
デペロッパートークンをサンドボックス用のものから本番用のものに書き換えますが、

なぜか本番用のデペロッパートークンでは認証エラーが発生して投稿できない。

原因をいろいろ探っていたら、原因はコレでした。

EvernoteClientクラスのコンストラクタのsandbox変数の初期値はTrue!!!

これに気づいていませんでした。
なんか、Booleanの変数の初期値はFalseっていう感じがしませんか?
その先入観に見事にハマったわけですね。

つまり、
client = EvernoteClient(token=dev_token)
という記述に対しては、sandbox=Trueであり、Evernoteライブラリはサンドボックス用のサーバーに対して操作を行おうとします。

デベロッパートークンが本番用サーバーの物である場合は、
client = EvernoteClient(token=dev_token, sandbox=False)
と、明示してあげなきゃいけないんですね。

■Resouceのハッシュは16進数の文字列

いや、普通ならハマらないことですが、
後述する二つのページからコードをコピペしていった結果、md5ハッシュを16進数の文字列に変換したのをさらに16進数の文字列に変換してたので、
画像の投稿は成功したのに、ノートにはそれが張り付けられていない、という謎現象が起きました。

■サンプルコード

以上を考慮したサンプルコードを上げておきます。
特にimport文ですかね、大事なのは。
もちろんこのままコピペしてあなたの作っているツールに使ってもらっても構いません。
また、このコードのほとんどは以下のサイトからのパクリスペクトです。

toever/toever.py at master · ngc224/toever · GitHub https://github.com/ngc224/toever/blob/master/toever/toever.py

ノートの作成 - Evernote Developers https://dev.evernote.com/intl/jp/doc/articles/creating_notes.php

■つくったもの

頭でも言った通り、作ったものは、文書を、パソコン無しで、Evernoteを使って管理できるツールです。
ScanSnapとRaspberry Piを使っています。

便利ですよ。是非作ってみてはいかがでしょうか。


0 件のコメント:

コメントを投稿

Amazon