Evernote APIで画像URLから画像投稿する（Node.js）

## はじめに
この記事では[Evernote API](https://dev.evernote.com/)を利用して、画像URLから画像データをEvernoteに投稿するソースコードを紹介します。

テキストデータを投稿したい場合は、[前回の記事](https://qiita.com/Hirosaji/items/e3c2ace788800cdc7cee)をご覧ください。

## ソースコード
Sandbox環境のEvernoteに画像データを投稿するソースコードです。
対象とする画像データには、[前回の記事](https://qiita.com/Hirosaji/items/e3c2ace788800cdc7cee)で取得していたTumblrの投稿データを用いました。

Evernote APIのDeveloper Tokenを取得していない方は、以下のページより取得してください。

- [Developer Tokens - Evernote Developers](https://dev.evernote.com/doc/articles/dev_tokens.php)

以下、ソースコード。

```js: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;
}
```

## 参考サイト
- [Evernote Pythonから画像つきノートを作成する時の注意点](http://wararyo.blogspot.com/2015/07/evernote-python.html)
- [Creating Notes - Evernote Developers](https://dev.evernote.com/doc/articles/creating_notes.php)
- [ENML - Evernote Developers](http://dev.evernote.com/doc/articles/enml.php)

## 実行結果
[前回の記事](https://qiita.com/Hirosaji/items/e3c2ace788800cdc7cee)で取得していたTumblr APIの投稿データを対象に実行した結果は、以下の通りです。

### コマンドライン
```console
$ node postImg2Evernote.js
Posted: 「モチ肌」/「カナヘイ」のイラスト [pixiv]
Posted: 「くつろぎタイム」/「カナヘイ」のイラスト [pixiv]
Posted: 「タイムハート」/「やじるし」のイラスト [pixiv]
...
..
.
```

ソースコードを実行すると、画像URLをまとめたJSONから次々とEvernoteに画像を投稿し始めます。

### Evernoteマイページ
<img src="https://qiita-image-store.s3.amazonaws.com/0/162655/5a8bfbdd-c2b0-68de-5c9e-80b38958e712.png" width="500px">

ソースコード実行後、Evernoteのマイページにも次々と画像が投稿されていきます。
Evernote API、覚えると便利ですね...。