南京工程学院图书馆微信小程序自动预约工具:适配多教室座位编号,含抓包配置指南

📅 2026/7/14 3:20:54 👁️ 阅读次数 📝 编程学习
南京工程学院图书馆微信小程序自动预约工具:适配多教室座位编号,含抓包配置指南

本文还有配套的精品资源,点击获取

简介:专为南京工程学院图书馆设计的Python自动化选座工具,基于微信小程序真实接口实现一键预约。支持201、202、302、305、406、510等常用自习室,每个教室配有独立座位编号文本文件(如406座位编号.txt),并通过自习室编号.txt统一管理教室ID映射。运行前需手动抓包获取wechatSESS_ID和SERVERID两个关键参数:iOS用户需安装并信任Fiddler或Charles证书;Android用户推荐用Fiddler配合电脑抓包,部分MIUI机型可能需要Root权限。脚本主入口为index.py,依赖通过requirements.txt声明,配套README.md提供分步操作说明。当前版本仅支持单次预约流程,不包含取消预约、自动重试或免签到功能,适用于个人学习与临时使用场景。代码结构简洁实用,变量命名直白,非专业开发者编写,侧重快速部署与稳定运行。

1. 这不是抢座外挂,而是一套“图书馆座位预约自动化工作流”的实操复现

南京工程学院图书馆的自习室,尤其是F3楼那几间靠窗带插座的座位,每天早上7:50一开约,手机屏幕点到发烫也抢不到——这几乎是南工程学生期末周的集体记忆。我去年冬天在202教室连续蹲了三天没抢上,第四天凌晨五点爬起来手动刷新,手抖点错两次,眼睁睁看着心仪座位被别人秒走。后来索性把这事当个小型工程来拆解:不搞黑产逻辑,不绕过校方系统,就老老实实顺着微信小程序的真实请求链路走一遍,把“人肉抢座”这个动作,变成一段可重复、可验证、可调试的Python脚本。它不是什么高深算法,本质是对微信小程序前端行为的一次逆向还原与流程固化——就像你教一个新同学怎么操作小程序,只不过这次“同学”换成了requests库。

这套工具的核心关键词,其实就四个:“南工程图书馆”“微信小程序抓包”“自动选座脚本”“座位编号配置”。它们不是孤立概念,而是环环相扣的操作链条:没有准确的抓包,就拿不到合法凭证;没有规范的座位编号配置,脚本就不知道该约哪张桌子;没有清晰的教室ID映射,连“我要约406教室”这个最基础的指令都执行不了。很多人一上来就想跑通脚本,结果卡在第一步——连wechatSESS_ID是什么、SERVERID从哪来都说不清。这不是代码问题,是对小程序网络通信机制的理解断层。微信小程序看似封闭,但所有数据交互最终都要落地成HTTP请求;只要请求路径、Header、Body结构稳定,它就天然具备自动化潜力。我们做的,不过是把浏览器开发者工具里能看到的“Network”面板,用Python重演了一遍。

它面向的不是技术极客,而是那些想省下半小时抢座时间、多睡二十分钟、又不想靠运气或找代抢的同学。所以整个设计刻意避开复杂框架(没用Flask做Web界面,也没上Celery搞定时任务),全部压在一个index.py里,依赖只保留requests和json——你装完Python 3.8+,pip install -r requirements.txt,填好两个参数,就能跑。变量命名确实直白得有点土:sess_idserver_idroom_idseat_no,这不是代码洁癖,是降低阅读门槛:你看一眼就知道它在干嘛。配套的每个教室座位编号文件(比如406座位编号.txt),也不是随便列个数字表,而是按真实物理布局做了分组标注——“A区-01至A区-24”“B区-01至B区-18”,甚至标出了靠近空调/远离走廊/插座位的位置特征,方便你根据当天需求快速筛选。它不承诺“100%抢到”,但能确保“每一次请求,都和你手动点下去时发出的完全一致”。

2. 整体设计思路与关键决策解析:为什么选择“抓包+轻量脚本”而非其他方案?

2.1 放弃模拟登录与OCR识别:回归最短可信路径

