[我的树莓派服务器]树莓派自动通过东南大学Web认证并报告IP地址!

1背景

这学期从开学开始就在忙托福,考完了之后仍旧每日碌碌而不知所为,跋山涉水带回来的树莓派也吃灰了好久。

前段时间做项目突然要用到SQL,听说在Win下的卸载非常麻烦,于是脑洞大开。一开始只有在树莓派上装MySQL的想法,在经历了数日的YY,最终决定顶着数门考试的压力重新把树莓派挂到外网上作服务器。

其实之前也有过成功的尝试,但上次是经过宽带路由器挂上的,只需要简单进行端口转发即可。这次由于没有续订宽带,所以只能用校园网。一个很大的问题——

要让没有常规I/O设备的树莓派(就是这么穷酸)自动通过校园网Web认证,并报告IP地址进行远端访问。

很明显,本次作业的问题可以一分为二:自动Web认证和IP地址报告。

下面将尽可能详细地介绍作业过程,但是由于内容的特殊性,可能帮不到读者了。

2设备

树莓派3B+

SenseHat上的摇杆和LED点阵

一台Win10电脑

东南大学无线校园网

3自动通过校园网Web认证

3.1安装火狐浏览器

3.1.1为什么不用Chromium?

在Raspbian系统下用Selenium调起原生的Chromium浏览器异常困难。

首先是Root权限下必须以

chromium-browser --no-sandbox

禁用沙盒模式的参数运行

其次是调用时无限报错

selenium.common.exceptions.WebDriverException: Message: Service /usr/lib/chromium-browser/chromedriver unexpectedly exited. Status code was: 127

可能是chrome和chromium之间微妙的区别导致的错误吧……最后也没找到适合树莓派的Chrome,死忠粉只好转投火狐了……

3.1.2火狐安装过程

感谢丹侠啊GODOG的这篇文章

【Selenium】Raspbian+Selenium+Firefox

它囊括了从浏览器安装方式到driver的下载链接、版本挑选的所有内容,可谓详尽。诸位尽可参考。

3.2自动通过Web认证的Python实现

这一步重新利用了我这篇文章中介绍的代码

Python实现WLAN断开重连和SEU校园网注销再登录

再次感谢zcy0xy学长的原教程

拒绝掉线!利用selenium实现校园网自动重连

精简化的代码如下:

def login():
    browser = webdriver.Firefox()
    browser.get('http://w.seu.edu.cn/')

    username_input = browser.find_element_by_id("username")
    password_input = browser.find_element_by_id("password")
    login_button = browser.find_element_by_id("login")

    username_input.send_keys('一卡通号')
    password_input.send_keys('统一认证密码')
    login_button.click()
    browser.close()

到这一步,树莓派就能成功通过校园网认证了。那么如何在互联网的茫茫人海里找到它呢?

4SenseHat简易I/O实现IP地址报告

SenseHat是个好东西。不仅输入、输出、传感器一应俱全,而且插在树莓派上非常美观。美中不足就是占用了所有的GPIO口……导致挂载墨水屏的时候必须把它拆下来。另外Raspbian系统自带茫茫多的示例代码,可以发现sense_hat这个模块已经写好了摇杆响应和LED点阵输出字符串的函数,不可谓不良心。

通过操作SenseHat上的摇杆,可以令树莓派执行想要的功能:比如用Hat上的LED点阵输出IP地址,或者是执行一次自动登录函数。这就是整个简易I/O的逻辑。

4.1获取本机字符串形式的IP地址

Linux下可以简单地通过在Terminal中输入命令

iwconfig

来查看IP地址,而这样得到的并非我们想要的简练的IP地址。怎么办呢?借助这篇文章中提供的Shell命令就可以了

shell中获取本机ip地址

需要注意的是,在Python中需要转义字符来正确输入引号。

4.2简易I/O控制的Python实现

直接上代码!

from sense_hat import *
import os
from selenium import webdriver

hat=SenseHat()

def login():
    browser = webdriver.Firefox()
    browser.get('http://w.seu.edu.cn/')

    username_input = browser.find_element_by_id("username")
    password_input = browser.find_element_by_id("password")
    login_button = browser.find_element_by_id("login")

    username_input.send_keys('一卡通号')
    password_input.send_keys('统一认证密码')
    login_button.click()
    browser.close()


def show_ip():
    ip=os.popen('/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk \'{print $2}\'|tr -d \"addr:\"').read()
    hat.show_message(ip, 0.05, (100,100,100))
    
while True:
    event = hat.stick.wait_for_event()
    if event.action == ACTION_PRESSED:
        if event.direction == DIRECTION_MIDDLE:
            show_ip()
        if event.direction == DIRECTION_UP:
            login()
        if event.direction == DIRECTION_DOWN:
            login()
        if event.direction == DIRECTION_LEFT:
            login()
        if event.direction == DIRECTION_RIGHT:
            login()

摇杆部分很大程度时抄例程的…… 

 

这样,树莓派终于不用在无线热点里蜗居,而可以直接拥抱互联网的大海了!

 

感谢阅读!

 

181129于江宁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章