实验室服务器有时候需要上网下载东西(东大的服务器校园网不登录也可以下载一些pip源和默认源的资源),但是我们需要登录网关才能访问外网,当然也有使用w3m
等工具上网的办法,但是实测并不美好,所以想自己写个小东西可以在命令行登录网关。所以,开工。
使用python实现表单的提交,包括填写用户名
、密码
以及submit
操作
就在服务器上进行测试,自带Python2.7
以及urllib
urllib2
需要先学习一点urllib
的使用知识
测试系统为Ubuntu 16.04
需要你有一点Python基础和Linux基础
按照urllib
的使用方法,先用字典变量存储我们要登录的账户和密码,也就是我们要提交的表单的内容,具体表单内容可以在ipgw.neu.edu.cn的页面源代码找到。
把request的页面转化成字符串,然后找到在登录成功后独有的一部分字符串,比如代码的第27行,就是进行这个操作。
开头的部分。所以我们在username
、password
这两项之外还要把这些额外的内容添加上。
网络已连接
来进行str.find()
但是服务器报错了,它无法识别中文,考虑到不同系统环境,这里我使用的是包含它的div
标记中的样式来检测,这个在登录不成功的情况下是没有的。登录后的页面同样有一个表单,而且submit
是一个注销按钮,所以简单修改我们的登录程序,就可以实现注销。
username
和ip地址的,但是不光我一个人会登录网关,所以用户名是可变的,而且要和之前的登录联系起来。所以这里让登录程序创建一个文件temp_username.dat
来临时存储当前登录的校园网账号,然后注销程序来读取这个文件中的username
。import urllib2
import urllib
class Loginer():
def __init__(self, username, password):
self.loginUrl = 'http://202.118.1.87/srun_portal_pc.php?ac_id=1&'
self.username = username
self.password = password
self.openner = urllib2.build_opener()
def login(self):
postdata = {
'username': self.username,
'password': self.password,
'action': 'login',
'ac_id': '1',
'user_ip':'',
'nas_ip':'',
'user_mac':'',
'url':''
}
postdata = urllib.urlencode(postdata)
myRequest = urllib2.Request(url=self.loginUrl, data=postdata)
result = self.openner.open(myRequest).read()
resStr=str(result)
ind=resStr.find('font-weight:bold;color:orange')
if(ind!=-1):
print 'connected successfully'
else:
print 'connected faild!! Maybe your username or password is wrong!'
def main():
username=raw_input('Enter your username:')
password=raw_input('Enter your password:')
file=open('temp_username.dat','w')
file.write(username)
file.close()
l = Loginer(username,password)
l.login()
if __name__ == '__main__':
main()
print 'done'
import urllib2
import urllib
class Loginer():
def __init__(self, username, password):
self.loginUrl = 'http://202.118.1.87/srun_portal_pc.php?ac_id=1&'
self.username = username
self.password = password
self.openner = urllib2.build_opener()
def login(self):
postdata = {
'username': self.username,
'info': '',
'action': 'auto_logout',
'usr_ip': '202.199.6.187'
}
postdata = urllib.urlencode(postdata)
myRequest = urllib2.Request(url=self.loginUrl, data=postdata)
if(str(self.openner.open(myRequest).read()).find('font-weight:bold;color:orange')!=-1):
print 'logout successfully'
def main():
file=open('temp_username.dat','r')
username=file.readline()
print username
l = Loginer(username,'')
l.login()
if __name__ == '__main__':
main()
print 'done'
这里只介绍下这里的简单应用,详细请参见其他文档。
使用pyinstaller
这个工具,在如此优秀的校园网环境下,在终端里执行下面代码
pip install pyinstaller
这里可能有的同学没有pip程序,可以输入su
进入root
用户,然后输入下面
apt-get install python-pip
sudo apt-get install python-pip #如果你的用户本来就是root权限用户,用这句
安装好之后,我们需要就要把我们的程序打包成可执行文件了。在我们的源代码目录下执行下面语句
pyinstaller -F ConnectNeu.py
pyinstaller -F logout.py
程序就会在当前目录下创建两个文件夹build
dist
和两个和源代码同名的文件。我们需要的可执行文件就在文件夹dist
中,那两个文件直接就可以执行。
注意 Linux中执行当前目录下的文件要使用./example
的形式才可以,因为不加前面的两个符号,它默认是从Path环境变量中的地址来找程序的。就是这样。