基于Python实现校园网自动登录

关键词:树莓派;ubuntu;定时执行;登录校园网

背景

在上一篇文章《利用树莓派搭建校园网种子站》的最后,我们提出一个问题,校园网的登录要实现自动化,本文提供的思路为:使用crontab编写任务定时执行python脚本文件,python脚本文件的功能是检测系统是否连接ipv4网络,没有的话则连接至网络。下面是具体的实践方案。

废弃的方案

刚开始想的方案是使用python的第三方库beautiful soup,网络爬虫神器,但是发现只能爬取网页的内容,并线下对网页内容做提取数据分析等操作,没办法在线对网页进行交互,于是搜索发现另一个神器selenium(浏览器自动化测试框架),有打开关闭浏览器,在指定html元素位置填入数据,模拟点击等功能。并实现了该方案,其中在浏览器的driver上费了些时间,使用firefox和chromium使用不同的driver,下面给出一些有用的参考连接:
https://github.com/mozilla/geckodriver/releases?after=v0.16.1
https://my.oschina.net/u/2396236/blog/1790075/
http://npm.taobao.org/mirrors/chromedriver/
后发现了requests,甚是方便,相见恨晚。抛弃selenium,重头再来。

python 自动化脚本

比较简单,定义两个函数,一个是检测现在系统是否连接至ipv4网络,另一个函数的功能是对指定的校园网网址进行post操作。

1 检测系统是否联网

# 函数1:测试网络是否连通
import  socket
def is_net_ok():
	s=socket.socket()
	s.settimeout(3)
	try:
		status = s.connect_ex(('www.baidu.com',443))
		if status == 0:
			s.close()
			return True
		else:
			return False
	except Exception as e:
		return False

其中:

s.connect(address)
连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex(address)
同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061

2 自动登录校园网

主要用到的函数为

result = requests.post(url, data=dict)

首先扒一扒校园网登录页面,点击登录,F12查看抓包结果,其中POST为主要查看对象。
基于Python实现校园网自动登录_第1张图片
基于Python实现校园网自动登录_第2张图片
可以看到只有一个POST方式的文件auth_action.php,具体查看post了哪些数据。
基于Python实现校园网自动登录_第3张图片
内容有方式、学号、密码还有其他,其中密码不是明文,这个密码应该是加密的,在所有js文件中搜索password,发现有一处函数,验证了是base64加密方式。
基于Python实现校园网自动登录_第4张图片
于是可以开始着手写代码了。

# 函数2:登录指定网络
import datetime,requests,base64
LOGIN_PAGE_URL = "https://gw.buaa.edu.cn:804/beihanglogin.php?ac_id=1&url=http://gw.buaa.edu.cn:804/beihangview.php"
def login_request(name , password):
        if  not is_net_ok():
                print("[03] {} raspberry is offline , request now... ".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
                password =  base64.b64encode(password.encode()).decode()  # 加密
                data1 = {"action": "login",
                        "username": name,
                        "password": password,
                        "ac_id": 1 ,
                        "save_me": 0,
                        "ajax": 1}
                try:
                        result = requests.post(LOGIN_PAGE_URL, data = data1)
                        print(result.text)
                        # print("[01] {} login success  ".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
                except:
                        print("[00] {} requsest error ,raspberry isnot connected to WIFI ".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
        else:
                print("[02] {} raspberry is online  ".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))

运行却登录密码错误。
在这里插入图片描述
密码错误?难道密码加密有误?那么不加密呢?把password = base64.b64encode(password.encode()).decode()注释掉再次运行。
在这里插入图片描述
完美,result结果返回 login_ok ,登录成功,yeah~后面还一堆什么字符串,哎呀不管了,反正可以顺利登录了。
测试其他情况:
断开无线网
在这里插入图片描述
联网之后
在这里插入图片描述
没问题,下面分析如何定时执行该脚本。

ubuntu 系统定时执行任务

使用ubuntu的命令:crontab
关于crontab的介绍和使用说明可以参考:https://www.cnblogs.com/yiyezhouming/p/7799482.html

  1. 打开终端
  2. 输入sudo crontab -e
  3. 使用vim编辑器,输入以下代码,表示每两分钟运行 py文件,并将日志输出至 log 文件。
*/2 * * * * python3  /home/sai/buaa_auto_login/buaa_auto_login.py  >>  /home/sai/buaa_auto_login/buaa_auto_login_log.log 2>&1
  1. 保存并关闭

在终端输入sudo crontab -l 可看到自己编辑好的文件。
这时去 /home/sai/buaa_auto_login/ 下看到 log文件,如下则说明定时执行python脚本任务设置成功。系统关机重启,crontab任务还会继续执行。(注:执行结果和函数2输出不一致是因为上述函数2为最后写的版本,这里测试时函数2还并未完全写完,因为我要亲自到学校里扒登录网页…)
基于Python实现校园网自动登录_第5张图片

小结

毕业了竟然厚颜无耻的回学校蹭网,还把校园网登录页面给扒了一遍,罪过罪过。本文主要分析了python自动化脚本登录方案和ubuntu定时执行任务实现完成校园网的自动登录功能,以上内容结合上篇文章《利用树莓派搭建校园网种子站》实现校园网种子站的全部功能。当然有诸多改进的地方,还望指点。同时与此类似可以实现其他形式的自动化方案,比如自动登录邮箱,查收发邮件等等。
二赛君原创文章,转载请注明出处。

参考

http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
https://blog.csdn.net/fengmm521/article/details/79469113
https://blog.csdn.net/u010651394/article/details/82975266

更新:代码Github地址:https://github.com/ersaijun/Campus_Network_AutoLogin

你可能感兴趣的:(树莓派,python,ubuntu)