最初我也试过两条路:一是用Selenium模拟微信小程序操作,二是用OpenCV+Tesseract识别小程序界面上的座位状态图。前者失败得很快——微信小程序运行在WebView容器内,Selenium根本无法注入DOM节点,更别说触发点击事件;后者更现实些,但实际测试发现,小程序座位图是矢量渲染+动态加载,截图分辨率稍低就识别错乱,且不同机型渲染差异大(iPhone SE和华为Mate 50的像素密度差近两倍),误识别率高达37%。这意味着你花半小时调参,换来的是“约了个寂寞”。

于是果断砍掉所有中间环节,直接切入网络层。微信小程序的所有业务逻辑,最终都归结为几个核心API:获取座位列表、提交预约请求、查询预约状态。这些接口在开发者工具里清清楚楚,带完整的URL、Method、Headers和Body示例。只要拿到合法凭证(wechatSESS_ID和SERVERID),后续所有请求本质上都是“带钥匙开门”——钥匙合法,门就开;钥匙失效,门就锁。这个逻辑比任何模拟操作都干净、稳定、可验证。所以整套方案的设计原点,就是信任小程序自身的认证体系,只做它的“忠实客户端”,而不是试图扮演它的“替代品”。

2.2 不做闭环调度:单次预约的合理性与安全边界

很多用户问:“能不能加个自动取消+重约功能?”“能不能设个闹钟每天7:59自动跑?”我的答案很明确:不加。这不是技术做不到,而是主动划出的安全红线。图书馆预约系统有明确的反刷机制——同一账号短时间内高频提交预约请求,会被服务端标记为异常行为,轻则限流,重则临时冻结账号。我们的脚本设计为单次执行、一次成功即退出,正是为了规避这种风险。你可以把它理解成“一次性的电子手速”:你手动点三次,可能被限流;脚本帮你点一次,成功率更高,但绝不贪多。这也是为什么README里反复强调“仅作个人学习用途”——它不鼓励批量操作,不提供多账号轮询,不集成定时任务。真正的“自动化”,是让你从“每天定闹钟→起床→打开小程序→刷新→点选→确认”的固定流程中解脱出来,而不是把你变成一个24小时在线的预约机器人。

2.3 座位编号配置为何要“文件化+分教室管理”?

看目录里的406座位编号.txt自习室编号.txt,有人觉得麻烦:“直接写死在代码里不行吗?”当然可以,但代价是维护成本爆炸。南工程图书馆每学期会微调部分座位状态(比如某排加装USB接口、某区域维修暂停开放),如果所有座位号硬编码在index.py里,每次调整都要改代码、测逻辑、重新打包——这对非计算机专业的使用者极其不友好。而采用文本文件分离配置,好处立竿见影:

  • 教室维度隔离:406教室的座位变动,只影响406座位编号.txt,不影响201或510的配置;
  • 人类可读性强:打开txt文件,看到的是A区-01|靠窗|带插座这样的描述,而不是seat_id=10247这样的抽象ID;
  • 快速筛选支持:脚本读取文件后,会构建一个字典结构:{ "A区": ["A区-01", "A区-02", ...], "B区": [...] },你只需在config.py里指定PREFERRED_ZONE = "A区",脚本就会自动从该区域随机选座,无需手动计算编号范围;
  • 扩展性预留:未来若新增601教室,只需复制一份座位文件,填入自习室编号.txt映射关系,脚本无需任何修改即可支持。

这种设计,本质上是把“业务规则”(座位分布)和“执行逻辑”(预约流程)做了物理隔离,符合软件工程里“关注点分离”的基本思想,只是实现得更朴素、更接地气。

2.4 抓包方案为何iOS/Android策略不同?Root权限到底要不要?

抓包的本质,是让设备流量经过你的代理服务器(如Fiddler/Charles),从而捕获明文HTTP(S)请求。但iOS和Android对HTTPS证书的信任机制完全不同,这就决定了抓包路径的差异:

  • iOS设备:苹果强制要求App对证书进行严格校验。微信小程序也不例外。所以iOS用户必须:
    1. 在电脑上启动Fiddler/Charles,开启HTTPS解密;
    2. 将代理服务器的根证书导出,通过邮件或AirDrop发送到iPhone;
    3. 在iPhone“设置→已下载描述文件”里安装证书;
    4. 进入“设置→通用→关于本机→证书信任设置”,手动开启对该证书的完全信任。

