DesktopMof
커서를 따라다니거나, 피하거나, 화면 가장자리에서 졸기도 한다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗제주대학교 홈페이지에 식당별로 나뉘어 있는 식단표를 한 화면에 모은 비공식 페이지입니다. 맨 위에 그날의 천원의 아침밥을 모아 보여 주고, 아래에 식당별 전체 식단을 보여 줍니다.
| 식당 | 원본 | 천원의 아침밥 | 메뉴 수집 |
|---|---|---|---|
| 학생생활관 6호관 | fixfirst.htm + 아이비푸드 주간식단표 | 월~토, 간편식·일반식 | 자동 (학교 페이지에 없는 날은 업체 식단표 그림) |
| 학생생활관 1호관 | chefskiss.co.kr/morning | 일~금, 일반식·간편식 | 자동 (Vercel 서울 리전 함수, 점심·저녁 포함) + 예비로 직접 입력 |
| 백두관 | firstfixmenu.htm | 표기 없음 | 자동 |
| 사라캠퍼스 | secondfixmenu.htm | 없음 | 자동 |
운영시간·가격 같은 안내 문구는 scripts/cafeterias.mjs에 손으로 옮겨 두었습니다 (CHECKED_AT 날짜 기준).
학교 안내가 바뀌면 이 파일을 고쳐 주세요.
6호관 운영 업체(아이비푸드)는 다음 주 식단표를 그 전 주 수·목요일에 그림으로 올리지만, 학교 페이지는 그 주가 돼야 바뀝니다.
수집 작업이 최신 그림 한 장을 public/data/dorm6-week.jpg 로 받아 두고(scripts/ibfood.mjs),
학교 페이지에 아직 없는 날에는 그 그림을 보여 줍니다. 그림 글자를 자동으로 읽으면 틀리기 쉬워 글자로 바꾸지는 않습니다.
쉐프스키스 사이트는 해외 접속이 막혀 GitHub Actions(미국)로는 읽을 수 없습니다.
그래서 Vercel 서울 리전(icn1) 에서 도는 api/dorm1.js가 방문 시점에
/morning 게시판의 최신 글을 읽어 표를 날짜별 메뉴로 바꿉니다. 결과는 CDN 에 3시간 캐시됩니다.
/foodcourt 페이지에 붙어 있는 인스타그램 피드 글("2026년 10월 19일 점심메뉴입니다" …)을
api/dorm1-meals.js가 읽습니다. 매일 점심 무렵 한 번에 올라오므로 한국 시간 10~14시에는 10분, 그 외에는 1시간 캐시합니다.DEBUG_TOKEN 을 정해 두면 /api/dorm1?debug=<그 값> 으로 어디서 막혔는지 볼 수 있습니다.
환경 변수가 없으면 진단 모드는 꺼져 있습니다 (아무나 캐시를 건너뛰어 쉐프스키스에 요청을 보내지 못하게).manual/dorm1.txt 에 손으로 넣은 메뉴를 씁니다.
게시글 내용을 그대로 붙여 넣어도 되지만, 간편식처럼 날짜 경계를 알 수 없는 표는
10/20 (월) 같은 날짜 줄 형식으로 정리해야 읽힙니다.수집 워크플로 마지막에 npm run check 가 돕니다. 학교 식단이 며칠째 갱신되지 않거나, 갱신 실패가 기록됐거나,
1호관 서울 함수가 응답하지 않으면 실패하고, GitHub 가 저장소 주인에게 실패 메일을 보냅니다.
scripts/holidays.mjs — 한국천문연구원 달력자료 기준. 임시공휴일이 생기면 추가해 주세요.
1호관은 원본에 '공휴일 휴무'가 적혀 있어 공휴일에 휴무로 표시하고, 나머지 식당은 '운영 확인'으로 표시합니다.
체육관 지하 피트니스센터 시간표는 페이지 맨 아래 한 줄로 보여 줍니다 (지금 상태 + 평일 시간표).
값은 public/app.js 의 GYM 에 손으로 옮겨 두었습니다.
출처는 시설물예약시스템 공지 「제주대학교 무료·유료 개방 체육시설 안내('26. 5. 13. 기준)」(표 이미지)와
「피트니스센터(헬스장) 개방 및 이용 안내('23. 3. 6.~)」입니다. 시간이 바뀌면 GYM.sessions 를 고쳐 주세요.
public/app.js 맨 위 FEEDBACK_URL 에 구글 설문지 주소를 넣으면 화면 아래에 버튼이 생깁니다.
scripts/parse.mjs 식단 표(#plannerWrap) → JSON
scripts/scrape.mjs 학교 페이지를 받아 public/data/menus.json 생성
scripts/manual.mjs manual/*.txt (손으로 넣은 메뉴) → JSON
scripts/chefskiss.mjs 쉐프스키스 게시판 → JSON (api/dorm1.js 에서 사용)
api/dorm1.js 1호관 천원의 아침밥 함수 (서울 리전)
api/dorm1-meals.js 1호관 점심·저녁 함수 (서울 리전)
scripts/cafeterias.mjs 식당 목록·운영 정보
manual/dorm1.txt 1호관 주간 메뉴 (직접 입력)
public/ 정적 사이트 (Vercel 이 그대로 배포)
.github/workflows/ 하루 세 번 + manual/ 수정 시 수집, 메뉴가 바뀌었으면 커밋
GitHub Actions 가 menus.json 을 커밋하면 Vercel 이 자동으로 다시 배포합니다.
한 식당 수집이 실패하면 그 식당은 직전 데이터를 유지하고 화면에 "갱신 실패"를 표시합니다.
npm test # 저장된 학교 페이지(test/fixtures)로 파서 확인
npm run scrape # 실제 학교 페이지에서 수집 (Node 22 이상)
npm run dev # http://localhost:3000
www.jejunu.ac.kr 서버가 중간 인증서(Sectigo Public Server Authentication CA DV R36)를 보내지 않아
Node 기본 설정으로는 TLS 검증이 실패합니다. 검증을 끄지 않고, 해당 중간 인증서를
certs/sectigo-dv-r36.pem 에 두고 NODE_EXTRA_CA_CERTS 로 추가합니다.
(출처: 인증서에 적힌 AIA 주소 http://crt.sectigo.com/SectigoPublicServerAuthenticationCADVR36.crt, 2036-03-21 만료)
vercel.json 이 public/ 을 그대로 배포하도록 설정되어 있습니다.