Linux+Python实现录取通知书发放云端监控

背景

七八月份,正是各个高校录取发放的时间段,正好我这个学校的录取通知书发的比较晚,心里也蛮迫切想要录取通知书的,一无聊就刷新一下学校的招生信息网查看录取通知书的快递单号,突然想起我是学计算机的,那我就用python完成录取通知书的的监控。

任务

​ 使用编程语言配合Linux服务器对招生网站的数据进行监控,如果更新了快递单号,则将录取单号推送微信信息到我的微信上,并关闭监控。具体看下图:

image.png

获得数据

image.png

一共有四个表单需要输入数据,然后登录查询,可头疼的是他有一个让无数个爬虫仔都恶心的东西——验证码,其实到这一步我是有点想放弃的了,但是既然咱有这个想法,那我们就去行动,那我就抱着试试的心态对请求数据和js进行分析。

image.png

通过开发者检查工具我们可以看到对应的数据执行函数check_form_submit(),有一点点英语知识的我看得出来这个函数是检查表单的函数,哈哈有时候开发者的代码语义化也对我们有些许帮助。我们通过函数名找到对应代码进行分析。(题外话:我寻思你都用jq了 为啥还用原生写表单检查呢,不累吗)

image.png

原来是将input数据放到一个数组里,然后下面进行遍历

image.png

核心代码分析

input_node = document.querySelector(inputs[i]);
			if(!input_node){
				continue;
			}

代码整体的意思就是,你不把东西写完,我不给你发送数据,唉 就是玩。我们将代码改一下,跳过输入检查。上代码

 check_form_submit=()=> true;

这个使用箭头函数直接让他返回值为true ,就可以跳过表单检查了。

输出函数返回值也是ture,成功绕过表单检查。

image.png

成功绕过验证码,下一步使用编程语言构建数据请求包。

这里我们用python进行数据构造,看能不能成功请求到数据

注:构造payload时需要把请求key的imagecode改成none。这里打码部分涉及一点隐私,就先打码了

image.png

python构建请求数据包完成,再不输入验证码的情况可以成功获取到数据。但是数据还是html形式,如果要对其进行操作的话 需要进行解析。

这里我用到python的BeautifulSoup进行数据解析,解析出来的数据可以得到数组形式,很方便。

from bs4 import BeautifulSoup

具体操作 请移步到官方文档,Beautiful Soup 4.4.0 文档

image.png

由于本文章是录取通知书发放后写的,所以得到了单号,没有发录取通知书的内容是‘暂无数据,请耐心等待“

这里得到录取通知书的ems地址 位置也就是18,但是Python中数组是从0开始的 这里就是17,上代码

  res=response.text
  html=BeautifulSoup(res,'html.parser').select('td')[17]

  return html.string
 

这里我们直接将录取单号return出来,方便操作

image.png

get_ems()算正式完成了

image-20220806192530751.png

成功得到单号,解析完成。

判断是否更新录取通知书单号

这里使用if语句, 并且做个错误异常处理,完成数据异常或者请求异常的情况。也可以以免程序出现错误等情况导致监听失败

# 开始执行之前先微信通知书。
send_tom_wx('开始运行','[汤姆猫个人录取通知书动态监控]已启动')
while True:
    try:
      emsnumber=get_ems()
    except:
      send_tom_wx('数据异常','数据异常')
      print('数据异常 二十分钟后重试')
      time.sleep(1200)
      continue
      
    if emsnumber !='暂无数据,请耐心等待':
        print('录取通知书已发出')
        
        # 录取数据发生变化 开始跳出循环 进行单号发送
        send_tom_wx('[汤姆猫个人录取通知书动态监控]你的录取通知书已发出 单号为:'+str(emsnumber),'[汤姆猫个人录取通知书动态监控]你的录取通知书已发出')
        
        break
    else:
        print('未发出,请耐心等待')

    # 二十分钟再发送一次请求
    time.sleep(1200)

send_tom_wx是我自己封装的函数,使用之前请自行配置相关代码,我用的是wx_push消息推送平台,请自行百度其文档

当程序将录取通知书快递单号通过微信推送给我后,就break退出监控,咱不能一直访问吧。哈哈(就到此为止吧,再请求就不礼貌了)。

每二十分钟就获取数据判断一次,这样既可以避免服务器资源的浪费也可以避免学校服务器不堪重负,对校方招生工作的影响。(注:这种情况单线程就ok 如果是多线程+不延迟那容易吃牢饭)

使用linux服务器监听数据变化

我电脑不可能开一整天吧,这时候需要一台云服务器进行监控,服务器是国外的一台4h+4g 50m 的centos机子,足已完成相关需求,如果你问我为什么要专门花钱去一台服务器,不心疼吗。我的答案是 这服务器我蹭的。

linux跟windows服务器不同,linux如果命令行窗口关闭或者服务器断开连接都会导致程序关闭,这里我们使用SCREEN把程序挂到后台。

在文件中新建属于自己的文件夹,以免程序混乱或者自个找不到

mkdir your file_name

image.png

这里原来我已经新建过tom文件夹了,直接将我们的代码文件用sftp的方式传输进去

image.png

如果嫌麻烦可以通过vim的方式将代码粘贴进去(代码少时)

touch your_code_fime_name.py
sudo vi your_code_fime_name.py
:!Wq

上传好之后,我们就可以把挂载到后台了

screen -S 你的进程名
screen

进入screen后就可以在这里面执行程序了

image.png

执行我们的Python代码

python main.py

image.png

这是后台执行后输出代码的界面,最后也是执行完监控任务了,将录取单号输出到界面,并且将单号发给了我

image.png

退出来后发现程序已经成功挂载到了后台

命令行总结

screen -S
scrren -ls
screen -r
screen
kill 9 进程号

云端监控的也成功的完成了。

成果演示

以上是完成监控任务的截图

IMG_20220808_182654.jpg

当开始执行程序后推送的信息

send_tom_wx('开始运行','[汤姆猫个人录取通知书动态监控]已启动')

你说巧不巧,正好遇到了莫名其妙的错误,我们做得错误异常抛出处理也产生了作用

IMG_20220808_182716.jpg

在出现异常后也是及时的通知我了,在出现异常后也自动休眠二十分钟,休眠完后继续监听

到18.30的时候,校方导入的快递单号信息到招生平台,我也第一时间的得到了通知

image.png

image.png

任务完成!!! 去拿通知书啦

image.png

image.png
我的个人博客博客:tomsir.top
原文地址:https://www.tomsir.top/2022/08/03/Tompost1/

注!因特殊原因(避免恶意爬取校方信息或者爆破等),绕过验证码的后端部分没有详细说明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值