关键词:树莓派;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,重头再来。
比较简单,定义两个函数,一个是检测现在系统是否连接至ipv4网络,另一个函数的功能是对指定的校园网网址进行post操作。
# 函数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
主要用到的函数为
result = requests.post(url, data=dict)
首先扒一扒校园网登录页面,点击登录,F12查看抓包结果,其中POST为主要查看对象。
可以看到只有一个POST方式的文件auth_action.php,具体查看post了哪些数据。
内容有方式、学号、密码还有其他,其中密码不是明文,这个密码应该是加密的,在所有js文件中搜索password,发现有一处函数,验证了是base64加密方式。
于是可以开始着手写代码了。
# 函数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的命令:crontab
关于crontab的介绍和使用说明可以参考:https://www.cnblogs.com/yiyezhouming/p/7799482.html
sudo crontab -e
*/2 * * * * python3 /home/sai/buaa_auto_login/buaa_auto_login.py >> /home/sai/buaa_auto_login/buaa_auto_login_log.log 2>&1
在终端输入sudo crontab -l
可看到自己编辑好的文件。
这时去 /home/sai/buaa_auto_login/ 下看到 log文件,如下则说明定时执行python脚本任务设置成功。系统关机重启,crontab任务还会继续执行。(注:执行结果和函数2输出不一致是因为上述函数2为最后写的版本,这里测试时函数2还并未完全写完,因为我要亲自到学校里扒登录网页…)
毕业了竟然厚颜无耻的回学校蹭网,还把校园网登录页面给扒了一遍,罪过罪过。本文主要分析了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