송용우

Merge commit '89c20583' into feature/rest_api

1 -SERVER_PORT=4000
2 -MONGO_URL=mongodb://localhost:27017/jaksimsamil
3 -JWT_SECERET=fcbyHhPCxQYLLh98b97hdyAC6tGctHQ7rQDissQx
...\ No newline at end of file ...\ No newline at end of file
This diff could not be displayed because it is too large.
...@@ -4,17 +4,21 @@ ...@@ -4,17 +4,21 @@
4 "main": "index.js", 4 "main": "index.js",
5 "license": "MIT", 5 "license": "MIT",
6 "dependencies": { 6 "dependencies": {
7 + "axios": "^0.19.2",
7 "bcrypt": "^4.0.1", 8 "bcrypt": "^4.0.1",
8 "body-parser": "^1.19.0", 9 "body-parser": "^1.19.0",
10 + "cheerio": "^1.0.0-rc.3",
9 "dotenv": "^8.2.0", 11 "dotenv": "^8.2.0",
10 "eslint-config-prettier": "^6.11.0", 12 "eslint-config-prettier": "^6.11.0",
11 "express": "^4.17.1", 13 "express": "^4.17.1",
12 "fs": "^0.0.1-security", 14 "fs": "^0.0.1-security",
15 + "iconv": "^3.0.0",
13 "joi": "^14.3.1", 16 "joi": "^14.3.1",
14 "jsonwebtoken": "^8.5.1", 17 "jsonwebtoken": "^8.5.1",
15 "mongoose": "^5.9.17", 18 "mongoose": "^5.9.17",
16 "morgan": "^1.10.0", 19 "morgan": "^1.10.0",
17 - "path": "^0.12.7" 20 + "path": "^0.12.7",
21 + "voca": "^1.4.0"
18 }, 22 },
19 "devDependencies": { 23 "devDependencies": {
20 "babel-eslint": "^10.1.0", 24 "babel-eslint": "^10.1.0",
......
1 +exports.StringToDate_BJ = function (date_str) {
2 + let arr_date = date_str.split(" "); //yyyy m dd tt MM SS Fomat LIST
3 + let arr_date_r = arr_date.map(function (str) {
4 + let str_r = str.slice(0, -1);
5 +
6 + return str_r.length == 1 ? "0" + str_r : str_r;
7 + });
8 +
9 + return arr_date_r[0] + arr_date_r[1] + arr_date_r[2]; //YYYYMMDD 형식으로 반환
10 +};
1 +const axios = require("axios");
2 +const cheerio = require("cheerio");
3 +const StringToDate = require("./StringToDate");
4 +/*
5 +ToDO
6 +- 유저 네임 검증
7 +- 예외 처리
8 +*/
9 +exports.getBJ = async function (userid) {
10 + let data_list = [];
11 + let next_page_link = "";
12 +
13 + await getStartPage(userid).then((html) => {
14 + //시작 페이지를 가져온다.
15 + //같은 객체를 두번 선언한다. 퍼포먼스에 문제 생길수도
16 + //함수에 객체를 넘기는 방법도 있다.
17 + //첫 페이지 가져온다.
18 + data_list.push(getData(html));
19 + next_page_link = getNextPageLink(html);
20 + });
21 + while (next_page_link != -1) {
22 + //다음 페이지를 가져온다.
23 + await getNextPage(next_page_link).then((html) => {
24 + data_list.push(getData(html));
25 + next_page_link = getNextPageLink(html);
26 + });
27 + }
28 + return data_list.flat(1);
29 +};
30 +
31 +const getStartPage = async (userid) => {
32 + //유저 아이디 입력
33 + try {
34 + return await axios.get(
35 + "https://www.acmicpc.net/status?user_id=" + userid + "&result_id=4"
36 + );
37 + } catch (error) {
38 + console.log(error);
39 + }
40 +};
41 +
42 +const getNextPage = async (link) => {
43 + //링크 입력
44 + try {
45 + return await axios.get(link);
46 + } catch (error) {
47 + console.log(error);
48 + }
49 +};
50 +
51 +const getData = (html) => {
52 + //페이지 데이터 파싱
53 + let psArr = [];
54 + const $ = cheerio.load(html.data);
55 + const $bodyList = $("#status-table > tbody");
56 + $bodyList.children().each((index, element) => {
57 + psArr.push({
58 + problem_number: $(element).find("a.problem_title").text(),
59 + problem_title: $(element).find("a.problem_title").attr("title"),
60 + solved_date: StringToDate.StringToDate_BJ(
61 + $(element).find("a.real-time-update").attr("title")
62 + ),
63 + });
64 + });
65 + return psArr;
66 +};
67 +const getNextPageLink = (html) => {
68 + //다음 페이지가 있으면 다음 페이지 주소 return, 없으면 -1 return
69 + const $ = cheerio.load(html.data);
70 + return $("#next_page").attr("href")
71 + ? "https://www.acmicpc.net/" + $("#next_page").attr("href")
72 + : -1;
73 +};