-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfetch.ts
91 lines (79 loc) · 2.61 KB
/
fetch.ts
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
export interface KaistTodayNoticeFetchOptions {
cookie: string;
menuNo?: number;
size?: number;
lang?: 'ko' | 'en';
}
export interface KaistTodayNotice {
title: string;
url: string;
loginUrl: string;
organization: string;
author: string;
views: number;
timestamp: string;
}
export interface KaistBoard {
boardId: number;
menuId: number;
menuPath: string;
}
async function getBoards(cookie: string): Promise<KaistBoard[]> {
const response = await fetch(
'https://portal.kaist.ac.kr/wz/api/widget/tabBoard/divide',
{ headers: { cookie } },
);
const json = await response.json();
const { boardAll } = json.data;
return boardAll.map((board: any) => ({
boardId: board.boardNo,
menuId: board.menuNo,
menuPath: board.menuPath,
}));
}
export async function fetchPosts(
options: KaistTodayNoticeFetchOptions,
): Promise<KaistTodayNotice[] | null> {
const size = options.size ?? 10;
const lang = options.lang ?? 'ko';
const menuNo = options.menuNo ?? 0;
const boards = await getBoards(options.cookie);
const getBoard = (boardId: number) => boards.find((board) => board.boardId === boardId);
const url = new URL('/wz/api/board/recents', 'https://portal.kaist.ac.kr/');
url.searchParams.append('recordCountPerPage', size.toString());
url.searchParams.append('lang', lang);
url.searchParams.append('menuNo', menuNo.toString());
const response = await fetch(
url,
{ headers: { cookie: options.cookie } },
);
const json = await response.json();
const { data } = json;
const posts: KaistTodayNotice[] = [];
for (let i = 0; i < data.length; i += 1) {
const post = data[i];
const title = post.pstTtl ?? '';
const organization = post.pstWrtrDeptNm ?? '';
const author = post.pstWrtrNm ?? '';
const views = post.inqCnt ?? 0;
const timestamp = (post.regDt ?? '').replaceAll('.', '-');
const board = getBoard(post.boardNo);
if (!board) {
throw new Error('Invalid boardNo');
}
const postPath = `${board.menuPath}#${post.pstNo}`;
const postUrl = new URL(postPath, 'https://portal.kaist.ac.kr/');
const loginUrl = new URL('https://portal.kaist.ac.kr/common/login/login.do');
loginUrl.searchParams.append('returnUrl', postPath);
posts.push({
title,
url: postUrl.toString(),
loginUrl: loginUrl.toString(),
organization,
author,
views,
timestamp,
});
}
return posts;
}