学校要求易班晚点签到,但是每天手动点一遍(尤其是遇见易班糟糕的定位)显著降低了我生活的幸福感。在参考了别的大佬们的解决方案之后,我完整走了一遍易班自动晚点签到的流程,造福了自己也造福了宿舍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观察一番,就可以发现所用的地图使用了高德的接口:
所以,我们需要去高德开发者平台找到宿舍的经纬度。网页地址为:https://lbs.amap.com/tools/picker。
首先在手机上找一下自己宿舍的全名叫什么。我这随便找了个宿舍做示例,可以看到它的全名是“南京师范大学仙林校区北苑36栋学生公寓”。
接下来在上面的网址中输入宿舍全名,如下图所示,很顺利地就获取到了宿舍的坐标:
找到签到请求
在Network中,按ctrl+R,找到发送请求的URL。
我这里已经签到过了,没有点击签到的按钮,实际上还有一个最主要的签到请求是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]
参考资料
https://hub.fastgit.org/rookiesmile/yibanAutoSgin
https://blog.csdn.net/TengWan_Alunl/article/details/105065966
2022年06月03日 21:17
自己抓包无法登录是怎么回事?已经安装FiddlerROOT.cer了
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
2022年06月02日 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):
403 Forbidden 403 Forbidden WAFFile "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]
: 0
Process finished with exit code 1
2024年5月6日 20:05
错误信息表明您在尝试使用requests库解析JSON响应时遇到了问题。具体来说,服务器返回了一个403 Forbidden错误,这通常意味着服务器拒绝了您的请求。此外,错误信息中还提到了WAF(Web Application Firewall,Web应用防火墙),这表明您的请求可能触发了某种安全机制。
2022年05月13日 13:40
up还能看到这篇的回复吗 我到那个起始参数 添加参数 脚本路径那些卡住了 python路径我知道怎么填底下两个应该填什么 或者可以帮忙远程操作一下吗 可小付一点芒宁 谢谢!
2022年05月14日 10:15
“脚本文件路径”就是你python文件的路径;“起始于”就是你python文件所在文件夹的路径。
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都不同
2021年08月05日 14:12
师傅您好!已经解决了,是由于未授权校本化应用导致的,需要加一下处理!
2021年07月10日 16:45
大佬,原作者的app为什么返回值是403啊,还有就是用什么可以测接口
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'
2021年07月02日 23:12
是因为易班的接口加了一个重定向,已经解决了!
2021年07月01日 23:58
看不懂前面改ua是为什么
2021年07月02日 23:57
是为了模拟手机环境点击签到按钮,然后尝试去抓包。实际用起来不需要
2021年06月11日 22:33
大佬能挂在腾讯云函数上吗,我试了下没成功
2021年06月16日 08:21
啊......我没试过诶 我看网上还有使用Github actions的,感觉应该大同小异吧...
2021年06月20日 16:16
大佬我挂在Github actions上了,谢谢了
2022年03月08日 23:10
可以教一下怎么部署在github上吗
2021年06月25日 01:22