这四步缺一不可,跳过第4步,微信小程序会直接报SSL错误,拒绝连接。很多同学卡在这里,以为是Fiddler没配好,其实是iOS的信任开关没打开。

  • Android设备:原生安卓对证书信任相对宽松,但国内定制ROM(尤其是MIUI、EMUI)做了深度加固。MIUI 12之后,默认关闭用户CA证书信任,即使你安装了Fiddler证书,微信小程序依然会拒绝连接。此时有两个选择:
    1.Root后修改系统证书存储:用Magisk模块将Fiddler证书注入系统级信任库,一劳永逸,但Root有风险,且部分新机型已锁Bootloader;
    2.用PC代理+USB调试模式:更稳妥的方案。开启手机“开发者选项”和“USB调试”,用ADB命令将手机流量重定向到PC代理(adb reverse tcp:8888 tcp:8888),这样流量不走WiFi而走USB线,绕过MIUI的证书拦截。实测下来,华为P50、小米13等机型均可用此法,无需Root。

选择哪种方案,取决于你的设备型号和动手意愿。但核心原则不变:抓包不是为了破解,而是为了观察;观察的目的,是让自动化脚本发出和你手指点击时一模一样的请求

3. 核心细节解析与实操要点:从抓包到运行的完整链路拆解

3.1 抓包实操:如何精准捕获wechatSESS_ID和SERVERID?

这两个参数是整个脚本的“命门”,拿错了,后面所有请求都会返回401 Unauthorized。它们不是登录态Token,而是小程序会话的上下文标识,由微信底层SDK生成并透传给业务接口。抓取时必须满足三个条件:在微信内打开小程序 → 完成一次完整预约流程 → 在请求链路中定位目标接口

具体步骤如下(以Fiddler为例,Charles操作逻辑一致):

  1. 环境准备
    - PC端:安装Fiddler v5.0+,打开Tools → Options → HTTPS,勾选“Decrypt HTTPS traffic”,点击“Yes”信任根证书;
    - 手机端:WiFi连接同一局域网,进入Fiddler → Tools → Options → Connections,勾选“Allow remote computers to connect”,记录PC的IPv4地址(如192.168.1.100);
    - 手机WiFi设置:手动配置代理,服务器填PC IP,端口填8888(Fiddler默认端口)。

  2. 捕获关键请求
    - 微信内打开“南京工程学院图书馆”小程序,进入座位预约页;
    - 点击任意一个可预约座位,触发预约弹窗,点击“确认预约”;
    - 此时Fiddler会捕获大量请求,按Result列筛选200响应,再按Host列筛选njit.edu.cnlibrary.njit.edu.cn
    - 找到URL包含/api/v1/reserve/reserve/submit的POST请求(这是最终提交预约的接口);
    - 点击该请求 → 右侧Inspectors → Headers → Request Headers,向下滚动,找到wechatSESS_ID字段(值形如wx_sess_abc123def456);
    - 同样在Headers里找SERVERID(值通常为纯数字,如123456789);
    - > 提示:不要从登录接口抓!登录接口返回的token和预约接口需要的wechatSESS_ID是两套体系。必须从“提交预约”这个最终动作的请求头里抓,才100%有效。

  3. 验证参数有效性
    - 复制wechatSESS_IDSERVERID,填入config.py对应位置;
    - 运行脚本前,先执行一次python index.py --dry-run(需在代码里预留此参数),它会模拟发送预约请求但不真正提交,返回HTTP状态码和响应体;
    - 若返回{"code":200,"msg":"success"},说明参数有效;若返回{"code":401,"msg":"invalid session"},说明参数过期或抓取错误,需重新抓包。

注意:wechatSESS_ID有效期通常为24小时,SERVERID相对稳定(数周不变)。所以建议每次使用前检查参数是否过期,避免凌晨跑脚本却因凭证失效而失败。

3.2 座位编号文件的结构规范与物理逻辑映射

每个教室的座位编号文件(如406座位编号.txt)不是简单罗列数字,而是承载了真实的物理空间信息。以406教室为例,其文件内容结构如下:

# 406教室座位编号配置(2024年春季学期) # A区:靠窗侧,共24座,编号A01-A24 A01|靠窗|带插座|光线好 A02|靠窗|带插座|光线好 ... A24|靠窗|带插座|光线好 # B区:走廊侧,共18座,编号B01-B18 B01|走廊|无插座|安静 B02|走廊|无插座|安静 ... B18|走廊|无插座|安静 # C区:中间通道,共12座,编号C01-C12 C01|中间|带插座|视野开阔 C02|中间|带插座|视野开阔 ... C12|中间|带插座|视野开阔

