diff options
Diffstat (limited to 'index.js')
| -rw-r--r-- | index.js | 208 |
1 files changed, 109 insertions, 99 deletions
@@ -1,128 +1,138 @@ import lodash from "lodash"; -import { parse } from "flags/mod.ts"; +import { parseArgs } from "parse-args"; +import { dirname, fromFileUrl, SEPARATOR } from "path"; import { networkInterfaces } from "node:os"; const REFERER = "https://w.seu.edu.cn/"; const EPORTAL_API = "https://w.seu.edu.cn:802/eportal"; const headers = { - "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0", + "User-Agent": + "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0", }; +const PROG_PATH = Deno.args.includes("--is_compiled_binary") + ? Deno.execPath() + : fromFileUrl(Deno.mainModule); +const CONFIG_FILE = `${dirname(PROG_PATH)}${SEPARATOR}credentials.json`; -(async () => { - - const flags = parse(Deno.args, { - boolean: ["login", "logout"], - string: ["config"], - default: { login: true, config: "./credentials.json" } - }); - - try { - const credentials = JSON.parse(await Deno.readTextFile(flags.config)); +const flags = parseArgs(Deno.args, { + boolean: ["login", "logout"], + string: ["config", "interface"], + default: { login: true, config: CONFIG_FILE }, +}); - if (lodash.isEmpty(credentials.username) || lodash.isEmpty(credentials.password)) { - throw "Invalid credentials! "; - } - - const { ipv4, ipv6, mac } = getNetIfInfo(); +(async () => { + try { + const credentials = JSON.parse(await Deno.readTextFile(flags.config)); - if (flags.logout) { - const LOGOUT_URL = `${EPORTAL_API}/?c=Portal&a=unbind_mac&callback=dr1004&user_account=&wlan_user_mac=${mac.replaceAll(":", "").toUpperCase()}&wlan_user_ip=${ipv4}&jsVersion=3.3.3`; - await logout(LOGOUT_URL); - } else { - const LOGIN_URL = `${EPORTAL_API}/?c=Portal&a=login&callback=dr1004&login_method=1&user_account=%2C0%2C${credentials.username}&user_password=${credentials.password}&wlan_user_ip=${lodash.isEmpty(ipv4) ? '' : ipv4}&wlan_user_ipv6=${lodash.isEmpty(ipv6) ? '' : ipv6}&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3`; - await login(LOGIN_URL); - }; + if ( + lodash.isEmpty(credentials.username) || + lodash.isEmpty(credentials.password) + ) { + throw "Invalid credentials! "; + } - } catch (err) { - if (err instanceof SyntaxError) { - exitWithError("Parse json failed!"); - } else if (err instanceof Deno.errors.NotFound) { - exitWithError("credentials.json not found!") - } - else { - console.error(`[ERROR]: ${err.toString()}`); - exitWithError(''); - } + const { ipv4, ipv6, mac } = getNetIfInfo(); + if (flags.logout) { + const LOGOUT_URL = `${EPORTAL_API}/?c=Portal&a=unbind_mac&callback=dr1004&user_account=&wlan_user_mac=${mac.replaceAll(":", "").toUpperCase()}&wlan_user_ip=${ipv4}&jsVersion=3.3.3`; + await logout(LOGOUT_URL); + } else { + const LOGIN_URL = `${EPORTAL_API}/?c=Portal&a=login&callback=dr1004&login_method=1&user_account=%2C0%2C${credentials.username}&user_password=${credentials.password}&wlan_user_ip=${lodash.isEmpty(ipv4) ? "" : ipv4}&wlan_user_ipv6=${lodash.isEmpty(ipv6) ? "" : ipv6}&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3`; + await login(LOGIN_URL); } + } catch (err) { + if (err instanceof SyntaxError) { + exitWithError("Parse json failed!"); + } else if (err instanceof Deno.errors.NotFound) { + exitWithError(`${CONFIG_FILE} not found!`); + } else { + console.error(`[ERROR]: ${err.toString()}`); + exitWithError(""); + } + } })(); function exitWithError(errstr) { - if (!lodash.isEmpty(errstr)) { console.error(errstr) }; - Deno.exit(1); + if (!lodash.isEmpty(errstr)) { + console.error(errstr); + } + Deno.exit(1); } function getNetIfInfo() { - let ipv4, ipv6, mac; - const netIf = networkInterfaces(); - const wlanIf = netIf.wlan0 || netIf.WLAN; - if (lodash.isEmpty(wlanIf)) { - exitWithError("No valid wireless network interface Found!"); - } + let ipv4, ipv6, mac; + const netIf = networkInterfaces(); + const wlanIf = + netIf[flags.interface] || netIf.wlan0 || netIf.WLAN || netIf.em4; + if (lodash.isEmpty(wlanIf)) { + exitWithError("No valid wireless network interface Found!"); + } - for (let i = 0; i < wlanIf.length; i++) { - var alias = wlanIf[i]; - if (alias.family === 'IPv4' && !alias.internal) { - const re = /^169.254.*/g; - if (lodash.isEmpty(alias.address.match(re))) { - ipv4 = alias.address; - } - } else if (alias.family === 'IPv6' && !alias.internal) { - const re = /^fe80::*/g; - if (lodash.isEmpty(alias.address.match(re))) { - ipv6 = alias.address; - } - } - mac = alias.mac; + for (let i = 0; i < wlanIf.length; i++) { + var alias = wlanIf[i]; + if (alias.family === "IPv4" && !alias.internal) { + const re = /^169.254.*/g; + if (lodash.isEmpty(alias.address.match(re))) { + ipv4 = alias.address; + } + } else if (alias.family === "IPv6" && !alias.internal) { + const re = /^fe80::*/g; + if (lodash.isEmpty(alias.address.match(re))) { + ipv6 = alias.address; + } } - return { ipv4, ipv6, mac }; + mac = alias.mac; + } + return { ipv4, ipv6, mac }; } async function login(LOGIN_URL) { - - const resp = await fetch(LOGIN_URL, { - "credentials": "include", - headers, - "referrer": REFERER, - "mode": "cors" - }); - if (resp.ok) { - const resp_text = await resp.text(); - const re = /dr1004\((.*?)\)/g; - const match = re.exec(resp_text); - if (lodash.isEmpty(match) || match.length <= 1) { - throw "No match in response!"; - } - const parsedData = JSON.parse(match[1]); - if (parsedData.result == 1) { - console.log("Login success!"); - } else if (parsedData.result == 0 && (parsedData.ret_code == 1 || parsedData.ret_code == 2)) { - console.log("Already logged in!") - } else { - throw `Login failed.${lodash.isEmpty(parsedData.msg) ? '' : `\nServer responds message: ${parsedData.msg}`}`; - } + const resp = await fetch(LOGIN_URL, { + credentials: "include", + headers, + referrer: REFERER, + mode: "cors", + }); + if (resp.ok) { + const resp_text = await resp.text(); + const re = /dr1004\((.*?)\)/g; + const match = re.exec(resp_text); + if (lodash.isEmpty(match) || match.length <= 1) { + throw "No match in response!"; } + const parsedData = JSON.parse(match[1]); + if (parsedData.result == 1) { + console.log("Login success!"); + } else if ( + parsedData.result == 0 && + (parsedData.ret_code == 1 || parsedData.ret_code == 2) + ) { + console.log("Already logged in!"); + } else { + throw `Login failed.${lodash.isEmpty(parsedData.msg) ? "" : `\nServer responds message: ${parsedData.msg}`}`; + } + } } async function logout(LOGOUT_URL) { - const resp = await fetch(LOGOUT_URL, { - "credentials": "include", - headers, - "referrer": REFERER, - "mode": "cors" - }); - if (resp.ok) { - const resp_text = await resp.text(); - const re = /dr1004\((.*?)\)/g; - const match = re.exec(resp_text); - if (lodash.isEmpty(match) || match.length <= 1) { - throw "No match in response!"; - } - const parsedData = JSON.parse(match[1]); - if (parsedData.result == 1) { - console.log("Logout success!"); - } else { - throw `Logout failed.${lodash.isEmpty(parsedData.msg) ? '' : `\nServer responds message: ${parsedData.msg}`}`; - } + const resp = await fetch(LOGOUT_URL, { + credentials: "include", + headers, + referrer: REFERER, + mode: "cors", + }); + if (resp.ok) { + const resp_text = await resp.text(); + const re = /dr1004\((.*?)\)/g; + const match = re.exec(resp_text); + if (lodash.isEmpty(match) || match.length <= 1) { + throw "No match in response!"; + } + const parsedData = JSON.parse(match[1]); + if (parsedData.result == 1) { + console.log("Logout success!"); + } else { + throw `Logout failed.${lodash.isEmpty(parsedData.msg) ? "" : `\nServer responds message: ${parsedData.msg}`}`; } -}
\ No newline at end of file + } +} |
