Help us understand the problem. What is going on with this article?

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした