玩转 Python 与树莓派,教你毕业了如何回学校蹭网?
作者 | 二赛君
责编 | 郭芮
利用树莓派做种子站的技术贴不少,帖子发布时间最早是2013年,也就是树莓派刚诞生不久,看来创客技术宅们折腾的心思十分强大。当然经过这么多年,他们的技术文章有的不太适合了,比如树莓派的板子更新迭代,目前是3B,比如可烧写的系统更新,bt做种软件更新等等原因吧......于是有了此文,可以更加方便地快速搭建种子站。
博主的树莓派购于2016年,之后怀着折腾的心安装了raspbian-jessie版本(目前官网最新版本是raspbian-stretch版本)、ubuntu mate、 lakka、OSMC、Windows IoT(还写过一篇安装此系统的博文https://www.ersaijun.cn/blog/2016/07/05/raspberry-pi-3anzhuangwin10-iot-jiaocheng/)等系统,之后就一直闲置着吃灰。后被刘大腿借走做毕业设计用,最近刚归还我。看着吃灰的派,心里默默的念叨,哥要让你物尽其用,于是开始琢磨做什么用呢?
毕业后由于上不了bt,甚是怀念在学校里通过校园网各种bt随便上,下载速度感动哭,最新电影资源文献各种下的场景,想想就开心。现在有了树莓派这款神器,博主打算做一个种子站,思路如下:树莓派安装ubuntu mate或官网系统raspbian-stretch系统,安装远程控制软件,安装bt客户端,将树莓派放置校园某处,并保持一直连网状态;在校园外的某地,博主通过远程连接登录至树莓派,尽情下载bt种子和利用校园网资源,一段时间后,去学校拜见我的派,并取下“果实”(连接在树莓派上的移动硬盘,存储数据用)——如此,岂不美哉?
准备硬件
需要准备的材料有:
推荐用树莓派3B(2代没有无线功能);
16G存储卡;
显示器、鼠标、键盘;
足够容量的移动硬盘(博主用的是2T的希捷硬盘)。
安装系统和远程控制软件
推荐安装ubuntu mate,比树莓派官方的系统功能多,而且流畅,且自带Transmission,后文会介绍。系统安装不做介绍,可具体参考 https://blog.csdn.net/henryheheng/article/details/78907406。
安装远程控制软件有两个方案。
方案一:刚开始是下载了VNC server,并做了一些设置,在树莓派中开启服务,自己笔记本里安装了VNC viewer,可以顺利的连接过去。关于VNC server的安装设置参考https://blog.csdn.net/u012313335/article/details/73912556。但是这种远程连接有个问题,就是必须是同在一个局域网内,那我应用的场景是树莓派放在校园里,我在校园外,肯定不是同一个网段,因此这种方案是不行的(或者说我没有找到如何设置VNC使其可以外网访问内网的的方法,这里还请大神指教)。
方案二:使用 Teamviewer ,TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制的应用程序,桌面共享和文件传输的简单且快速的解决方案。下载地址:http://www.ersaijun.cn/blog/toolbox.html/,由于是树莓派,下载对应的安装包armf版(见下图)。同时,要在自己的笔记本或者台式机上安装相应版本的Teamviewer软件。
远程连接测试
被控制端,树莓派端:
开启后会有设备端的ID,牢记。
控制端,博主自己笔记本端:
输入树莓派的ID,即可进入。这种方案,免去了在终端输入各种代码的麻烦。
远程连接测试成功。
bt种子软件
本来打算使用uTorrent,但发现uTorrent没有armf版本的,查资料有通过在ubuntu mate上安装虚拟机,安装uTorrent下载,但是有些麻烦。
ubuntu mate自带bt软件Transmission,这就非常贴心方便了。
连接并测试
将树莓派连接至校园网,打开Transmission,打开bt论坛,以北邮人为测试对象。下载一个bt,并用Transmission打开,观测是否有下载速度。测试表明,可以通过Transmission顺利下载bt种子文件。
图中由于做种数量少,所以下载速度较慢。
以上这些步骤就可以顺利完成通过校外网进入树莓派系统,进而进入校内网,访问并下载资源。并且是一种可视化的操作形式,大大降低了开发搭建种子站的难度,至此完成。
特别感谢师兄杨博士提供实验测试场所,感谢李学妹提供转接线。不过你们是不是发现了一个问题?
校园网可以自动连接,但是一般的校园网连接之后要在登录页面输入登录自己的账号密码才可以访问ipv4网。树莓派关机重启可以自动连接校园网,可以自动打开Teamviewer,可以自动打开Transmission,但是无法访问ipv4网络,需要手动打开登录页面,登录自己的校园账号密码。
于是,我得想一种自动化登录的功能:即每段时间检测是否连接ipv4网络,没有的话,打开登录页面进行登录。下面就来分析下如何基于Python实现校园网自动登录。
校园网的登录要实现自动化,本文提供的思路为:使用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为主要查看对象。
可以看到只有一个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 系统定时执行任务
使用ubuntu的命令:crontab。关于crontab的介绍和使用说明可以参考:https://www.cnblogs.com/yiyezhouming/p/7799482.html。
打开终端;
输入sudo crontab -e;
使用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
保存并关闭。
在终端输入sudo crontab -l 可看到自己编辑好的文件。
这时去 /home/sai/buaa_auto_login/ 下看到 log文件,如下则说明定时执行Python脚本任务设置成功。系统关机重启,crontab任务还会继续执行。(注:执行结果和函数2输出不一致是因为上述函数2为最后写的版本,这里测试时函数2还并未完全写完,因为我要亲自到学校里扒登录网页…...)
写在最后
毕业了竟然厚颜无耻的回学校蹭网,还把校园网登录页面给扒了一遍,罪过罪过。本文主要介绍如何利用树莓派搭建校园网种子站,实现校园网种子站的全部功能。此外,还分析了Python自动化脚本登录方案和ubuntu定时执行任务实现完成校园网的自动登录功能,同时与此类似可以实现其他形式的自动化方案,比如自动登录邮箱、查收发邮件等等。
作者: 二赛君,初入职场小白,业余时间喜欢折腾,机械专业出身的代码程序猿。个人博客:www.ersaijun.cn。
声明:本文为作者投稿,版权归其个人所有。本文首发于作者CSDN博客https://blog.csdn.net/kaspar1992/article/details/84172543。
热 文 推 荐
☞ 拼多多:“优惠券Bug属网络诈骗”;抖音多闪上架 App Store;任正非不知谁是接班人 | 极客头条
☞ JavaScript 能写一切?Python 不服:盘它!
☞ 惊慌 Android!使用 3D 打印的头像可破解多款手机
print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"