尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 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/ 을 그대로 배포하도록 설정되어 있습니다.