Python模拟登录校园网

. 2 min read

本人所在的学校提供了免费的校园网,联通电信移动教育网多线。不爽的是需要手动在Web登录。不过感谢学校没有使用乱七八糟的客户端。计费系统是Dr.COM,也有人称城市热点。

为了优雅的使用校园网,让电脑/路由器开机自动连接,~~顺便还能跑代码搞些有剩余流量的账号。~~正好在学Python,Google看了些别人的实现方法,模仿着自己写了个。为路由器交叉编译了个Python 2.7,放路由器上跑了一个月左右,没有发现什么问题。

主要实现了登录以及账号有效性检测,包括剩余流量检测,随机选取账号进行登录。

以下是代码,由于原理太过简单,~~自以为自己的代码可读性还可以,~~就不做注释了。

其中URL是校园网Web登录页的地址,“account.csv”是逗号分隔符文件,格式为“12位学号,六位密码”,一行一个。

import urllib
import urllib2
import random

URL = "http://Login URL/"
FILE = "account.csv"


def post(url, data=None):
    if data:
        data = urllib.urlencode(data)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    return response


def check(response):
    lineBeChecked = response.readlines()[5]
    if lineBeChecked[1] == 's':
        return True
    elif lineBeChecked[1] == 'S':
        return False
    else:
        print("Unexpected response!")
        return False


def login(username, upass):
    data = {}
    data["DDDDD"] = username
    data["upass"] = upass
    data["0MKKey"] = ''
    return post(URL, data)


def logout():
    post(URL+"F.htm")


def flux(response):
    lineBeChecked = response.readlines()[6]
    indexStart = lineBeChecked.find("flow") + 6
    indexEnd = lineBeChecked[indexStart:].find(" ") + indexStart
    return int(lineBeChecked[indexStart:indexEnd])


def main():
    fp = open(FILE, 'r')
    reader = fp.readlines()
    while True:
        line = random.choice(reader)
        username = line[0:12]
        password = line[13:19]
        try:
            if check(login(username, password)):
                print("Connected!")
                usedFlux = flux(post(URL))
                print "Used Flux:", usedFlux
                if usedFlux < 4000000:
                    break
            else:
                print("Failed! Check username / password!")
        except:
            print("Network Error!")
            continue
    fp.close()

if __name__ == '__main__':
    main()