搜 索

使用python进行易班晚点签到与自动化部署

  • 4.3k阅读
  • 2021年04月22日
  • 16评论
首页 / 科技区 / 正文

学校要求易班晚点签到,但是每天手动点一遍(尤其是遇见易班糟糕的定位)显著降低了我生活的幸福感。在参考了别的大佬们的解决方案之后,我完整走了一遍易班自动晚点签到的流程,造福了自己也造福了宿舍hhh。

在网页上打开易班

如果想要找易班的请求,肯定得在浏览器上先打开易班。与易班的网页版不同,晚点签到和填日报等是有专门的网址的,网址可以点击右上角的三个点中的“复制链接”找到,实际上为:https://c.uyiban.com/#/

不过,如果直接打开网页去访问的话,则会发现无法打开,它会要求你使用易班app或微信打开,不过这里可以使用伪造User Agent的方法去访问,流程如下:

我自己是通过Fiddler抓包的,手机的User Agent为

Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 yiban_iOS/4.9.4

直接复制即可用。而后自己登录,就可以看到手机上显示的易班界面了。

获取宿舍经纬度

登录后点开晚点签到,按F12观察一番,就可以发现所用的地图使用了高德的接口:

image-20210422214729155

所以,我们需要去高德开发者平台找到宿舍的经纬度。网页地址为:https://lbs.amap.com/tools/picker

首先在手机上找一下自己宿舍的全名叫什么。我这随便找了个宿舍做示例,可以看到它的全名是“南京师范大学仙林校区北苑36栋学生公寓”。

接下来在上面的网址中输入宿舍全名,如下图所示,很顺利地就获取到了宿舍的坐标:

找到签到请求

在Network中,按ctrl+R,找到发送请求的URL。

image-20210422215256992

我这里已经签到过了,没有点击签到的按钮,实际上还有一个最主要的签到请求是sginIn

由此再观察试验一下,就可以结合代码食用了。

代码食用

已上传至github:https://github.com/YonniYe/yibanNightAttendance

使用任务计划程序部署自动化

关于如何部署自动化,我之前曾设想过许多方案,最后综合考量,觉得还是使用windows的【任务计划程序】最为方便。Linux上的crontab自己不太熟悉,等以后有空了再部署到自己的服务器上,实现真·自动化。

局限性:使用windows的【任务计划程序】要求到了晚上签到的时间电脑必须是开机并且能连网的。

win10自带的【任务计划程序】可以设置计划任务,让设定的任务周期性自动运行。我也就是基于这个思路,让python脚本在其上定期执行。设置方法如下:

1、单击右上角的【创建任务】,新建一个自动化任务。

2、设置触发器。触发器就是定期执行的时间段,例如我学校是周日到周四10点签到,周五、周六11点半签到,那么就可以按我这样设置签到的触发器。

3、设置操作。这一步比较关键,因为要执行的是python脚本文件,所以需要格外注意填入的方式。

到这里就已经可以啦!每天到了时间任务计划程序就会自动帮我们晚点签到了,如果程序真出了bug,也可以点击任务计划程序右边的“运行”让舍友手动帮助全宿舍一起签到。

修改auth函数(2021.7.2)

发现程序的auth()函数在执行时会报错,显示无法正确得到location字段。排查后发现,是易班的接口发生了修改,按原来的程序运行会加一步重定向,返回的headers不直接包含verifyRequest,如下所示:

我尝试了去用那个返回的X-Request-Id作为token,写入重定向后的网址,并在网址后加入?mobile=?passwork=,但是依旧没有返回正确的结果。参考原作者的代码后,发现可以作如下修改:

我和原作者对auth()的修改有细小差异,总体影响不大。
在第29行后插入:

self.HEADERS["Authorization"] = "Bearer " + self.access_token
self.COOKIES["loginToken"] = self.access_token  # 添加COOKIES字段

auth()函数一开始的部分修改为:

act = self.session.get("http://f.yiban.cn/iapp/index?act=iapp7463", allow_redirects=False, 
                        cookies=self.COOKIES).headers["Location"]  # Response [302] 重定向
verifyRequest = re.findall(r"verify_request=(.*?)&", act)[0]

修改完后,发现verifyRequest就回来了:

参考资料

https://hub.fastgit.org/rookiesmile/yibanAutoSgin
https://blog.csdn.net/TengWan_Alunl/article/details/105065966

评论区
凤羽衣 2022年6月3日 21:17
回复

自己抓包无法登录是怎么回事?已经安装FiddlerROOT.cer了
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Seven 2022年6月2日 13:59
回复

