缘起
在校内上网,出于安全考虑,需要对上网设备进行身份认证。通过学校的IDC账号密码进行身份认证,通过后才能访问校外资源。这对于一些Linux服务器(尤其未安装图形界面的服务器)不是太友好,于是想到用python来个自动登录。
python模拟表单提交
引入requests模块,该模块能提供访问get、post方法来获取指定url的内容。模拟登录,无非就是去模拟浏览器行为,访问登录页面,将登录页中需要传递给后台的参数传递过去。一般通过下面几个步骤即可实现。
- 浏览器中分析登录行为
在浏览器中访问你需要的登录页面,通过浏览器查看元素,找到需要传递的参数。通常会有用户名、密码输入框,取这些输入框的name属性值作为参数构造给python的get或post函数。 - 通过编程语言携带参数请求指定方法
通过编程语言提供的方法,向指定url提交构造好的参数。这个过程需要一些web开发的经验,有时候不单单是看到的登录页面中的用户名、密码、验证码等需要输入的信息,有些登录界面还会使用html中的hidden隐藏域保存一些信息,都会作为参数传递至后端。
下面直接贴代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32import requests
import socket
#构造地址
url = 'https://xxxxxxx' #你需要访问的登录页面
#获取本机IP地址
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
#从输入获取用户名、密码
#如果不想每次都输入用户名密码,可以将账户密码赋值给这俩变量
username = input("please enter your idc account: ")
userpwd = input("please enter your idc password: ")
#构造form表单中的参数
params = {
'action': 'login',
'username': username,
'password': userpwd,
'ac_id': '1',
'user_mac':'',
'user_ip': ip,
'nas_ip': '',
'save_me':'',
'ajax': 1
}
html = requests.post(url, data = params)
html.encoding='utf-8'
print(html.text)
linux下的改造
以上代码在windows平台下测试成功,能够帮助我不通过打开浏览器输入用户名密码进行认证。但移植到linux上时,能正常执行,但仍然未认证成功,原因在于Linux下python获取IP地址的方式不同。
通过下面的代码在Linux下获取到的IP地址为127.0.0.1,而不是实际的IP地址。
1 | hostname = socket.gethostname() |
linux下可以采用模拟ifconfig命令,获取IP地址,再通过正则表达式来匹配需要的内容。参考这篇博客做法使用python获取linux的IP地址
事实上,我的需求里面IP地址参数可以为空,用户名密码作为执行脚本的参数,所以实际Linux下的代码修改如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32import requests
import socket
import sys
#构造地址
url = 'https://login.ecnu.edu.cn/srun_portal_pc.php?ac_id=1&'
#从输入获取用户名、密码
#如果不想每次都输入用户名密码,可以将账户密码赋值给这俩变量
username = sys.argv[1]
userpwd = sys.argv[2]
#构造form表单中的参数
params = {
'action': 'login',
'username': username,
'password': userpwd,
'ac_id': '1',
'user_mac':'',
'user_ip': '',
'nas_ip': '',
'save_me':'',
'ajax': 1
}
html = requests.post(url, data = params)
html.encoding='utf-8'
if html.text.__contains__('ok'):
print('login successfull, you can use ping www.baidu.com to confirm..')
保存文件,给文件执行权限。使用下面的命令直接执行,看到login successfull消息出现,则能正常访问校外资源了。
1
python3 login_robot.py youraccount yourpassword
后记
前面给的博客地址,博主提供的python代码获取linux ip地址,在ubuntu下无法正确获取到。但思路是没问题的,都是通过调用ifconfig命令,获取到输出内容进行匹配。针对博主给的代码,我在ubuntu下进行了些修改,代码提供如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#encoding:utf-8
# 按行匹配IP、mac地址信息
from subprocess import Popen, PIPE
def getIfconfig():
p = Popen(['ifconfig'], stdout = PIPE)
data = p.stdout.read().decode().split('\n\n')
return [i for i in data if i and not i.startswith('lo')]
def parseIfconfig(data):
# print(data)
dic = {}
for devs in data:
lines = devs.split('\n')
devname = lines[0].split()[0]
ipaddr = lines[1].split()[1]
macaddr = lines[4].split()[1]
dic[devname] = [ipaddr, macaddr]
return dic
if __name__ == '__main__':
data = getIfconfig()
print(parseIfconfig(data))
1 | # 正则表达式方式获取IP地址 |
附上ifconfig输出内容,实际上就是想办法从输出中匹配出需要的信息。
- 本文作者: 达文西
- 本文链接: https://edsiongithub.github.io/2021/05/13/0008/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!