Pro Sejongpeia · A little utopia for Sejong developers
Everything you need
to build on Sejong University
From student login to departments, lectures, the academic calendar and cafeterias. The public school data you get without logging in comes with the same methods and results in Java · Python · Node.js.
Fast and light · gentle on requests · never stores a password · checked against the real portal daily
What you get
One student verification and the school data you get without logging in. Open a card for the methods and result fields.
Student verification
Enrollment status, name, major, year, classic-reading certification and contact info from a single login.
authenticateDepartments and courses
Department and term codes and course listings by department, course name or instructor. Leave all empty for the whole term.
departmentslecturesAcademic calendar
Give a date range and get the undergraduate or graduate calendar with dates and titles.
calendargraduate_calendarDormitory
The weekly menu (breakfast, lunch, dinner) and the notice list.
dormitory_menudormitory_noticesCafeterias
The list of cafeterias (number, name, building, location), plus menus and prices per cafeteria.
cafeteria_placescafeteria_menuCampus map
Buildings and facilities with names, coordinates and info.
campus_placesExtracurricular
Extracurricular programs for a period, with their categories.
extracurricular_eventsCurriculum
Suggested year and semester, course type, credits and the course overview from a department code and course number.
curriculum_courses
Why this library
Four promises, each with proof you can check in the code or the tests.
Fast and light
- Zero runtime dependencies in Python and Node (standard library only)
- Repeated requests are answered from the cache without calling the school server again
- Integrated verification is one portal login that serves both DHC and SIS
Gentle on requests
- Results cached in memory for 24 hours; simultaneous calls with the same arguments share one request
- One request per call (only the cafeteria list sends one per number in a range, one after the other)
- Failures remembered for 60 seconds, at most 500 cache entries (defaults)
Safe
- The password is never stored and never put into error messages
- Stops at the first failure so the account is not locked, and reports a locked account as ACCOUNT_LOCKED
- SIS extra fields always exclude session values, client IP, resident number, bank account, address and similar keys
Trustworthy
- At 09:00 KST every day all three languages sign in to the live portal, and a failure opens an issue automatically
- Shared values live in spec/contract.json and the tests fail when the languages drift
- CI checks that the public method list matches the sources and the docs
Your first call in 30 seconds
Install it and write two lines. Paste the code below as it is.
Department codes without login
SejongPublicData publicData = new SejongPublicData(); // inject it as a bean in SpringList<Department> departments = publicData.departments("20", "2026", "20"); // undergraduate, term values are the school'sStudent verification
// build.gradle: implementation "kr.suhsaechan:sejongpeia:<version>" (latest: central.sonatype.com/artifact/kr.suhsaechan/sejongpeia)SejongAuthResult result = sejongAuthEngine.authenticate("21011234", "password");result.getName(); // "홍길동"result.getMajor(); // "컴퓨터공학과"Department codes without login
from sejongpeia import SejongPublicData
public_data = SejongPublicData()departments = public_data.departments("20", "2026", "20") # undergraduate, term values are the school'sStudent verification
# pip install pro-sejongpeiafrom sejongpeia import authenticate
result = authenticate("21011234", "password")print(result.name, result.major)Department codes without login
import { SejongPublicData } from 'pro-sejongpeia';
const publicData = new SejongPublicData();const departments = await publicData.departments({ categoryCode: '20', year: '2026', semesterCode: '20' });Student verification
// npm install pro-sejongpeiaimport { authenticate } from 'pro-sejongpeia';
const result = await authenticate('21011234', 'password');console.log(result.name, result.major);Call it from your server only. Sending a student ID and password straight from a browser or an app exposes them to third-party code.
Try it live
Sign in with your own Sejong portal account and see exactly what the library returns.
Result
All three languages support everything
Features, result fields, error codes and value rules are the same. A shared contract test fails if they drift apart.
| Feature | Java | Python | Node.js |
|---|---|---|---|
| Integrated verificationStudent info + classic reading + contact, one login | Java: Supported | Python: Supported | Node.js: Supported |
| DHC and SIS verificationLook up only the side you need | Java: Supported | Python: Supported | Node.js: Supported |
| Academic business periodsCourse registration, grade lookup and more (login required) | Java: Supported | Python: Supported | Node.js: Supported |
| Raw and extra optionsThe school's raw response and the remaining fields | Java: Supported | Python: Supported | Node.js: Supported |
| Department and term codesCategories, terms, departments, course types, selective domains | Java: Supported | Python: Supported | Node.js: Supported |
| Course searchBy department, course name, instructor | Java: Supported | Python: Supported | Node.js: Supported |
| CurriculumYear, semester, credits, course overview | Java: Supported | Python: Supported | Node.js: Supported |
| Academic calendarUndergraduate and graduate | Java: Supported | Python: Supported | Node.js: Supported |
| Dormitory menu and notices7-day menu, notice search | Java: Supported | Python: Supported | Node.js: Supported |
| Cafeterias and menusCafeteria list, menus, prices | Java: Supported | Python: Supported | Node.js: Supported |
| Campus placesBuildings, facilities, coordinates | Java: Supported | Python: Supported | Node.js: Supported |
| Extracurricular programsSchedule by period | Java: Supported | Python: Supported | Node.js: Supported |
| 10 error codesSame codes, same meaning | Java: Supported | Python: Supported | Node.js: Supported |
| In-memory cache and failure isolationPublic data, 24 hours by default | Java: Supported | Python: Supported | Node.js: Supported |
Runtimes differ. Java 17+ (Spring Boot 3.x auto-configuration), Python 3.9+, Node.js 18+; Python and Node.js have no external dependencies. Only naming differs: Python snake_case, Node.js and Java camelCase.
What you would otherwise build
Portal login is trickier than it looks. The library handles all of this for you. Open a card for the details.
- 1
Legacy TLS cipher
The portal accepts only one cipher (TLS_RSA_WITH_AES_256_CBC_SHA), which current JDK, Python and Node defaults block. It is re-enabled the right way in each language.
- 2
Firewall and User-Agent
The firewall blocks default library User-Agents, and some sites answer 404 without one. An identifying User-Agent is sent automatically.
- 3
SSO cookies and redirects
Handles SSO cookies and redirects across several Sejong domains, so one login serves both DHC and SIS.
- 4
Login verdict and account safety
Reads the verdict hidden in a 200 response to tell wrong password, locked account and unavailable account apart. A wrong password is never retried, so the account does not get locked.
- 5
Failure isolation and cache
One public data source failing never blocks another; you get the last cached value or an empty list. Identical requests are sent once.
- 6
A daily check against the live portal
Every day the three languages sign in to the real portal, and the shape of the public data responses is checked without credentials. An issue opens on any anomaly.
Read on
This is a personal open-source project by a Sejong student. It does not guarantee backward compatibility, so pin the version.
This project is not an official product of Sejong University and is not affiliated with it. The Sejong University seal belongs to Sejong University.
