关于高校网站建设论文的总结,品牌策划是做什么的,哪家云服务器性价比高,手工制作小船目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态#xff1f; 书写代码打包设置开机自动启动 起因
我们一般通过远程控制的方式访问实验室电脑#xff0c;但是最近实验室老是断电#xff0c;但重启后也不会自动连接校园网账户认证#xff0c;远程工具 书写代码打包设置开机自动启动 起因
我们一般通过远程控制的方式访问实验室电脑但是最近实验室老是断电但重启后也不会自动连接校园网账户认证远程工具向日葵、Todesk等也就用不了就想着用python做一个自动认证的脚本下面是实践过程。
注本脚本只是用于自动做校园网账户的认证在已经连着校园网的情况下才能验证并不是让windows去自动连接某个校园网wifi。
执行步骤
分析校园网登录逻辑
先登录校园网认证网页先点击F12选中网络并勾选保存日志 再输入账户密码点击login看看发了哪些请求一般netword的前几个比较重要后面的都是资源文件 这里发现发了两个请求第一个post请求第二个get请求每个学校的不一样HHU的可以直接用本教程方法 第一个是post请求 点击payload查看post请求携带的数据发现里面包含了自己的校园网账户和密码 第二个是get请求 复制上面的request URL到浏览器发现就是可以访问的认证界面。
总结点击login按钮后我的密码是先通过一个post请求提交到服务器然后再通过一个get请求去实现登录的。
那脚本要做的事情就是当发现当前处于未登录状态时要模拟浏览器的行为先发一个post请求请求header和data都要和浏览器上的内容对应然后再发一个get请求就可以了。有点像爬虫做的事情
如何判断当前是否处于未登录状态
一般提交get请求时当前已经登录和为登录状态得到html文档中的标签内容是不一样的。这里我们在已登录状态下按F12再按ctrlF查找下的内容发现果然有标识 也就是说当get请求结果返回的title标签内容是“登录成功”时当前就已经处于登录状态了此时不需要再进行认证如果不是tittle标签内容不是“登录成功”则说明当前未登录需要发请求进行认证。
书写代码
梳理一下脚本要实现的内容
写一个死循环不断判断当前是否处于登录状态直接发get请求如果返回的tittle为“登录成功”则为已登录状态。
while(True):print(自动联网脚本开始运行...)# 请求校园网urlresponse request.urlopen(get_URL)html response.read()# 获取tittle元素内容res re.findall(title(.*)/title, html.decode(encodingGBK, errorsstrict))print(res:, res)title if len(res) 0:print(访问,get_URL,失败请检查请求地址)passelse:title res[0]print(title:,title)否则的话就模拟浏览器的行为给服务器发一个post请求设置好header和data示例如下然后再发一个get请求进行认证。 2.1设置header 变成如下 # 设置post的请求头浏览器点击F12在Netword中选中post请求点击Headers、request header面板中查看header {Accept: */*,Accept-Encoding: gzip, deflate,Accept-Language: zh-CN,zh;q0.9,en-US;q0.8,en;q0.7,Connection: keep-alive,Content-Length: 762,Content-Type: application/x-www-form-urlencoded; charsetUTF-8,Cookie: EPORTAL_COOKIE_DOMAINfalse; EPORTAL_COOKIE_USERNAMEXXXXX; EPORTAL_COOKIE_SERVER%E4%B8%AD%E5%9%E7%A7%BB%E5%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SERVER_NAME%E4%B8%AD%E5%9B%BA7%BB%E5%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SAVEPASSWORDtrue; EPORTAL_COOKIE_OPERATORPWD; EPORTAL_COOKIE_NEWVtrue; EPORTAL_COOKIE_PASSWORD1e485d5861f50092df261f37ca6218c4d8675e6daf226f84489f5bd7ca8339a4e15b27b2fdb3a1ade55b553c96a04a76ad00a31cb46902d356babec2ced138dc40f97b6f5b489274aa5561d24a6f9610caf99e52e5a0d92bf2448819f44dfc2f2c37966d8554aa00fe530d0cbe52a0d4438f2640f04410e865ff3aeff6faf9ff; EPORTAL_AUTO_LAND; EPORTAL_USER_GROUP%E5%AD%A6%E7%94%9F; JSESSIONID8A3372E32254B5F7321DF7B93A4851AA; JSESSIONIDF2C1BB4E6D58762763F36630541B5C38,Host: eportal.hhu.edu.cn,Origin: http://eportal.hhu.edu.cn,Referer: http://eportal.hhu.edu.cn/eportal/index.jsp?wlanuserip29fc0b608918b04682c9e6c6cf6c1c29wlanacname2356e8aa38c836625d91257381aaef57ssidea65e712d7d12a1fb44ec48a1c5072b0nasip07ec241dffc0de15d87efe9c07b8c6e0mac027a460789bb1e7c9c4acc766c937e6etwireless-v2url35e6780db7fde27a90f8986393791ca7b01578112b560bd2,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36,}2.2设置data 变成如下 # 设置post的请求数据浏览器点击F12在Netword中选中post请求点击payload面板中查看data {userId: XXX, # 需要根据自己的情况修改password: 1e485d5861f50092df261f37ca621daf226f84489f5bd5b27b2fdb3a1ade55b553c96a04a76ad00aa31cb4ced138dc40f97b6f5b489274a6f9610caf99e52e5a0d92bf2448819f44dfc2f2c37966d8554ada00fe530d0cbe52a0d4438f2640f04410e865ff3aeff6faf9ff, # 需要根据自己的情况修改queryString: wlanuserip%3D29fc0b608918b04682c9e6c6cf6c1c29%26wlanacname%3D2356e8aa38c836625d91257381aaef57%26ssid%3Dea65e712d7d12a1fb44ec48a1c5072b0%26nasip%3D07ec241dffc0de15d87efe9c07b8c6e0%26mac%3D027a460789bb1e7c9c4acc766c937e6e%26t%3Dwireless-v2%26url%3D35e6780db7fde27a90f8986393791ca7b01578112b560bd2,passwordEncrypt: true,operatorPwd: ,operatorUserId: ,validcode: ,service: %E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8(CMCC%20NET),}打印状态码判断是否认证成功。 休眠一段时间然后进行下一次循环。 # 每1h左右检测一次是否成功连接rand random.uniform(0, 100)print(休眠,int(3600.0 rand),s)time.sleep(3600.0 rand)另外由于这个脚本可以放到需要后台运行看不到print输出。所以增加一个小功能把日志输出到log文件中去可以查看脚本运行状态。各位可以考虑要不要这个功能
完整代码如下
import re # 正则表达式用于匹配字符
from urllib import request
import requests
import time
import random
import os# 设置日志文件路径
log_file_path log.txt# 第一个post请求的URL
post_URL http://eportal.hhu.edu.cn/eportal/InterFace.do?methodlogin
# 第二个get请求的URL浏览器可访问的url
get_URL http://eportal.hhu.edu.cn/eportal/success.jsp?userIndex3037656332343164666663306465asd3135643837656665396330376238633665305f31302e3139392e34362e38325f3232313630asd37303130303039keepaliveInterval0
while(True):print(自动联网脚本开始运行...)# 请求校园网urlresponse request.urlopen(get_URL)html response.read()# 获取tittle元素内容res re.findall(title(.*)/title, html.decode(encodingGBK, errorsstrict))print(res:, res)title if len(res) 0:print(访问,get_URL,失败请检查请求地址)passelse:title res[0]print(title:,title)# 根据title元素内容判断是否处于已登录状态if title 登录成功: print(当前状态为已登陆成功)else:print(当前状态为未登录)# 设置post的请求头浏览器点击F12在Netword中选中post请求点击Headers、request header面板中查看header {Accept: */*,Accept-Encoding: gzip, deflate,Accept-Language: zh-CN,zh;q0.9,en-US;q0.8,en;q0.7,Connection: keep-alive,Content-Length: 762,Content-Type: application/x-www-form-urlencoded; charsetUTF-8,Cookie: EPORTAL_COOKIE_DOMAINfalse; EPORTAL_COOKIE_USERNAMExxx; EPORTAL_COOKIE_SERVER%E4%B8%AD%E5%9B%BD%A7%BB%E%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SERVER_NAME%E4%BADE5%9B%D%E7%A7%BB%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SAVEPASSWORDtrue; EPORTAL_COOKIE_OPERATORPWD; EPORTAL_COOKIE_NEWVtrue; EPORTAL_COOKIE_PASSWORD1e485d5861f50092df261f37ca6218c4d8675e6daf226f84489f5bd7ca8339a4e15b27b2fdb3a1ade55b553c96a04a76ad00a31cb46902d356babec2ced138dc40f97b6f5b489274aa5561d24a6f9610caf99e52e5a0d92bf2448819f44dfc2f2c37966d8554aa00fe530d0cbe52a0d4438f2640f04410e865ff3aeff6faf9ff; EPORTAL_AUTO_LAND; EPORTAL_USER_GROUP%E5%AD%A6%E7%94%9F; JSESSIONID8A3372E32254B5F7321DF7B93A4851AA; JSESSIONIDF2C1BB4E6D58762763F36630541B5C38,Host: eportal.hhu.edu.cn,Origin: http://eportal.hhu.edu.cn,Referer: http://eportal.hhu.edu.cn/eportal/index.jsp?wlanuserip29fc0b608918b04682c9e6c6cf6c1c29wlanacname2356e8aa38c836625d91257381aaef57ssidea65e712d7d12a1fb44ec48a1c5072b0nasip07ec241dffc0de15d87efe9c07b8c6e0mac027a460789bb1e7c9c4acc766c937e6etwireless-v2url35e6780db7fde27a90f8986393791ca7b01578112b560bd2,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36,}# 设置post的请求数据浏览器点击F12在Netword中选中post请求点击payload面板中查看data {userId: XXX, # 校园网账号password: XXX, # 校园网密码密文queryString: wlanuserip%3D29fc0b608918b04682c9e6c6cf6c1c29%26wlanacname%3D2356e8aa38c836625d91257381aaef57%26ssid%3Dea65e712d7d12a1fbsa44ec48aa1c5072b0%26nasip%3D07ec241dffc0de15d87efe9c07b8c6e0%26mac%3D027a460789bb1e7c9c4acc7d66c937e6e%26t%3Dwireless-v2%26url%3D35e6780db7fde27a90f8986393791ca7b01578112b560bd2,passwordEncrypt: true,operatorPwd: ,operatorUserId: ,validcode: ,service: %E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8(CMCC%20NET),}# 发送post请求设置好header和dataresponse requests.post(post_URL, data, headersheader)uft_str response.text.encode(iso-8859-1).decode(utf-8)print(post请求状态码{}.format(response)) # 打印状态码# 发送get请求登录校园网schoolWebLoginURL get_URLresponse requests.get(schoolWebLoginURL).status_code # 直接利用 GET 方式请求这个 URL 同时获取状态码print(get请求状态码{}.format(response)) # 打印状态码# 将print的内容写入log文件with open(log_file_path, a, encodingutf-8) as log_file:log_file.write(自动联网脚本开始运行...\n)log_file.write(fres: {res}\n)log_file.write(ftitle: {title}\n)log_file.write(f当前状态为: {已登陆成功 if title 登录成功 else 未登录}\n)log_file.write(f状态码: {response}\n)# 检查文件大小如果大于1KB则清空文件if os.path.getsize(log_file_path) 1024:open(log_file_path, w).close()# 每1h左右检测一次是否成功连接rand random.uniform(0, 100)print(休眠,int(3600.0 rand),s)time.sleep(3600.0 rand)
打包
先安装好pyinstall工具 pip install pyinstall 最后用pyinstall工具把.py文件打包成.exe可执行文件 pyinstaller -F 你的脚本.py 注-F是把所有内容都打包进一个exe文件的意思 打包后如下 在dist里面找到可执行程序双击测试运行。
设置开机自动启动
winr输入shell:startup 把.exe拖入开机自启动文件夹里面
参考博客 Python校园网(网页认证)开机/断网自动连接 手把手教你python实现校园网自动连接 校园自动联网python脚本