Skip to content

About

UCAS | 国科大 | 果壳 | 课程查询与签到二维码生成工具

Topics

Resources

Stars

170 stars

Watchers

1 watching

Forks

Repository files navigation

Important

维护说明与贡献邀请

本人已离开学校、返回研究所,无法继续在校验证课程查询与签到流程,也难以及时排查和修复学校上游接口变化带来的问题。因此,项目当前的功能可用性无法保证,部分问题可能暂时无法由本人修复。

欢迎有能力、具备在校测试环境的同学积极提交 Pull Request,共同参与维护,协助适配上游接口、修复问题和完善文档。遇到问题也欢迎通过 Issues 提供复现步骤、错误信息和改进建议。感谢大家的理解与支持!

UCAS Course Sign in

UCAS 课程查询与签到二维码生成工具。

在线访问:自有域名 · Vercel 地址

网站已于 2026 年 10 月 22 日恢复访问,此前因访问量超过 Vercel 免费额度而被暂停。目前仍不稳定,有时能签到成功,有时会出现接口异常或超时。为避免大家集中使用这两个公共网址再次超过免费额度,建议有能力的同学部署到自己的 Vercel 账号。查看详细说明与一键部署。

Caution

本项目仅供学习交流使用,请勿用于任何商业用途或非法用途。

本项目用于复现 XXXX 的课程查询与签到链路,帮助用户在网页端完成以下流程:

  1. 输入学号、密码和日期,查询当天课程
  2. 选择课程,生成可实时刷新的签到二维码
  3. 在可签到时间内直接发起签到
  4. 手动输入课程 ID 或 UUID,生成对应签到码

运行截图

亮色模式

暗色模式

课程列表与二维码

快速开始

在线访问

网站已于 2026 年 10 月 22 日恢复访问,此前因超过 Vercel 免费请求额度而被暂停。目前仍不稳定,有时能签到成功,有时会出现接口异常或超时,请以学校系统中的实际签到记录为准。

免费额度

这两个公共网址使用 Vercel Hobby 免费服务,使用人数过多可能超过额度,导致网站再次暂停。主要免费额度如下(最近 30 天,2026-10-22 核对,详见 Vercel 官方说明):

资源 Hobby 免费额度
CDN 请求数(CDN Requests,原 Edge Requests) 100 万次
函数调用次数(Function Invocations) 100 万次
对访客的数据传输(Fast Data Transfer) 100 GB
源站与 CDN 间的数据传输(Fast Origin Transfer) 10 GB
函数 CPU 执行时间(Active CPU) 4 CPU 小时
函数预置内存用量(Provisioned Memory) 360 GB·小时

一键部署到自己的账号

建议有能力的同学部署到自己的 Vercel 账号,使用自己的网址,避免大家集中使用公共网址超过免费额度。点击下方按钮,登录自己的账号,按页面提示完成部署即可:

Deploy with Vercel

自行部署也有相同的免费额度限制,仍可能遇到接口异常或超时。

本地运行

  1. 克隆仓库并安装依赖
git clone https://github.com/lccipher/UCAS-Course-Sign-in
cd UCAS-Course-Sign-in
npm install
  1. 启动开发环境
npm run dev

默认访问地址:http://localhost:3000

  1. 生产构建与启动
npm run build
npm run start
  1. 代码检查
npm run lint

部署上线(可选)

推荐使用 Vercel 进行部署,步骤如下:

  1. Fork 本仓库到你的 GitHub 账号
  2. 在 Vercel 导入项目
  3. Framework 自动识别为 Next.js
  4. Build Command 使用默认的 npm run build
  5. 部署完成后访问生成的域名

工作流程

Browser
	-> POST /api/course-uuid/query
		-> login.action (上游登录)
		-> get_stu_course_sched.action (上游课表)
	<- 返回课程列表(已脱敏整理)
Browser
	-> 选择课程 / 手动输入课程 ID 或 UUID
	-> 本地生成签到 URL + QR Code
	-> POST /api/course-uuid/sign(可选,直接签到)

说明:

  • 上游 sessionId 只在服务端请求链路中短暂使用,不回传前端。
  • 前端二维码和下载二维码都由本地生成,不依赖额外前端存储。
  • 直接签到时,服务端会先登录,再调用上游签到接口。

项目结构