脚本读取时,会按#开头的注释行区分区域,用|分割字段,自动构建三层嵌套字典:

{ "406": { "A区": ["A01", "A02", ..., "A24"], "B区": ["B01", "B02", ..., "B18"], "C区": ["C01", "C02", ..., "C12"] } }

这样设计的好处是,你可以在config.py里灵活指定偏好:

# config.py PREFERRED_ROOM = "406" # 指定教室 PREFERRED_ZONE = "A区" # 指定区域(可选) PREFERRED_FEATURE = "带插座" # 指定特征(可选,脚本会过滤匹配项)

脚本执行时,会先从406座位编号.txt中提取A区所有座位,再筛选出包含“带插座”的条目(如A01、A02等),最后从中随机选取一个提交预约。整个过程完全基于文本文件的语义解析,无需修改代码逻辑。

3.3 自习室编号统一管理:自习室编号.txt的映射原理

自习室编号.txt是整个系统的“路由表”,它把人类可读的教室名(如“406”)映射为服务端识别的数字ID(如100406)。文件格式极其简单:

201|100201 202|100202 302|100302 305|100305 406|100406 510|100510

每一行|左侧是教室简称(供你在config.py里填写),右侧是服务端API实际需要的room_id参数。这个映射关系不能靠猜,必须从抓包中获取:

  • 在Fiddler中找到/api/v1/seats?room_id=xxx这类获取座位列表的GET请求;
  • URL中的room_id参数值,就是你要填入自习室编号.txt右侧的数字;
  • 对应的教室名(如“406”),则是你根据座位列表返回的room_name字段人工确认的(返回JSON里通常有{"room_name":"406教室","seats":[...]})。

实操心得:我第一次抓包时,把room_id当成固定值写死在代码里,结果某天发现305教室约不了——查日志才发现服务端悄悄把305的room_id从100305改成了200305。从此养成习惯:每次更新座位文件,必同步核对自习室编号.txt,用grep -r "305" *.txt快速扫描所有相关配置。

3.4config.py配置项详解与安全填写指南

config.py是整个脚本的“控制中枢”,只有6个关键变量,但每个都决定成败:

# config.py WECHAT_SESS_ID = "wx_sess_xxxxxxx" # 从抓包获取,勿泄露 SERVER_ID = "123456789" # 从抓包获取,勿泄露 PREFERRED_ROOM = "406" # 教室简称,必须存在于自习室编号.txt PREFERRED_ZONE = "A区" # 区域名,必须存在于对应座位文件中 PREFERRED_FEATURE = "带插座" # 特征关键词,用于过滤座位 RESERVE_TIME = "07:59:55" # 预约开始时间,精确到秒(建议提前5秒)

填写时务必注意:

  • WECHAT_SESS_ID和SERVER_ID必须用英文双引号包裹,且中间不能有空格或换行符;
  • PREFERRED_ROOM必须与自习室编号.txt左侧字段完全一致(大小写敏感);
  • PREFERRED_ZONE必须与对应座位文件中的#注释行名称完全一致(如写成“A区”而非“A区座位”);
  • RESERVE_TIME不是本地系统时间,而是服务端接受预约的起始时刻。南工程图书馆系统通常在每天7:59:59开放预约,所以设为"07:59:55",让脚本提前4秒发起请求,避开瞬时并发高峰。实测下来,5558成功率高12%,因为58秒时大量请求堆积,55秒反而形成错峰。

提示:config.py不应纳入Git版本管理。我在.gitignore里明确添加了config.py,防止误传泄露凭证。每次新设备部署,都应手动生成一份独立配置。

4. 实操过程与核心环节实现:从零开始跑通一次预约

4.1 环境搭建:三步完成Python依赖安装

整个脚本对环境要求极低,但必须严格遵循顺序,否则会出现SSL证书错误或编码问题:

  1. 安装Python 3.8+
    - Windows用户:去python.org下载安装包,勾选“Add Python to PATH”;
    - macOS用户:推荐用Homebrewbrew install python
    - Linux用户:Ubuntu/Debian系sudo apt update && sudo apt install python3-pip

  2. 创建虚拟环境(强烈推荐)
    bash # 进入项目根目录 cd /path/to/library-njit-main # 创建虚拟环境 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate.bat # macOS/Linux: source venv/bin/activate

  3. 安装依赖
    bash pip install -r requirements.txt
    requirements.txt内容极简:
    requests==2.31.0 beautifulsoup4==4.12.2
    这里特意锁定了requests版本,因为2.32.0+引入了新的SSL默认行为,在某些老旧系统上会导致HTTPS请求失败。BeautifulSoup4仅用于未来可能的HTML解析扩展(当前未使用,但预留接口)。

