はじめに
この記事ではEvernote APIを利用して、画像URLから画像データをEvernoteに投稿するソースコードを紹介します。
テキストデータを投稿したい場合は、前回の記事をご覧ください。
ソースコード
Sandbox環境のEvernoteに画像データを投稿するソースコードです。
対象とする画像データには、前回の記事で取得していたTumblrの投稿データを用いました。
Evernote APIのDeveloper Tokenを取得していない方は、以下のページより取得してください。
以下、ソースコード。
postImg2Evernote.js
var Evernote = require('evernote'),
fs = require('fs'),
sleep = require('system-sleep'),
request = require('sync-request'),
crypto = require('crypto');
var DEVELOPER_TOKEN = "**********";
var option = { token: DEVELOPER_TOKEN, sandbox: true },
client = new Evernote.Client(option),
noteStore = client.getNoteStore();
// Read post data files in data dir
var dataDirPath = './data/';
fs.readdir(dataDirPath, function(err, fileNameList){
if (err) throw err;
// handle each post data
fileNameList.forEach(fileName => {
var jsonData = fs.readFileSync(dataDirPath + fileName, 'utf-8');
JSON.parse(jsonData).posts.forEach(post => {
// Post to Evernote if img post
if(post.type === "photo") {
createNote(post.summary, post.photos);
}
});
});
});
// Upload post to Evernote
function createNote(postTitle, postImgs) {
// Set ENML(Evernote Markup Language)
var nBody = '<?xml version="1.0" encoding="UTF-8"?>';
nBody += '<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">';
nBody += "<en-note>";
var resources = [];
if(postImgs.length > 0) {
postImgs.forEach(imgInfo => {
var imgPath = imgInfo.original_size.url;
// Get data type
if(imgPath.indexOf('.jpg') != -1 || imgPath.indexOf('.JPG') != -1 || imgPath.indexOf('.jpeg') != -1 || imgPath.indexOf('.JPEG') != -1) var dataType = "image/jpeg";
else if(imgPath.indexOf('.png') != -1 || imgPath.indexOf('.PNG') != -1) var dataType = "image/png";
else if(imgPath.indexOf('.gif') != -1 || imgPath.indexOf('.GIF') != -1) var dataType = "image/gif";
// Get "Resouce"
var resource = getResource(dataType, imgPath);
resources.push(resource);
// Set "Resouce" hash
var md5 = crypto.createHash('md5');
md5.update(resource.data.body);
var hexhash = md5.digest('hex');
nBody += "<en-media type=\"" + resource.mime + "\" hash=\"" + hexhash + "\" /><br />";
});
nBody += "</en-note>";
}
else { nBody += "</en-note>"; }
// Create note object
var ourNote = new Evernote.Types.Note();
ourNote.title = postTitle;
ourNote.content = nBody;
ourNote.notebookGuid = "*****"; // evernote notebook guid
if(resources.length > 0) ourNote.resources = resources;
// Create Note by createNote method
noteStore.createNote(ourNote).then(function(note) {
console.log("Posted: " + note.title);
}).catch(function (err) {
console.log(err);
});
sleep(5000); // Wait 5 seconds
}
// Get image & Set to Evernote format
function getResource(dataType, imgPath) {
// get img data via async request
var response = request('GET', imgPath);
// set img data to evernote format
var data = new Evernote.Types.Data();
data.body = response.body;
// add img data info
var resource = new Evernote.Types.Resource();
resource.mime = dataType;
resource.data = data;
// add img file name
var attr = new Evernote.Types.ResourceAttributes();
attr.fileName = imgPath.match(".+/(.+?)([\?#;].*)?$")[1];
resource.attributes = attr;
return resource;
}
参考サイト
実行結果
前回の記事で取得していたTumblr APIの投稿データを対象に実行した結果は、以下の通りです。
コマンドライン
$ node postImg2Evernote.js
Posted: 「モチ肌」/「カナヘイ」のイラスト [pixiv]
Posted: 「くつろぎタイム」/「カナヘイ」のイラスト [pixiv]
Posted: 「タイムハート」/「やじるし」のイラスト [pixiv]
...
..
.
ソースコードを実行すると、画像URLをまとめたJSONから次々とEvernoteに画像を投稿し始めます。
Evernoteマイページ
ソースコード実行後、Evernoteのマイページにも次々と画像が投稿されていきます。
Evernote API、覚えると便利ですね...。