.
├─ src/
│  └─ app/
│     ├─ api/
│     │  └─ course-uuid/
│     │     ├─ query/
│     │     │  └─ route.ts      # 登录 + 课表查询接口
│     │     └─ sign/
│     │        └─ route.ts      # 登录 + 直接签到接口
│     ├─ globals.css            # 全局样式与主题变量
│     ├─ layout.tsx             # 字体、元信息、主题初始化
│     └─ page.tsx               # 主页面(查询、列表、二维码、签到)
├─ public/
├─ doc/
├─ package.json
└─ README.md

API 说明

POST /api/course-uuid/query

查询课程列表。

请求头:

  • Content-Type: application/json

请求体:

{
	"username": "2025xxxxxxxxxx",
	"password": "your-password",
	"date": "20260325"
}

字段说明:

  • username:学号,必填
  • password:密码,必填
  • date:查询日期,支持 yyyyMMdd 或 yyyy-MM-dd

成功响应示例:

{
	"date": "20260325",
	"total": 2,
	"courses": [
		{
			"id": "114xxxx",
			"uuid": "CADD27F17ACC44EDAFxxxxxxxxxxxxxx",
			"courseName": "xxxxxxx",
			"teacherName": "xxx",
			"weekDay": "周三",
			"classBeginTime": "2026-03-25 10:25:00",
			"classEndTime": "2026-03-25 12:00:00",
			"signStatus": "1"
		}
	]
}

常见错误响应:

{
	"message": "登录接口请求超时",
	"code": "UPSTREAM_LOGIN_TIMEOUT"
}

POST /api/course-uuid/sign

发起直接签到。

请求头:

  • Content-Type: application/json

请求体:

{
	"username": "2025xxxxxxxxxx",
	"password": "your-password",
	"timeTableId": "CADD27F17ACC44EDAFxxxxxxxxxxxxxx"
}

字段说明:

  • username:学号,必填
  • password:密码,必填
  • timeTableId:课程 UUID,必填,必须是 32 位十六进制字符串

成功响应示例:

{
	"success": true,
	"message": "签到成功",
	"upstreamStatus": "0",
	"result": {
		"stuSignId": "123456",
		"stuSignStatus": "1"
	}
}

可能的失败响应:

{
	"success": false,
	"message": "签到失败,请稍后重试",
	"upstreamStatus": "1",
	"result": {
		"stuSignId": "123456",
		"stuSignStatus": "0"
	}
}

错误码与排查

HTTP 状态码

  • 400:请求体或参数格式错误
  • 401:登录失败(账号密码错误或上游鉴权失败)
  • 403:非同源请求
  • 409:签到请求已提交,但状态未完成
  • 415:Content-Type 不是 JSON
  • 429:触发限流
  • 502:上游接口异常或返回异常
  • 504:上游接口超时
  • 500:服务内部异常

常见 code

  • RATE_LIMITED
  • UPSTREAM_LOGIN_HTTP
  • UPSTREAM_LOGIN_BAD_JSON
  • UPSTREAM_LOGIN_TIMEOUT
  • UPSTREAM_LOGIN_NETWORK
  • UPSTREAM_SCHEDULE_HTTP
  • UPSTREAM_SCHEDULE_BAD_JSON
  • UPSTREAM_SCHEDULE_TIMEOUT
  • UPSTREAM_SCHEDULE_NETWORK
  • UPSTREAM_SIGN_HTTP
  • UPSTREAM_SIGN_BAD_JSON
  • UPSTREAM_SIGN_TIMEOUT
  • UPSTREAM_SIGN_NETWORK
  • UNEXPECTED_ERROR

技术栈

前端

  • Next.js 16.2.1(App Router)
  • React 19.2.4
  • TypeScript 5
  • Tailwind CSS 4
  • next/font(Noto Sans SC / Noto Serif SC / IBM Plex Mono)

服务端

  • Next.js Route Handler(Node.js runtime)
  • 原生 Fetch + AbortController 超时控制
  • 内存级限流(5 分钟窗口 + 每日上限)

工具链

  • ESLint 9 + eslint-config-next
  • qrcode 1.5.4(前端二维码生成)

License

AGPL-3.0 License

About

UCAS | 国科大 | 果壳 | 课程查询与签到二维码生成工具

Topics

Resources

Stars

170 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages