python利用requests模块+win32service+BlockingScheduler实现学习通图书馆定时预约抢座

前言:

        今年由于疫情的原因,基本上人多的活动场地都有了预约的功能。本人有幸作为一个女团周边商城开发技术,因为女团有许多的活动,所以开发了一套预约系统,断断续续不停的加功能,写了两个多月,功能繁琐的要命,所以我对预约相关的功能十分敏感。

        最近有个考研备考的朋友找到我,问我能不能搞个自动预约的东西,他一直被一个小姑娘抢座位,没法复习了。我一听这就来劲了,谁当初为了学程序,不是想着有一天可以实现一些同一件事上可以帮自己比别人更牛比的程序。想法有了,就是要实现的时候了。

        他直接给我了个二维码让我扫,说这个就是那个座位的预约二维码。很好,扫过后是一个https链接,然后我复制到电脑上打开,查看源代码和http相关信息。但是浏览器F12提供的内容并不是太完整,包括你刷新页面后,请求全都没有了,这时候一个强大的工具就显得格外重要了“fiddler”,一个可以抓手机上的包的抓包工具,通过它我们很容易的能获取到http请求和响应的一些信息。至于fiddler的使用及抓手机包的方法,网上一大堆,这里不再赘述。


fiddler

扫码后复制的地址:https://passport2.chaoxing.com/mlogin?loginType=1&newversion=true&fid=&refer=http%3A%2F%2Foffice.chaoxing.com%2Ffront%2Fthird%2Fapps%2Fseat%2Fcode%3Fid%3Dxxxx%26seatNum%3Dxxx  (教室id和座位id不便透漏)

思考一下:自动预约功能,字面意思,肯定要有预约操作和程序定时自动执行了。



一、预约操作

这是本功能的主体。我首先在手机上操作了一番。得出人要操作的话,有以下步骤

1)登录

2)选择时间段

3)确定预约

看上去简单的三步,实际上实现还是要花点功夫的。



登录


登录

扫码后,如果没登录,则跳转到登陆页面。因为我们是爬虫程序跑的,所以本就没有保存登录状态cookie,需要每次预约都要从登陆开始走一遍。

我用python试着请求了一下,发现可以获取响应,所以就看着源代码开始找登录方法。


login.html

发现没有在页面写js,而是引用了一个外部的js文件,很显然登录方法就在这里面了。根据src相对路径,我们可以拼出他的全路径为:https://passport2.chaoxing.com/js/fanya/mobile/login.js?v=5,访问这个文件,然后Ctrl+F找到登录方法。


login.js

由上图可知,这个登陆方法需要的参数一共有5个,经过多次登录测试发现。

fid:可以默认为-1

uname:手机号

password:密码

refer:跳转来源,及从哪个页面跳到登录页面的,可以默认为“”,

t:默认为True

若登录成功则返回

{"url":"http%3A%2F%2Foffice.chaoxing.com%2Ffront%2Fthird%2Fapps%2Fseat%2Fcode%3Fid%3D4219%26seatNum%3D380","status":true}

url:为登录成功要跳转的页面

status:为是否成功

本以为一个小小的登录很容易,没想到却试了几次都不成功。密码也加密了,就是不成功。后面想,肯定是缺什么东西了,从一个http请求来看,除了参数可以穿东西,后台也是可以通过cookie来获取信息的。果然,请求登录页面的时候,响应里面返回了两条cookie,如下图。


login.cookie

就是这俩cookie,请求的时候传过去就可以了


login


看上图,我们获取到cookie后保存到对象的headers变量中,成功后我们获取的cookie有这些。注意,这些非常重要,因为你接下来的每个请求都要用到他们。

预约

终于登陆可以了,接下来就是重头戏了,也是本功能的重点。同样的道理,要想预约肯定要调用预约的接口,但是预约的接口在哪里呢,这还是要我们到 预约的页面去看了。就是那个二维码啦。

