Skip to content

Commit fe09f36

Browse files
committed
Add : getPosts / getPost / writePost function
1 parent cdf4571 commit fe09f36

File tree

3 files changed

+163
-9
lines changed

3 files changed

+163
-9
lines changed

app.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ program.parse(process.argv);
1010

1111
const crawler = new Crawler(program.username);
1212

13-
console.log(crawler.getPosts());
13+
console.log(JSON.stringify(crawler.parse()));

crawler/index.js

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
const axios = require('axios');
2-
const { PostQuery } = require('./query');
2+
const { join } = require('path');
3+
const fs = require('fs').promises;
4+
5+
const { PostsQuery, PostQuery } = require('./query');
36

47
class Crawler {
58
constructor(username) {
69
this.username = username;
10+
711
this.__grahpqlURL = 'https://v2.velog.io/graphql';
812
}
913

1014
async parse() {
1115
const posts = await this.getPosts();
16+
17+
posts.map(async(postInfo, i) => {
18+
const post = await this.getPost(postInfo.url_slug);
19+
20+
await this.writePost(post);
21+
console.log(`✅ " ${post.title} " 백업 (${i + 1}/${posts.length})`);
22+
});
23+
1224
}
1325

1426
async getPosts() {
@@ -27,18 +39,46 @@ class Crawler {
2739
}
2840

2941
try {
30-
response = await axios.post(this.__grahpqlURL, PostQuery(this.username));
42+
response = await axios.post(this.__grahpqlURL, PostsQuery(this.username));
3143
} catch(e) {
32-
console.error(`⚠️ 벨로그에서 글을 가져오는데 실패했습니다. \n error = ${e}`);
44+
console.error(`⚠️ 벨로그에서 글 목록을 가져오는데 실패했습니다. \n error = ${e}`);
3345
process.exit(1);
3446
}
3547

3648
const posts = response.data.data.posts;
3749

3850
console.log(`✅ ${this.username}님의 모든 글(${posts.length} 개) 을 가져옴`);
3951

40-
return response.data;
52+
return posts;
4153
}
54+
55+
async getPost(url_slug) {
56+
let response;
57+
58+
try {
59+
response = await axios.post(this.__grahpqlURL, PostQuery(this.username, url_slug));
60+
} catch (e) {
61+
console.error(`⚠️ 벨로그에서 글을 가져오는데 실패했습니다. \n error = ${e}`);
62+
process.exit(1);
63+
}
64+
65+
return response.data.data.post;
66+
}
67+
68+
async writePost(post) {
69+
const path = join('./backup', `${post.title}.md`);
70+
71+
post.body = '---\n'
72+
+ `title: "${post.title}"\n`
73+
+ `description: "${post.short_description.replace(/\n/g, ' ')}"\n`
74+
+ `date: ${post.released_at}\n`
75+
+ `tags: ${JSON.stringify(post.tags)}\n`
76+
+ '---\n' + post.body;
77+
78+
await fs.writeFile(path, post.body, 'utf8');
79+
}
80+
81+
4282
};
4383

4484
module.exports = Crawler;

crawler/query.js

Lines changed: 118 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
const PostQuery = (name) => ({
1+
const PostsQuery = (username) => ({
22
operationName:'Posts',
33
variables: {
4-
username: name,
5-
tag: null
4+
username,
5+
tag: null,
66
},
77

88
query: `query Posts($cursor: ID, $username: String, $temp_only: Boolean, $tag: String, $limit: Int) {
@@ -33,5 +33,119 @@ const PostQuery = (name) => ({
3333
}`
3434
});
3535

36+
const PostQuery = (username, url_slug) => ({
37+
operationName:'ReadPost',
38+
variables: {
39+
username,
40+
url_slug,
41+
},
42+
query: `query ReadPost($username: String, $url_slug: String) {
43+
post(username: $username, url_slug: $url_slug) {
44+
id
45+
title
46+
released_at
47+
updated_at
48+
tags
49+
body
50+
short_description
51+
is_markdown
52+
is_private
53+
is_temp
54+
thumbnail
55+
comments_count
56+
url_slug
57+
likes
58+
liked
59+
user {
60+
id
61+
username
62+
profile {
63+
id
64+
display_name
65+
thumbnail
66+
short_bio
67+
profile_links
68+
__typename
69+
}
70+
velog_config {
71+
title
72+
__typename
73+
}
74+
__typename
75+
}
76+
comments {
77+
id
78+
user {
79+
id
80+
username
81+
profile {
82+
id
83+
thumbnail
84+
__typename
85+
}
86+
__typename
87+
}
88+
text
89+
replies_count
90+
level
91+
created_at
92+
level
93+
deleted
94+
__typename
95+
}
96+
series {
97+
id
98+
name
99+
url_slug
100+
series_posts {
101+
id
102+
post {
103+
id
104+
title
105+
url_slug
106+
user {
107+
id
108+
username
109+
__typename
110+
}
111+
__typename
112+
}
113+
__typename
114+
}
115+
__typename
116+
}
117+
linked_posts {
118+
previous {
119+
id
120+
title
121+
url_slug
122+
user {
123+
id
124+
username
125+
__typename
126+
}
127+
__typename
128+
}
129+
next {
130+
id
131+
title
132+
url_slug
133+
user {
134+
id
135+
username
136+
__typename
137+
}
138+
__typename
139+
}
140+
__typename
141+
}
142+
__typename
143+
}
144+
}
145+
`
146+
});
36147

37-
module.exports.PostQuery = PostQuery;
148+
module.exports = {
149+
PostQuery,
150+
PostsQuery,
151+
};

0 commit comments

Comments
 (0)