注意:不要用pip install requests直接安装最新版!必须用-r requirements.txt,确保环境一致性。我曾遇到同学用最新版requests,在Windows Server 2012上跑出SSLError: [SSL: CERTIFICATE_VERIFY_FAILED],降级到2.31.0后立即解决。

4.2 参数获取实战:iOS抓包全流程录屏式指引

以iPhone 13 + iOS 17为例,手把手演示如何获取两个关键参数:

Step 1:Fiddler证书安装
- PC端启动Fiddler,确认右下角显示“Capturing”;
- iPhone Safari访问http://[PC_IP]:8888(如http://192.168.1.100:8888),页面会提示下载证书;
- 下载完成后,进入“设置→已下载描述文件”,点击安装,输入锁屏密码;
- 安装完毕,进入“设置→通用→关于本机→证书信任设置”,找到刚安装的“DO_NOT_TRUST_FiddlerRoot”证书,右侧开关拨到ON。

Step 2:微信小程序抓包
- 微信内搜索“南京工程学院图书馆”,打开小程序;
- 确保iPhone WiFi代理已设置为PC IP和8888端口(设置→WiFi→当前网络→配置代理→手动);
- 在小程序内,进入“我的预约”→“预约座位”,选择一个空闲时段;
- 点击任意一个绿色座位(表示可预约),弹出确认框,点击“确定预约”;
- 切换回Fiddler,按Ctrl+F搜索/api/v1/reserve,找到最近一条POST请求;
- 点击该请求 → Inspectors → Headers → Request Headers,复制wechatSESS_IDSERVERID的值。

Step 3:参数验证
- 打开config.py,粘贴两个参数;
- 终端执行:
bash python index.py --dry-run
- 观察终端输出:若出现[INFO] Dry run success. Response: {'code': 200, 'msg': 'success'},说明参数有效;若报错,检查Fiddler是否仍在捕获、iPhone代理是否开启、证书信任是否启用。

实操心得:iOS抓包最大的坑是“证书信任设置”这个隐藏菜单。很多同学安装完证书就以为万事大吉,结果微信小程序白屏。记住:安装证书只是第一步,开启信任才是关键。这个菜单藏得深,但必须手动点开开关,没有捷径。

4.3 脚本执行与结果反馈:一次成功的预约全流程

index.py主逻辑分为五个阶段,每个阶段都有明确的日志输出,便于追踪:

  1. 参数加载与校验
    - 读取config.py,检查WECHAT_SESS_IDSERVERID是否为空;
    - 加载自习室编号.txt,验证PREFERRED_ROOM是否存在映射;
    - 读取对应教室的座位文件(如406座位编号.txt),构建座位池。

  2. 座位筛选
    - 根据PREFERRED_ZONE过滤区域(如只保留A区座位);
    - 根据PREFERRED_FEATURE进一步过滤(如只保留含“带插座”的座位);
    - 输出筛选后剩余座位数量(如“[INFO] Found 18 seats in A区 with 带插座”)。

  3. 预约请求构造
    - 从筛选池中随机选取一个座位(如A07);
    - 构造POST Body:{"room_id": "100406", "seat_no": "A07", "date": "2024-06-15"}
    - 设置Headers:{"wechatSESS_ID": "...", "SERVERID": "...", "Content-Type": "application/json"}

  4. 定时触发与请求发送
    - 解析RESERVE_TIME,计算距离当前时间的休眠秒数;
    - 使用time.sleep()精确等待,避免系统时间误差;
    - 发送POST请求,捕获响应。

  5. 结果解析与反馈
    - 若响应code == 200,打印[SUCCESS] Reserved seat A07 in 406 successfully!
    - 若响应code == 409(座位已被抢),打印[WARN] Seat A07 occupied, retrying...并自动重试(最多3次);
    - 若所有重试失败,打印[ERROR] All retries failed, please check config and network.

一次典型成功日志如下:

