node 印象笔记 上传图片

58 min read
const http = require('http')
const crypto = require('crypto')
const EverNote = require('evernote');

const client = new EverNote.Client({
  sandbox: false,
  china: true,
  token: '你的token咯'
})
const noteStore = client.getNoteStore('生成token时会自动有个链接')


http.createServer(function(req, res) {
  console.log(req.url)
  if (req.url.startsWith('/snapshot')) {
    return uploadImageToEverNote(req, res)
  }
  res.end('hello world')
}).listen(4000)


function getBody(req) {
  return new Promise((resolve, reject) => {
    let rawData = '';
    req.on('data', (chunk) => { rawData += chunk; });
    req.on('end', () => {
      try {
        const parsedData = JSON.parse(rawData)
        resolve(parsedData)
      } catch (e) {
        reject(e.message)
        console.error(e.message);
      }
    })
  })
}

async function uploadImageToEverNote(req, res) {
  const body = await getBody(req)
  let nBody = `<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
  <en-note>
  `;
 
  // Create note object
  const ourNote = new EverNote.Types.Note();
  ourNote.title = body.title;

  const resources = body.resources
  const noteResources = []
  if (resources && resources.length > 0) {
    nBody += "<br /><br />";

    for (let resource of resources) {
      // 使用的base64上传,也可以在Server端保存
      const buffer = new Buffer(resource.replace('data:image/jpeg;base64,', ''), 'base64')
      const md5 = crypto.createHash('md5');
      md5.update(buffer);
      const hexhash = md5.digest('hex');
      nBody += `<en-media type="image/jpeg" hash="${hexhash}" />`
      const resourceBody = new EverNote.Types.Resource()
      resourceBody.mime = 'image/jepg' // 需要正确设置,不然可能是被已附件形式,而不是展示图片
      const resourceData = new EverNote.Types.Data()
      resourceData.body = buffer
      resourceData.size = buffer.length
      resourceBody.data = resourceData
      noteResources.push(resourceBody)
    }
  }
  ourNote.resources = noteResources
  ourNote.content = nBody + '</en-note>';
 
  const noteRes = await noteStore.createNote(ourNote).catch(err => console.error(err));
  console.log(noteRes.resources)
  res.setHeader('content-type', 'application/json')
  res.end('{done: true}')
}