大佬我在运行的时候遇到了一些问题
Traceback (most recent call last):
File "D:\kb\venv\lib\site-packages\requests\models.py", line 910, in json
return complexjson.loads(self.text, **kwargs)
File "D:\python\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "D:\python\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "D:\python\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "D:\yibanNightAttendance-main\yiban.py", line 100, in
main()
File "D:\yibanNightAttendance-main\yiban.py", line 95, in main
status = yb_list[i].setall()
File "D:\yibanNightAttendance-main\yiban.py", line 78, in setall
self.login()
File "D:\yibanNightAttendance-main\yiban.py", line 27, in login
response = self.request("https://mobile.yiban.cn/api/v3/passport/login", params=params, cookies=self.COOKIES)
File "D:\yibanNightAttendance-main\yiban.py", line 55, in request
return response.json()
File "D:\kb\venv\lib\site-packages\requests\models.py", line 917, in json
raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: [Errno Expecting value]

403 Forbidden 403 Forbidden WAF

: 0

Process finished with exit code 1

 拦个女的折磨 2022年5月13日 13:40
回复

up还能看到这篇的回复吗 我到那个起始参数 添加参数 脚本路径那些卡住了 python路径我知道怎么填底下两个应该填什么 或者可以帮忙远程操作一下吗 可小付一点芒宁 谢谢!

yonniye
1 条回复
yonniye
yonniye 2022年5月14日 10:15
回复

“脚本文件路径”就是你python文件的路径;“起始于”就是你python文件所在文件夹的路径。

Err0r 2021年08月05日 02:23
回复

师傅好!请问下师傅在多人签到的过程中是否有遇到在auth阶段上一个人的session未过期(这种描述可能不准确),导致下一个人login成功,但是auth阶段会返回{'code': 0, 'msg': '', 'data': {'Action': 'redirect', 'Data': 'https://openapi.yiban.cn/oauth/authorize?client_id=95626fa3080300ea&redirect_uri=https://f.yiban.cn/iapp7463&display=html'}}即非正常的{'code': 0, 'msg': '', 'data': {'UniversityName':'xxx',......}}
---
经过验证auth还是得有个重定向即写为:
location = self.session.get("https://f.yiban.cn/iapp7463?access_token=" + self.access_token + "&v_time=" + str(
int(round(time.time() * 100000))),
allow_redirects=False, cookies=self.COOKIES)
# 二次重定向
act = self.session.get("https://f.yiban.cn/iapp/index?act=iapp7463", allow_redirects=False,
cookies=self.COOKIES).headers["Location"] # Response [302] 重定向
verifyRequest = re.findall(r"verify_request=(.*?)&", act)[0]
就是不清楚为什么多人签到不能正常返回,明明accesstoken,session都不同

Err0r
1 条回复
Err0r
Err0r 2021年08月05日 14:12
回复

师傅您好!已经解决了,是由于未授权校本化应用导致的,需要加一下处理!

bhr 2021年07月10日 16:45
回复

大佬,原作者的app为什么返回值是403啊,还有就是用什么可以测接口

Jonah 2021年07月02日 21:32
回复

大佬好,之前用的都很顺利,最近突然报错location,请问是为啥呀
以下是日志
Traceback (most recent call last):
File "/root/yibannew.py", line 116, in
main()
File "/root/yibannew.py", line 94, in main
status = yb_list[i].setall()
File "/root/yibannew.py", line 77, in setall
self.auth()
File "/root/yibannew.py", line 40, in auth
allow_redirects=False).headers["Location"]
File "/usr/local/lib/python3.6/site-packages/requests/structures.py", line 52, in __getitem__
return self._store[key.lower()][1]
KeyError: 'location'

yonniye
1 条回复
yonniye
yonniye 2021年07月02日 23:12
回复

是因为易班的接口加了一个重定向,已经解决了!

holand 2021年07月01日 23:58
回复

看不懂前面改ua是为什么

yonniye
1 条回复
yonniye
yonniye 2021年07月02日 23:57
回复

是为了模拟手机环境点击签到按钮,然后尝试去抓包。实际用起来不需要

Larsy 2021年06月11日 22:33
回复

大佬能挂在腾讯云函数上吗,我试了下没成功

yonniye Larsy yonniye WEABU
4 条回复
yonniye
yonniye 2021年06月16日 08:21
回复

啊......我没试过诶 我看网上还有使用Github actions的,感觉应该大同小异吧...

Larsy
Larsy 2021年06月20日 16:16
回复

大佬我挂在Github actions上了,谢谢了

yonniye
yonniye 2021年06月25日 01:22
回复

WEABU
WEABU 2022年3月8日 23:10
回复

可以教一下怎么部署在github上吗

avatar