본문 바로가기
에버노트 API 사용하기

스프링 프레임워크에서 에버노트 API 사용하기 - 글쓰기

by 자유코딩 2018. 8. 1.

이번 글에서는 에버노트 API 를 사용해서 글을 써보도록 하겠습니다.

 

동영상 강의를 녹화했습니다. 제 유튜브 채널에서 보실 수 있습니다.

 

https://www.youtube.com/watch?v=AFqX2-F2mwM

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.simple.service;
 
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
 
import com.evernote.auth.EvernoteAuth;
import com.evernote.auth.EvernoteService;
import com.evernote.clients.ClientFactory;
import com.evernote.clients.NoteStoreClient;
import com.evernote.edam.type.Data;
import com.evernote.edam.type.Note;
import com.evernote.edam.type.Resource;
import com.evernote.edam.type.ResourceAttributes;
import com.simple.dao.Mapper;
import com.simple.domain.FreeboardVO;
 
public class EvernoteSubscribeService implements Service {
 
    private void writeIn(String title ,String content,String fileName,String filePath) throws Exception{
        String developerToken = "여러분의 토큰";
        
        EvernoteAuth evernoteAuth = new EvernoteAuth(EvernoteService.SANDBOX, developerToken);//SandBOX구분,개발자 고유 토큰 입력
        ClientFactory factory = new ClientFactory(evernoteAuth);//에버노트 인증 정보가 담긴 변수로 clientFactory 생성  
        NoteStoreClient noteStore = factory.createNoteStoreClient();//factory 변수를 사용해서 noteStore 변수 초기화
        //noteStore는 NoteStoreClient 타입의 변수이다.
        //noteStore 변수를 사용해서 주로 노트에 쓰기,읽기를 하게 된다.
        
        //31번 줄까지는 에버노트에 연결하기 위한 정보를 설정한다고 보면 된다.
        
        Note note = new Note();//이제 기록할 Note를 하나 생성한다
        note.setTitle(title);//노트의 제목을 입력한다.
        
        String mimeType = "image/png";//이 부분은 파일의 타입을 지정하기 위한 문자열 변수이다.
        //파일 타입이 다양해진다면 if나 switch, 정규표현식을 활용해서 다양화해야 한다.
        
        Resource resource = new Resource();//Resource를 하나 생성한다.
        
        if (fileName.length()>0) {//파일 이름이 있다면 실행한다.
            resource.setData(readFileAsData(filePath));//아래 readFileAsData 함수를 호출해서 Data 를 하나 만든다.
            resource.setMime(mimeType);//mimeType을 집어넣는다.
            ResourceAttributes attributes = new ResourceAttributes();
            attributes.setFileName(fileName);//파일 이름을 지정한다.
            resource.setAttributes(attributes);
            note.addToResources(resource);//노트에 resource를 추가한다.
        }//이 if문은 resource의 정보를 설정하는 과정이다.
        //이후 이 resource를  hex로 변환해서 노트에 집어넣게 된다.
        
        String hashHex = bytesToHex(resource.getData().getBodyHash());//resource를 hex로 변환한다.
        
        String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\">"
            + "<en-note>"
            + "<span style=\"color:green;\"> 스크랩 한 글"+content+"</span><br/>"
            + "<en-media type=\"image/png\" hash=\"" + hashHex + "\"/>"
            + "</en-note>";
        note.setContent(xmlContent);//여기 xml 이 노트에 들어가는 핵심부분이다.
        //API 에서는 <en-note></en-note> 태그 안에 있는 내용을 노트에 집어넣을 내용으로 인식한다.
        //즉 , 이 부분을 조작해야 노트 안에 넣을 내용을 조작 할 수 있다.
        //<en-media type=\"image/png\" hash=\"" + hashHex + "\"/>" 이 부분에는 파일의 hex 데이터가 들어간다.
        //파일이 png가 아니라면 type도 조정한다.
      
        Note createdNote = noteStore.createNote(note);//createNote를 호출해서 노트를 생성한다.
        String newNoteGuid = createdNote.getGuid();//Guid는 출력하면 cd키 같은 숫자가 출력된다.
        //현재 생성한 노트의 고유 값이라고 생각하면 된다.
 
        System.out.println("Successfully created a new note with GUID: "
            + newNoteGuid);
        System.out.println();
        
    }
    
    @Override
    public Map<String, Object> service(HttpServletRequest request, Mapper mapper){
        
        int freeboard_id = Integer.parseInt(request.getParameter("freeboard_id"));
        FreeboardVO freeboardVO = mapper.freeboardInfo(freeboard_id);
        
        String file_path = request.getSession().getServletContext().getRealPath("/resources");
        if (freeboardVO.getFreeboard_fileName().length()>0) {
            file_path = file_path +"\\"+freeboardVO.getFreeboard_fileName();
        }
        
        try {
            writeIn(freeboardVO.getFreeboard_title(), freeboardVO.getFreeboard_content(),
                    freeboardVO.getFreeboard_fileName(), file_path);
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
 
        Map<String,Object> map = new HashMap<>();
        map.put("page""main");
 
        return map;
    }
 
 
    private static Data readFileAsData(String filePath) throws Exception {//file을 읽고 Data타입 변수를 반환한다.
        FileInputStream in = new FileInputStream(filePath);
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        byte[] block = new byte[10240];
        int len;
        while ((len = in.read(block)) >= 0) {
            byteOut.write(block, 0, len);
        }
        in.close();
        byte[] body = byteOut.toByteArray();
 
        Data data = new Data();
        data.setSize(body.length);
        data.setBodyHash(MessageDigest.getInstance("MD5").digest(body));
        data.setBody(body);
 
        return data;
    }
 
    public static String bytesToHex(byte[] bytes) {//byte배열을 읽고 hex String 을 반환한다. 
        StringBuilder sb = new StringBuilder();
        for (byte hashByte : bytes) {
            int intVal = 0xff & hashByte;
            if (intVal < 0x10) {
                sb.append('0');
            }
            sb.append(Integer.toHexString(intVal));
        }
        return sb.toString();
    }
}
 
 
cs

 

 

일단 글을 보실 분들을 위해서 주석을 달았습니다.

 

evernote 측에서 제공하는 예제를 재구성 했습니다.

댓글