HyeonJun Jeon

[Modify] Puppeteer dynamic waitTime

...@@ -7,79 +7,107 @@ function setTimeoutPromise(ms) { ...@@ -7,79 +7,107 @@ function setTimeoutPromise(ms) {
7 }); 7 });
8 } 8 }
9 9
10 -async function loglogin(id, pw) { 10 +async function login(id, pw) {
11 - try{ 11 + try {
12 //for visibility, headless: false 12 //for visibility, headless: false
13 - const browser = await puppeteer.launch({headless: false, args:['--window-size=1920,1080']}); 13 + const browser = await puppeteer.launch({
14 + headless: false,
15 + args: ["--window-size=1920,1080"],
16 + });
14 17
15 const page = await browser.newPage(); 18 const page = await browser.newPage();
16 await page.setViewport({ 19 await page.setViewport({
17 - width:1920, 20 + width: 1920,
18 - height:1080 21 + height: 1080,
19 - }) 22 + });
20 - await page.goto('https://e-campus.khu.ac.kr/xn-sso/login.php?auto_login=&sso_only=&cvs_lgn=&return_url=https%3A%2F%2Fe-campus.khu.ac.kr%2Fxn-sso%2Fgw-cb.php%3Ffrom%3D%26login_type%3Dstandalone%26return_url%3Dhttps%253A%252F%252Fe-campus.khu.ac.kr%252Flogin%252Fcallback'); 23 + await page.goto(
24 + "https://e-campus.khu.ac.kr/xn-sso/login.php?auto_login=&sso_only=&cvs_lgn=&return_url=https%3A%2F%2Fe-campus.khu.ac.kr%2Fxn-sso%2Fgw-cb.php%3Ffrom%3D%26login_type%3Dstandalone%26return_url%3Dhttps%253A%252F%252Fe-campus.khu.ac.kr%252Flogin%252Fcallback"
25 + );
21 await page.type("#login_user_id", id); 26 await page.type("#login_user_id", id);
22 await page.type("#login_user_password", pw); 27 await page.type("#login_user_password", pw);
23 28
24 //press the login button on E_Campus homepage 29 //press the login button on E_Campus homepage
25 - await page.click('#form1 > div > div.login_btn > a > span'); 30 + await Promise.all([
26 - await page.waitForTimeout(500); 31 + page.click("#form1 > div > div.login_btn > a > span"),
27 - await setTimeoutPromise(1000); 32 + page.waitForNavigation(),
33 + ]);
28 34
29 - //When login is failed, return [id, pw, message] -> ["", "", "Incorrect~"] 35 + //When login is failed, return {err: "Incorrect~"}
30 - if(page.url() === 'https://e-campus.khu.ac.kr/xn-sso/gw-cb.php?from=&login_type=standalone&return_url=https%3A%2F%2Fe-campus.khu.ac.kr%2Flogin%2Fcallback'){ 36 + if (
31 - return ["", "", "Incorrect user ID or password."]; 37 + page.url() ===
38 + "https://e-campus.khu.ac.kr/xn-sso/gw-cb.php?from=&login_type=standalone&return_url=https%3A%2F%2Fe-campus.khu.ac.kr%2Flogin%2Fcallback"
39 + ) {
40 + return false;
41 + } else {
42 + return page;
32 } 43 }
33 - else { 44 + } catch (err) {
34 - // return [id, pw, `I got data { id:"${id}" pw:"${pw}" }`]; 45 + console.log(err);
35 - await peedGet(page);
36 - await page.waitForTimeout(3000);
37 - await page.click('body > div:nth-child(9) > div.ui-dialog-titlebar.ui-widget-header.ui-corner-all.ui-helper-clearfix > button > span');
38 - await subjectGet(page);
39 - }
40 - }catch(err){
41 - console.log(err)
42 } 46 }
47 + return result;
43 } 48 }
44 49
45 //function that get your peed for your Ecampus calendar 50 //function that get your peed for your Ecampus calendar
46 -async function peedGet(page) { 51 +async function getPeed(page) {
47 - await page.waitForTimeout(5000); 52 + console.log("getPeed");
48 // await page.goto('https://khcanvas.khu.ac.kr'); 53 // await page.goto('https://khcanvas.khu.ac.kr');
49 - await page.click('#visual > div > div.xn-main-login-container > div:nth-child(2) > div.xn-main-link-wrap.xn-main-lms-link-wrap > a'); 54 + let selector =
50 - await page.waitForTimeout(1000); 55 + "#visual > div > div.xn-main-login-container > div:nth-child(2) > div.xn-main-link-wrap.xn-main-lms-link-wrap > a";
51 - await page.click('#global_nav_calendar_link > div.menu-item-icon-container > svg'); 56 + await page.waitForSelector(selector);
52 - await page.waitForTimeout(10000); 57 + await page.click(selector);
53 - await page.click('#calendar-feed > button');
54 - let data = {};
55 - let temp = await page.$('#calendar-feed-box-lower > a');
56 - data.name = await page.evaluate((data) => {
57 - return data.textContent;
58 - }, temp);
59 - data.link = await page.evaluate((data) => {
60 - return data.href;
61 - }, temp);
62 58
63 - console.log(Promise.resolve(data)); 59 + selector = "#global_nav_calendar_link > div.menu-item-icon-container > svg";
64 - return Promise.resolve(data); 60 + await page.waitForSelector(selector);
61 + page.click(selector);
62 +
63 + selector = "#calendar-feed > button";
64 + await page.waitForSelector(selector);
65 + page.click(selector);
66 +
67 + // let data = {};
68 + // let temp = await page.$("#calendar-feed-box-lower > a");
69 + // data.name = await page.evaluate((data) => {
70 + // return data.textContent;
71 + // }, temp);
72 + // data.link = await page.evaluate((data) => {
73 + // return data.href;
74 + // }, temp);
75 +
76 + let temp = await page.$("#calendar-feed-box-lower > a");
77 + const feed = await page.evaluate((data) => data.href, temp);
78 +
79 + selector =
80 + "body > div:nth-child(9) > div.ui-dialog-titlebar.ui-widget-header.ui-corner-all.ui-helper-clearfix > button > span";
81 + await page.waitForSelector(selector, { timeout: 1000 });
82 + await page.click(selector);
83 +
84 + return feed;
65 } 85 }
66 86
87 +async function getSubjects(page) {
88 + console.log("getSubjects");
89 + await page.click(
90 + "#global_nav_courses_link > div.menu-item-icon-container > svg"
91 + );
67 92
68 -async function subjectGet(page) { 93 + let data = [];
69 - await page.waitForTimeout(5000); 94 + let selector =
70 - await page.click('#global_nav_courses_link > div.menu-item-icon-container > svg') 95 + "#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li";
71 - await page.waitForTimeout(5000); 96 + await page.waitForSelector(selector);
72 - let data= []; 97 + const number = await page.$$eval(selector, (data) => data.length);
73 - const number = await page.$$eval("#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li", (data) => data.length);
74 for (let index = 0; index < number; index++) { 98 for (let index = 0; index < number; index++) {
75 data.push(await getOne(page, index + 1)); 99 data.push(await getOne(page, index + 1));
76 } 100 }
77 - console.log(Promise.resolve(data)); 101 + return data;
78 } 102 }
79 103
80 async function getOne(page, index) { 104 async function getOne(page, index) {
81 let data = {}; 105 let data = {};
82 - let temp = await page.$("#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li:nth-child(" + index + ") > a"); 106 + let temp = await page.$(
107 + "#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li:nth-child(" +
108 + index +
109 + ") > a"
110 + );
83 data.name = await page.evaluate((data) => { 111 data.name = await page.evaluate((data) => {
84 return data.textContent; 112 return data.textContent;
85 }, temp); 113 }, temp);
...@@ -91,7 +119,6 @@ async function getOne(page, index) { ...@@ -91,7 +119,6 @@ async function getOne(page, index) {
91 return Promise.resolve(data); 119 return Promise.resolve(data);
92 } 120 }
93 121
94 -
95 // function that contact E_Campus 122 // function that contact E_Campus
96 // if your account is correct, value = Promise { 123 // if your account is correct, value = Promise {
97 // { name: '캘린더 피드를 보려면 클릭하세요.', 124 // { name: '캘린더 피드를 보려면 클릭하세요.',
...@@ -99,17 +126,5 @@ async function getOne(page, index) { ...@@ -99,17 +126,5 @@ async function getOne(page, index) {
99 // } 126 // }
100 //} 127 //}
101 // if your account is incorrect, value = [ '', '', 'Incorrect user ID or password.' ] 128 // if your account is incorrect, value = [ '', '', 'Incorrect user ID or password.' ]
102 -async function login(id, pw) {
103 - await setTimeoutPromise(1000);
104 -try {
105 - // value has the list ["","","Incorrect~"]
106 - const value = await loglogin(id, pw);
107 - console.log(value);
108 -} catch (e) {
109 - console.error(e);
110 - }
111 -}
112 -
113 -// login("2021105253", "qtw@@04271");
114 129
115 -export { login }; 130 +export { login, getPeed, getSubjects };
......
1 import express from "express"; 1 import express from "express";
2 -import { login } from "./libs/E_Campus.js"; 2 +import { getPeed, getSubjects, login } from "./libs/E_Campus.js";
3 import fs from "fs"; 3 import fs from "fs";
4 4
5 const app = express(); 5 const app = express();
...@@ -13,15 +13,20 @@ router.get("/", (req, res) => { ...@@ -13,15 +13,20 @@ router.get("/", (req, res) => {
13 13
14 app.use("/", router); 14 app.use("/", router);
15 15
16 -fs.readFile("server/login.pvdata", "utf8", (err, data) => { 16 +fs.readFile("server/libs/login.pvdata", "utf8", async (err, data) => {
17 if (err) { 17 if (err) {
18 console.error(err); 18 console.error(err);
19 - console.log("server/login.pvdata에 ID\\nPW를 작성"); 19 + console.log("server/libs/login.pvdata에 ID\\nPW를 작성");
20 return; 20 return;
21 } 21 }
22 - login(...data.split("\r\n")); 22 + const page = await login(...data.split("\r\n"));
23 + if (page) {
24 + const feed = await getPeed(page);
25 + const subjects = await getSubjects(page);
26 + console.log({ feed, subjects });
23 27
24 app.listen(3001, function () { 28 app.listen(3001, function () {
25 console.log("listening on 3001"); 29 console.log("listening on 3001");
26 }); 30 });
31 + } else console.log("Incorrect user ID or password.");
27 }); 32 });
......