CQUPT实验室电脑定时联网

由于重邮上网需要拨号并且网络变动时会造成拨号掉线断网,但作为办公机有时候又需要实时联网方便使用,尤其是暑假放假机器更不能断。

解决方法:

Windows定时任务 + Python拨号脚本

Python拨号脚本

先准备python拨号脚本

"""
@author yutanglee
@description 这个代码可以免浏览器拨号上网,原理很简单,就是给认证服务器发送一个http请求。
@use 你需要提供上网账号、密码和运营商,是否采用手机端或者PC端是可选的。手机端和PC端是指,重邮的每个上网账号可以同时存在一个PC账号和手机端。
@author2 MirrorML
@descritpion 进行了Windows系统的适配
"""
from ast import arg
from pydoc import describe
import requests
import subprocess
import re
import argparse
import base64


def login(usr, psw, isp, ip, mobile=True):
    
    url = 'http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&' +\
        'user_account=%2C0%2C' + usr + '%40' + isp +'&user_password=' + psw + '&wlan_user_ip=' + ip + \
        '&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3&v=10390'
    if not mobile:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58'}
    else:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36 Edg/114.0.1823.58'}
    r = requests.get(url=url, headers=headers)
    return r.text

def get_local_ip():
    try:
        # 运行 ip a 命令获取网络接口信息
        output = subprocess.check_output(["ipconfig"]).decode("cp1252")
        print(output)
        # 使用正则表达式解析 IP 地址
        ip_pattern = r"(\d+\.\d+\.\d+\.\d+)"
        match = re.findall(ip_pattern, output)
        print(match)
        # 筛选出以特定 IP 段开头的 IP 地址
        target_ips = [ip for ip in match if ip.startswith("10.16.") or ip.startswith("10.20.")]
        
        if target_ips:
            return target_ips[0]  # 返回第一个满足条件的 IP 地址
        else:
            return None
    except subprocess.CalledProcessError:
        return None

    
if __name__ == '__main__':
    args = argparse.ArgumentParser()
    args.add_argument('--user', type=str, default='认证码', help='your account for CQUPT network, maybe is your id number login ehall.cqupt.edu.cn')
    args.add_argument('--psw', type=str, default='密码', help='password')
    args.add_argument('--isp', type=str, default='校园网账号类型', help='cmcc|telecom|unicom|xyw')
    args.add_argument('--mobile', action='store_true', help='do you want use mobile mode?')
    args = args.parse_args()
    
    if args.isp != 'cmcc' and args.isp != 'telecom' and args.isp != 'unicom' and args.isp != 'xyw':
        print('运营商只支持cmcc|telecom|unicom|xyw  重新检查输入!')
        exit(1)

    ip = get_local_ip()
    if ip is None:
        ip = input("自动获取IP失败,请你输入正确的IP:")
    print('your ip is:', ip)
    print('your user is:', args.user)
    print('your password is:', args.psw)
    print('your isp is:', args.isp)
    args.mobile = True

    response = login(args.user, args.psw, args.isp, ip, args.mobile)
    start_index = response.find('"result":"') + len('"result":"')
    end_index = response.find('"', start_index)
    result_value = response[start_index:end_index]
    if result_value == '1':
        print('登录成功!')
    else:
        start_index = response.find('"msg":"') + len('"msg":"')
        end_index = response.find('"', start_index)
        msg_encoded = response[start_index:end_index]
        # 对msg进行Base64解码
        msg_decoded = base64.b64decode(msg_encoded).decode('utf-8')

        print(msg_decoded, response)
        if msg_decoded == 'ldap auth error':
            print('密码错误!')
        elif msg_decoded == 'userid error1':
            print('账号不存在!')

cmd的使用方式为, 默认使用手机端登录

python drome.py --user xx --psw xx --isp xx

Windows定时任务

打开任务计划程序

image-20240812121057821

创建基本任务, 触发器每天执行(后续配置1小时执行一次),操作选择启动程序,

image-20240812121356517

程序或者脚本选择python执行的路径,起始于选择python拨号脚本存放的路径,参数为 drome.py --user xx --psw xx --isp xx(这里是演示,我直接把参数写到文件里了,当前你也可以这样做)

点击确定完成。

重新点击这个任务,在触发器那里,选择重复任务间隔1小时

image-20240812121653000

总结

至此,我们电脑便会1小时进行一次拨号,保存一直有网

后续扩展

  1. 利用DDNSGO+IPV6实现MSTSC远程访问
  2. 直接使用向日葵连接
  3. 使用Tailscale进行异地组网连接