quickstart.js
5.42 KB
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
var fs = require('fs');
var readline = require('readline');
var google = require('googleapis');
var googleAuth = require('google-auth-library');
var SCOPES = [
'https://www.googleapis.com/auth/calendar.readonly', // 캘린더 정보의 읽기 권한? 입니다.
'https://www.googleapis.com/auth/calendar' // 캘린더 정보의 편집 권한? 입니다.
];
var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
process.env.USERPROFILE) + '/.credentials/';
// 토큰이 저장될 디렉토리
var TOKEN_PATH = TOKEN_DIR + 'calendar-nodejs-quickstart.json';
// 토큰 파일 명
fs.readFile('client_secret.json', function processClientSecrets(err, content) {
// 로컬의 client_secret.json 파일을 읽고 'authorize' 함수 실행
if (err) {
console.log('Error loading client secret file: ' + err);
return;
}
authorize(JSON.parse(content), listEvents);
});
function authorize(credentials, callback) {
var clientSecret = credentials.web.client_secret;
var clientId = credentials.web.client_id;
var redirectUrl = credentials.web.auth_provider_x509_cert_url;
// client_secret.json 파일에서 시크릿키, 클라이언트 아이디, 리다이렉트 URI를 받습니다.
// 웹 어플리케이션으로 만들었을 때에는 'installed' -> 'web' 으로 수정합니다.
// ex 'var clientSecret = credentials.web.client_secret;'
var auth = new googleAuth();
var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
fs.readFile(TOKEN_PATH, function(err, token) {
// 앞서 지정한 디렉토리와 파일명으로 토큰 파일을 읽습니다.
if (err) {
getNewToken(oauth2Client, callback); // 토큰이 없다면 만듭니다.
} else {
oauth2Client.credentials = JSON.parse(token); // 토큰이 있다면 정보를 객체에 담습니다.
callback(oauth2Client);
}
});
}
function getNewToken(oauth2Client, callback) {
var authUrl = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES
});
// 브라우저에 'authUrl'의 링크로 접근하여 데이터 접근에 동의한 후 리다이렉트 되는 URL의
// 'code=' 다음 부분을 복사합니다.
console.log('Authorize this app by visiting this url: ', authUrl);
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 복사한 'code=' 다음 부분을 입력합니다.
// 로컬에서 테스트 할때에는 code= 다음 부분의 값이 URL 인코딩이 되어 있을 수 있으니
// URL 디코딩한 후에 입력합니다.
rl.question('Enter the code from that page here: ', function(code) {
rl.close();
oauth2Client.getToken(code, function(err, token) {
if (err) {
console.log('Error while trying to retrieve access token', err);
return;
}
oauth2Client.credentials = token;
storeToken(token);
callback(oauth2Client);
});
});
}
function storeToken(token) {
try {
fs.mkdirSync(TOKEN_DIR);
} catch (err) {
if (err.code != 'EEXIST') {
throw err;
}
}
fs.writeFile(TOKEN_PATH, JSON.stringify(token)); // 토큰을 만듭니다.
console.log('Token stored to ' + TOKEN_PATH);
}
function listEvents(auth) {
// 토큰 인증이 완료되면 최종적으로 실행되는 함수 입니다.
// 아래의 예제는 구글 캘린더에 등록된 이벤트 10개의 정보를 출력합니다.
var calendar = google.calendar('v3');
calendar.events.list({
auth: auth,
calendarId: 'primary', // 이곳에 이벤트를 가져올 캘린더 id를 입력해야 합니다.
timeMin: (new Date()).toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime'
}, function(err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
var events = response.items;
if (events.length == 0) {
console.log('No upcoming events found.');
} else {
console.log('Upcoming 10 events:');
for (var i = 0; i < events.length; i++) {
var event = events[i];
var start = event.start.dateTime || event.start.date;
console.log('%s - %s', start, event.summary);
}
}
});
// 다음은 구글 캘린더에 'CHEOLGUSO' 라는 이름의 캘린더가 있는지 확인하여
// 없다면 만들고 있다면 삭제해보겠습니다.
calendar.calendarList.list({
auth : auth
}, function(err, calendarList){
if(err) console.log(err);
var deleteCalendarId; // 캘린더 삭제를 위한 아이디 변수
var isCGSCalendar = false; // 'CHEOLGUSO' 캘린더가 존재하는지 확인하기 위한 변수
// 'CHEOLGUSO' 캘린더가 있는지 확인
for(var i=0; i<calendarList.items.length; i++){
if(calendarList.items[i].summary === 'CHEOLGUSO'){
isCGSCalendar = true;
deleteCalendarId = calendarList.items[i].id;
}
}
if(isCGSCalendar){
// 'CHEOLGUSO' 캘린더가 있다면 캘린더를 지움
calendar.calendars.delete({
auth : auth,
calendarId : deleteCalendarId
}, function(err, calendars){
if(err) console.log(err);
});
}else{
// 'CHEOLGUSO' 캘린더가 없다면 캘린더를 만듬
calendar.calendars.insert({
auth : auth,
resource : {
summary : 'CHEOLGUSO'
}
}, function(err, calendars){
if(err) console.log(err);
});
}
});
}