Node.js
Evernote
EvernoteAPI

Evernote APIで画像URLから画像投稿する(Node.js)


はじめに

この記事では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、覚えると便利ですね...。