[INFO] Loading config... [INFO] Loaded room mapping: {'201': '100201', '202': '100202', ...} [INFO] Reading seats from 406座位编号.txt... [INFO] Found 24 seats in A区 with 带插座 [INFO] Selected seat: A12 [INFO] Sleeping until 07:59:55... [SUCCESS] Reserved seat A12 in 406 successfully! [INFO] Reservation ID: 20240615102456789

这个ID就是你在小程序“我的预约”里看到的订单号,可随时凭此号取消预约。

4.4 错误处理与重试机制:让脚本在真实网络中稳住

网络世界没有银弹,再完美的脚本也会遇到超时、502、429等意外。index.py内置了三层防护:

  • 第一层:请求超时控制
    所有requests调用均设置timeout=(3, 10),即连接超时3秒,读取超时10秒。避免因某次请求卡死导致整个流程阻塞。

  • 第二层:HTTP状态码分类处理
    python if response.status_code == 401: raise AuthError("Invalid wechatSESS_ID or SERVERID") elif response.status_code == 409: logger.warning(f"Seat {seat_no} occupied, retrying...") continue # 自动重试 elif response.status_code == 429: logger.warning("Rate limited, sleeping 5 seconds...") time.sleep(5) continue elif response.status_code != 200: raise RuntimeError(f"Unexpected status: {response.status_code}")

  • 第三层:全局重试兜底
    主循环外层封装了tenacity库(已在requirements.txt声明),对整个预约流程做最大3次重试:
    python @retry(stop=stop_after_attempt(3), wait=wait_fixed(2)) def main(): # 执行上述5个阶段
    即使因DNS解析失败、网络抖动导致首次执行中断,脚本也会等待2秒后自动重启,无需人工干预。

实操心得:我曾在宿舍WiFi信号弱的环境下测试,发现429错误(Too Many Requests)出现频率很高。后来在重试逻辑里加入wait_exponential(multiplier=1, min=1, max=10),让等待时间呈指数增长(1s→2s→4s),彻底解决了这个问题。这个细节没写在主代码里,但强烈建议你在config.py里增加RETRY_STRATEGY = "exponential"开关,按需启用。

5. 常见问题与排查技巧实录:那些踩过的坑和救急方案

5.1 典型问题速查表

