环境配置
关于在Openwrt上安装Python可以参考这里
https://wiki.openwrt.org/doc/software/python
使用本程序请先安装Python
代码内容
在~目录下写buaa.py,内容如下
import urllib
import urllib2
import hashlib
import os
#Here input your username and password
username = 'xxx'
password = 'xxx'
def check_network():
response = urllib2.urlopen('http://www.offer4u.cn/ping', timeout=3)
response.close()
return response.getcode() == 204
def login(username,password):
md5 = hashlib.md5()
md5.update(password)
password = md5.hexdigest()[8:-8];
url = 'http://gw.buaa.edu.cn/cgi-bin/do_login'
values = {'username':username,'password':password,'drop':'0','type':'1','n':'100'}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req, timeout=3)
page_result= response.read()
response.close()
if page_result.isdigit() == True:
return "\033[1;32m%s\033[0m" % "Login successful"
elif page_result == "password_error":
return "\033[1;31m%s\033[0m" % "Wrong password"
else:
return "\033[1;31m%s\033[0m" % "Unknown error" + page_result
def light(on):
if on == 1:
os.system('echo 1 > /sys/class/leds/y1\:blue\:internet/brightness')
else:
os.system('echo 0 > /sys/class/leds/y1\:blue\:internet/brightness')
#main
try:
if check_network() == False:
light(0)
result = login(username,password)
if "successful" in result:
light(1)
else:
light(0)
print result
else:
light(1)
print "\033[1;34m%s\033[0m" % "Network connection is working"
except:
light(0)
print "\033[1;31m%s\033[0m" % "Processing error"
代码解析
- 该程序运行时,首先检测网络是否连通(check_network函数),如果网络不连通则进行(login函数),然后根据登录结果输出提示或错误,并控制路由器上的一个灯来表示网络是否连通
- 其中http://www.offer4u.cn/ping,这个网址将在网络正常情况下返回204HTTPCODE,这个工作方式和google的类似,本来可以用google.cn的但是由于北航内部有IPV6所以会导致该网址一直处于连通状态,所以用了国内的版本。
- 下面这部分是一个shell脚本,用来控制我用的路由器,联想Y1上面的Internet灯的开关,网络连通时让该灯亮起(echo 1),不连通则关闭(echo 0)该灯
echo 0 > /sys/class/leds/y1\:blue\:internet/brightness
如果你是其他的路由器,请打开/sys/class/leds/ 目录,找到你想控制的灯,修改y1\:blue\:internet 即可(这里的反斜杠是转义符)

这款路由器推荐一下非常不错,支持U盘并且内存和运存等配置足够支持运行和安装很多软件,并且价格便宜,我买的时候才70多 - 我们可以在编写完后执行python -m py_compile buaa.py ,把py编译成pyc提升性能
持续运行
- 在使用的过程中可能会断网,甚至比如北航会在凌晨4点准时断网,所以我们需要启用crontab来持续运行该脚本
crontab -e
然后我们输入
*/1 * * * * python ~/buaa.pyc > /dev/null */1 * * * * sleep 20; python ~/buaa.pyc > /dev/null */1 * * * * sleep 40; python ~/buaa.pyc > /dev/null
这样就会每隔20秒运行我们的脚本,如果网络断开就会自动连通,其中> /dev/null 是用来关闭输出
其中Openwrt不会默认启动crontab,我们还需要执行一下命令/etc/init.d/cron start /etc/init.d/cron enable
- 我们可以在连接之后手动登录北航http://gw.buaa.edu.cn/index.php,来查看是否登录成功和用户及流量状况
北航提供 buaa-mobile,不研究下么
现在北航的WIFI登录更新了,这个代码好像也是不能用了。
可以用Chrome看一下登录web网关的时候post的数据是什么,改数据就好了
检测网络状态,那一块,如果timeout会有Exception,代码无法正常执行,我的urllib3 的版本是1.19,urllib2不知道什么版本。
所以可以用下面的代码来检查:
def check_network():
try:
urllib2.urlopen(‘http://www.offer4u.cn/ping’, timeout=3)
return True
except:
return False