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

首页 / 科技区 / 正文

学校要求易班晚点签到,但是每天手动点一遍(尤其是遇见易班糟糕的定位)显著降低了我生活的幸福感。在参考了别的大佬们的解决方案之后,我完整走了一遍易班自动晚点签到的流程,造福了自己也造福了宿舍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年06月03日 21:17
    回复

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

    头像
    Seven
    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):
    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

      头像
      威威
      2024年5月6日 20:05
      回复

      错误信息表明您在尝试使用requests库解析JSON响应时遇到了问题。具体来说,服务器返回了一个403 Forbidden错误,这通常意味着服务器拒绝了您的请求。此外,错误信息中还提到了WAF(Web Application Firewall,Web应用防火墙),这表明您的请求可能触发了某种安全机制。

    头像
     拦个女的折磨
    2022年05月13日 13:40
    回复

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

      头像
      yonniye
      2022年05月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
      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
      2021年07月02日 23:12
      回复

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

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

    看不懂前面改ua是为什么

      头像
      yonniye
      2021年07月02日 23:57
      回复

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

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

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

      头像
      yonniye
      2021年06月16日 08:21
      回复

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

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

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

          头像
          WEABU
          2022年03月08日 23:10
          回复

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

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

文章目录