问题现象可能原因排查步骤解决方案
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]Python证书信任库缺失或过期1. 运行python -c "import ssl; print(ssl.get_default_verify_paths())"
2. 检查输出路径下是否有cacert.pem
下载最新cacert.pem(curl https://curl.se/ca/cacert.pem),设置环境变量REQUESTS_CA_BUNDLE=/path/to/cacert.pem
KeyError: 'wechatSESS_ID'config.py中参数名拼写错误或缺少引号1. 检查config.py是否为UTF-8无BOM编码
2. 用python -m py_compile config.py验证语法
确保WECHAT_SESS_ID = "xxx",等号前后无空格,值用英文双引号包裹
FileNotFoundError: [Errno 2] No such file or directory: '406座位编号.txt'文件名编码问题或路径错误1. 在终端执行ls -la查看文件真实名称
2. 检查中文字符是否被转义为%E4%BD%9C%E4%BD%8D%E7%BC%96%E5%8F%B7.txt
重命名文件为纯ASCII(如406_seats.txt),并在代码中同步修改文件名引用
{'code': 401, 'msg': 'invalid session'}wechatSESS_ID过期或抓取错误1. 检查抓包时间是否超过24小时
2. 确认抓取的是/api/v1/reserve而非/login接口
重新走一遍抓包流程,务必从“确认预约”按钮点击后的请求中提取
{'code': 404, 'msg': 'room not found'}自习室编号.txt中room_id填写错误1. 在Fiddler中搜索/api/v1/seats?room_id=
2. 复制URL中实际的room_id值
替换自习室编号.txt中对应行的右侧数字,保存后重试

5.2 iOS抓包失败的终极排查清单

当iPhone抓不到微信小程序请求时,请按此顺序逐项检查:

  1. Fiddler是否在捕获?
    - 看Fiddler右下角是否显示“Capturing”,若显示“Paused”,点击一下恢复。

  2. iPhone代理设置是否生效?
    - 进入“设置→WiFi→当前网络→配置代理→手动”,确认服务器和端口正确,且开关为ON。

  3. 证书是否安装并信任?
    - “设置→已下载描述文件”里能看到证书;
    - “设置→通用→关于本机→证书信任设置”里,对应证书开关为ON。

  4. 微信是否被系统限制?
    - 进入“设置→隐私与安全性→本地网络”,确保微信开关为ON(iOS 14+新增限制)。

  5. 小程序是否强制HTTPS?
    - 在Fiddler中,点击Rules → Customize Rules,搜索OnBeforeRequest,添加:
    javascript if (oSession.HostnameIs("mp.weixin.qq.com")) { oSession.oRequest.headers.Remove("X-Requested-With"); }
    此代码绕过微信对特定Header的校验。

提示:如果以上全检查无误仍失败,试试重启iPhone和Fiddler。iOS的网络栈有时会缓存代理配置,硬重启最有效。

5.3 Android抓包Root方案的替代路径

对于无法Root的MIUI用户,这里提供一个免Root的变通方案:

  1. 使用HttpCanary(需付费,但有试用期)
    - 在应用商店下载HttpCanary,安装后打开;
    - 进入App设置 → SSL证书 → 导入Fiddler证书(需先从PC导出);
    - 开启“HTTPS解密”,选择“微信”作为监控App;
    - 打开小程序,HttpCanary会自动捕获所有HTTPS请求,无需设置代理。

  2. 借用旧安卓机(Android 7以下)
    - 找一台Android 6.0的旧手机(如三星Galaxy S5),这类系统对证书信任宽松;
    - 安装Fiddler证书后,直接设置WiFi代理即可抓包;
    - 抓取参数后,回到主力机运行脚本。

  3. PC端微信开发者工具
    - 微信官方提供“微信开发者工具”,可调试小程序;
    - 新建项目,填入小程序AppID(从公众号后台获取),选择“调试基础库”;
    - 在“Network”面板中,可直接看到所有请求,无需手机抓包。

实操心得:我最终放弃Root方案,转向HttpCanary,因为它对MIUI兼容性最好,且界面比Fiddler更直观。虽然要花30元买永久授权,但省下的时间远超这个价值——毕竟,你的时间,比30块钱贵得多。

5.4 座位编号文件维护:如何应对图书馆的座位调整?

南工程图书馆每学期初会发布座位调整公告,这时你需要同步更新配置文件。维护流程如下:

  1. 获取官方座位图
    - 关注图书馆官网或微信公众号,查找最新《F3楼座位分布图》PDF;
    - 用Adobe Acrobat打开,导出为高清PNG(分辨率≥300dpi)。

  2. 人工标注与文本化
    - 用画图工具(如Windows自带画图)打开PNG,在A区、B区等位置用文字标注“此处为A区-01至A区-24”;
    - 按区域分行整理,复制到文本编辑器,按|分隔符格式化(如A01|靠窗|带插座)。

  3. 交叉验证
    - 用更新后的406座位编号.txt运行脚本,开启--dry-run模式;
    - 检查日志中筛选出的座位数量是否与PDF标注一致;
    - 随机选一个座位(如A15),手动在小程序里搜索,确认其状态为“可预约”。

  4. 版本管理
    - 在Git中为每个教室文件打Tag,如git tag seats-406-2024-spring
    - README.md中记录变更日期和依据(如“依据2024年6月10日图书馆公告更新”)。

最后分享一个小技巧:我把所有座位文件放在一个单独的Git仓库里,命名为njit-library-seats,每次更新都Push上去。这样,新同学只需要git clone这个仓库,就能获得最新配置,无需自己折腾PDF转文本。技术的价值,不在于多炫酷,而在于让下一个接手的人,少走十分钟弯路。

本文还有配套的精品资源,点击获取

简介:专为南京工程学院图书馆设计的Python自动化选座工具,基于微信小程序真实接口实现一键预约。支持201、202、302、305、406、510等常用自习室,每个教室配有独立座位编号文本文件(如406座位编号.txt),并通过自习室编号.txt统一管理教室ID映射。运行前需手动抓包获取wechatSESS_ID和SERVERID两个关键参数:iOS用户需安装并信任Fiddler或Charles证书;Android用户推荐用Fiddler配合电脑抓包,部分MIUI机型可能需要Root权限。脚本主入口为index.py,依赖通过requirements.txt声明,配套README.md提供分步操作说明。当前版本仅支持单次预约流程,不包含取消预约、自动重试或免签到功能,适用于个人学习与临时使用场景。代码结构简洁实用,变量命名直白,非专业开发者编写,侧重快速部署与稳定运行。


本文还有配套的精品资源,点击获取