2023-05-20:运用python库来完成守时使命,不再依靠系统的守时使命,布置起来简略100倍
原文链接 python完成校园网主动认证 – 歌梦罗 – 努力日子,努力热爱 (gmero.com)
说在前面
大部分校园网都需求认证才能够上网,而且就算你保持在线隔一段时刻也会将你强行踢下线,导致游戏中断,自己挂在校园网的web程序宕机等头疼的问题。
本文主要是运用python与主机的计划使命来完成校园网的主动认证,需求注意的是,咱们校园的校园网认证系统与认证办法或许与你们校园的纷歧样,所以主要是共享我的完成思路,以供大家参考参考。
准备工作:
- 一台电脑
- 一台用于挂载主动认证脚本的服务器(也可所以你的电脑,或者不那么硬的路由器之类的)
了解校园网认证的过程
这是最繁琐的一步,在网上见过的这么多认证的教程,感觉咱们校园是最复杂的
其实总结来说这一步便是重复的在浏览器f12里调查你在认证的时分都通过了哪些程序,咱们校园的认证流程大概是这样的
咱们需求传入以下参数进行认证,其间后三项传空值,由所以本地认证后面脚本就懒得加密暗码了,把passwordEncrypt传false,password直接明文就可以了,或许不安全,但校园网无所谓。
看起来感觉完成很简略对不对?python随意几行request就能完成了的。但有以下几个问题:
- 重复的认证是无效的,不会重新计算在线时刻(到点仍是踢你)
- 高频的认证或许导致莫名美妙的bug,比方明明现已认证成功了而认证服务器那儿确觉得你没有认证,导致认证界面直接卡死(由于123.123.123.123在你现已接入互联网的情况下是无法访问的)
- 多次认证还或许导致出现验证码,目前脚本还无法处理验证码
所以咱们在程序中需求判别是否现已认证了,在现已认证的情况下运转程序需求先登出来重置在线时刻从而推延强制下线的时刻(所以,咱们又需求找到两个恳求:一个是判别认证情况的,一个是退出登录的)
通过疯狂的F12和api调试之后,找到了172.208.2.102/eportal/InterFace.do?method=logout
与172.208.2.102/eportal/InterFace.do?method=getUserInfo
两个api来进行登出和判别操作
python完成
认证流程用python的requests库很简略就能完成,守时使命用schedule来创建也很简略。
import re
import time
import urllib.parse
from urllib.parse import urlparse
import requests
import schedule
apiUrl = "http://172.208.2.102/eportal/InterFace.do"
authUrl = apiUrl + "?method=login"
logoutUrl = apiUrl + "?method=logout"
getQueryUrl = "http://123.123.123.123/"
getUserInfoUrl = apiUrl + "?method=getOnlineUserInfo"
webService = "中国电信"
# 判别是否现已认证了
def is_authed():
try:
resp = requests.get(getUserInfoUrl, timeout=3)
if resp.status_code != 200:
# 网络问题直接退出
print("判别认证状况失利")
return False
else:
json_data = resp.json()
result = json_data["result"]
return result != "fail"
except requests.RequestException:
print("判别认证状况失利: 恳求失利")
return False
# 获取query认证信息
def get_query_str():
try:
resp = requests.get(getQueryUrl, timeout=8)
if resp.status_code != 200:
print("获取query信息失利")
return False
pattern = "href='https://juejin.im/post/7234864940799213625/(.*)'"
match = re.search(pattern, resp.text)
if match:
url = urlparse(match.group(1))
return url.query
else:
return None
except requests.RequestException:
print("获取query信息失利: 恳求失利")
return False
# 认证
def do_auth():
query_str = get_query_str()
if not query_str:
return False
# 表单数据
data = {
"userId": "871390441",
"password": "yourpassword",
"service": urllib.parse.quote(webService),
"queryString": query_str,
"passwordEncrypt": "false",
"operatorPwd": None,
"operatorUserId": None,
"validcode": None
}
try:
resp = requests.post(authUrl, data)
if resp.status_code == 200 and resp.json()["result"] == "success":
print("认证成功")
return True
else:
print("认证失利")
return False
except requests.RequestException:
print("认证失利: 恳求失利")
return False
# 退出登录
def do_logout():
resp = requests.get(logoutUrl)
if resp.status_code == 200:
if resp.json()["result"] == "success":
print("退出登录成功")
return True
else:
print("退出登录失利: " + resp.json()["message"])
return False
else:
print("退出登录失利: 网络过错")
return False
# 一次认证流程
def auth_job():
print("\n====校园网主动认证开端====")
if is_authed():
if do_logout():
do_auth()
else:
do_auth()
print("====校园网主动认证结束====\n")
if __name__ == '__main__':
auth_job()
# 守时使命
schedule.every().day.at("12:00").do(auth_job)
schedule.every().day.at("00:00").do(auth_job)
while True:
schedule.run_pending()
time.sleep(1)
代码部分有了思路之后其实就很简略了,接下来便是最重要的布置环节了。
布置到服务器
我这里以布置到我的破烂x86linux服务器上为例(windows就更简略了,直接运转python程序即可),采纳docker布置的办法
首先写Dockerfile, 这里我就不解说了,不明白的话找一找材料吧
FROM python:3.11-slim-bullseye
WORKDIR /app
ADD . /app
RUN pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple && \
pip3 config set install.trusted-host mirrors.aliyun.com && \
pip install --upgrade pip &&\
pip3 install requests &&\
pip3 install schedule
CMD python3 -u main.py
然后在当前文件夹输入命令来树立镜像和运转容器,很简略对不对
docker build -t autoauth:v1 .
docker run --restart always --name myautoauth autoauth:v1
写在最后
以上操作在我这是完美运转的,需求一些折腾,但你能看完我这篇博客阐明你必定也是个喜爱折腾的人吧。上面的一些命名办法途径之类的纷歧定是肯定的。