{"url":"http%3A%2F%2Foffice.chaoxing.com%2Ffront%2Fthird%2Fapps%2Fseat%2Fcode%3Fid%3Dxxxx%26seatNum%3Dxxx","status":true}

还记得这个吗,这是登录成功返回的,url就是那个扫码的页面。我们把他解码后就是http://office.chaoxing.com/front/third/apps/seat/code?id=xxxx&seatNum=xxx

id:教室ID

seatNum:座位ID


访问这个页面后我们可以得到它的源码,然后就要开始找方法了


submit

对一个请求来说,我们不管他会返回什么,我们就只管知道他需要什么。

看参数

roomId:很显然这是教室ID

day:大胆猜测,应该是预约的日期,至于是什么格式,我们后面再找

startTime:,endTime:既然日期有了,这个肯定是时间段了,不过我们也是还不知道格式,待会去找

token:页面生成自带的,这个很重要,是一个防刷的方式

type:1固定参数

好了,我们现在需要知道三个时间的格式是什么了

day: _this.chosedDay,我们在上下文找一下这个变量,发现了它:_this.chosedDay = moment().format('YYYY-MM-DD'),所以我们可以锁定基本上格式为2020-09-21。

至于startTime和endTime,我们继续找发现了它


vue.js

如果有Vue基础的人应该能知道了,这个参数应该是从其他地方获取的了,我们去找一下。

找啊找,找啊找。终于一番倒腾,终于找到了


roominfo

通过调用教室信息来获取可预约的时间信息。当然也看到了用的是('HH:mm')

好了,我们时间都知道了,也是相当于所有参数都知道了,我们现在要去跑一下了。

这时候你想到了用登陆返回的cookie来去请求就一定成功。额,又草率了。其他的不说,这个cookie用的是真的多啊,这个系统。这个预约页面访问的时候也返回了几个cookie。经过我多次尝试,发现登录的那个cookie用来提交是不可行的。两个cookie叠加起来也是不可行的,只能使用预约页面返回的cookie才可以。


cookie

终于我们成功了。

{"data":{"seatReserve":{"deptId":xxxx,"duration":"3.0","endTime":1600678800000,"expireTime":1600669200000,"firstLevelName":"xxxxxxx","id":xxxxxx,"inserttime":1600617601000,"learnDuration":0,"roomId":xxxx,"seatNum":"xxx","secondLevelName":"xx","signDuration":20,"startTime":1600668000000,"status":0,"thirdLevelName":"xxxxx","uid":60165572,"updatetime":1600617602000}},"success":true}

返回success:true,说明预约成功了。

但是有个问题,那就是一天最多能预约8个小时,每次提交只能4个小时。所以想预约满的话要提交两次。

这时候可能回想,那个方法,时间段一改,再调用不就完事儿了吗。想的太简单了。

那个token,肯定不是白传的。

多次测试发现每次请求页面,token的值都不一样。说明什么?我们每次都要请求一次页面,我还发现,页面返回的cookie也不一样。是真的烦啊。只能循环时间段的时候,把cookie和token给重置掉。然后就皆大欢喜了。。。。。


自动服务

因为我主要搞的是C#,所以嘛,就windows系统了,做一个windows服务来解决它,当然我们也需要一个定时作业。所以就有了他们

win32service+BlockingScheduler

它们其实我也不太熟,就是直接搜直接用。

这里我放两个链接,想了解的可以看一下:

win32service:https://www.cnblogs.com/shenh/p/8931620.html

BlockingScheduler:https://blog.csdn.net/lipachong/article/details/99962134

基本概念就是到半夜12点整开始请求,为了防止ip被封掉,每次请求我sleep了0.5秒。执行完后发个邮件通知给我朋友。OK,完美。

初次写文章,可能有点凌乱哈。作为一个自学一年python的小老弟感觉我的代码还是不得行,感兴趣的大佬可以指点指点奥。

项目地址:python-requests: python利用requests模块+win32service+BlockingScheduler实现学习通图书馆定时预约抢座

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容