HyeonJun Jeon

[Modify] Puppeteer dynamic waitTime

...@@ -2,96 +2,123 @@ import puppeteer from "puppeteer"; ...@@ -2,96 +2,123 @@ import puppeteer from "puppeteer";
2 //use puppeteer 2 //use puppeteer
3 3
4 function setTimeoutPromise(ms) { 4 function setTimeoutPromise(ms) {
5 - return new Promise((resolve, reject) => { 5 + return new Promise((resolve, reject) => {
6 - setTimeout(() => resolve(), ms); 6 + setTimeout(() => resolve(), 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 - 14 + headless: false,
15 - const page = await browser.newPage(); 15 + args: ["--window-size=1920,1080"],
16 - await page.setViewport({ 16 + });
17 - width:1920, 17 +
18 - height:1080 18 + const page = await browser.newPage();
19 - }) 19 + await page.setViewport({
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'); 20 + width: 1920,
21 - await page.type("#login_user_id", id); 21 + height: 1080,
22 - await page.type("#login_user_password", pw); 22 + });
23 - 23 + await page.goto(
24 - //press the login button on E_Campus homepage 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 - await page.click('#form1 > div > div.login_btn > a > span'); 25 + );
26 - await page.waitForTimeout(500); 26 + await page.type("#login_user_id", id);
27 - await setTimeoutPromise(1000); 27 + await page.type("#login_user_password", pw);
28 - 28 +
29 - //When login is failed, return [id, pw, message] -> ["", "", "Incorrect~"] 29 + //press the login button on E_Campus homepage
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'){ 30 + await Promise.all([
31 - return ["", "", "Incorrect user ID or password."]; 31 + page.click("#form1 > div > div.login_btn > a > span"),
32 - } 32 + page.waitForNavigation(),
33 - else { 33 + ]);
34 - // return [id, pw, `I got data { id:"${id}" pw:"${pw}" }`]; 34 +
35 - await peedGet(page); 35 + //When login is failed, return {err: "Incorrect~"}
36 - await page.waitForTimeout(3000); 36 + if (
37 - await page.click('body > div:nth-child(9) > div.ui-dialog-titlebar.ui-widget-header.ui-corner-all.ui-helper-clearfix > button > span'); 37 + page.url() ===
38 - await subjectGet(page); 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 - } 39 + ) {
40 - }catch(err){ 40 + return false;
41 - console.log(err) 41 + } else {
42 + return page;
42 } 43 }
44 + } catch (err) {
45 + console.log(err);
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'); 58 +
54 - let data = {}; 59 + selector = "#global_nav_calendar_link > div.menu-item-icon-container > svg";
55 - let temp = await page.$('#calendar-feed-box-lower > a'); 60 + await page.waitForSelector(selector);
56 - data.name = await page.evaluate((data) => { 61 + page.click(selector);
57 - return data.textContent; 62 +
58 - }, temp); 63 + selector = "#calendar-feed > button";
59 - data.link = await page.evaluate((data) => { 64 + await page.waitForSelector(selector);
60 - return data.href; 65 + page.click(selector);
61 - }, temp); 66 +
62 - 67 + // let data = {};
63 - console.log(Promise.resolve(data)); 68 + // let temp = await page.$("#calendar-feed-box-lower > a");
64 - return Promise.resolve(data); 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); 98 + for (let index = 0; index < number; index++) {
74 - for (let index = 0; index < number; index++) { 99 + data.push(await getOne(page, index + 1));
75 - data.push(await getOne(page, index + 1)); 100 + }
76 - } 101 + return data;
77 - console.log(Promise.resolve(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.$(
83 - data.name = await page.evaluate((data) => { 107 + "#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li:nth-child(" +
84 - return data.textContent; 108 + index +
85 - }, temp); 109 + ") > a"
86 - data.link = await page.evaluate((data) => { 110 + );
87 - return data.href; 111 + data.name = await page.evaluate((data) => {
88 - }, temp); 112 + return data.textContent;
89 - // data.subjectName = await page.$eval("#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li:nth-child(" + index + ") > a", (data) => data.textContent); 113 + }, temp);
90 - // data.subjectLink = await page.$eval("#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li:nth-child(" + index + ") > a", (data) => data.href); 114 + data.link = await page.evaluate((data) => {
91 - return Promise.resolve(data); 115 + return data.href;
116 + }, temp);
117 + // data.subjectName = await page.$eval("#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li:nth-child(" + index + ") > a", (data) => data.textContent);
118 + // data.subjectLink = await page.$eval("#nav-tray-portal > span > span > div > div > div > div > div > ul:nth-child(3) > li:nth-child(" + index + ") > a", (data) => data.href);
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 });
......