首页 科技区

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




文章评论

    Err0r 访客ChromeMac
    2021-08-5 2: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 访客ChromeMac
      2021-08-5 14:12   回复

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

    bhr 访客ChromeWindows
    2021-07-10 16:45   回复

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

    Jonah 访客ChromeWindows
    2021-07-2 21:32   回复

    大佬好,之前用的都很顺利,最近突然报错location,请问是为啥呀
    以下是日志
    Traceback (most recent call last):
    File "/root/yibannew.py", line 116, in <module>

    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 站长ChromeWindows
      2021-07-2 23:12   回复

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

    holand 访客ChromeAndroid
    2021-07-1 23:58   回复

    看不懂前面改ua是为什么

      yonniye 站长ChromeWindows
      2021-07-2 23:57   回复

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

    Larsy 访客FireFoxWindows
    2021-06-11 22:33   回复

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

      yonniye 站长ChromeWindows
      2021-06-16 8:21   回复

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

        Larsy 访客FireFoxWindows
        2021-06-20 16:16   回复

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

          yonniye 站长ChromeWindows
          2021-06-25 1:22   回复

目录