Skip to main content

Tiu MoAbout 2 min

"""
@author yutanglee
@description 这个代码可以免浏览器拨号上网,原理很简单,就是给认证服务器发送一个http请求。
@use 你需要提供上网账号、密码和运营商,是否采用手机端或者PC端是可选的。手机端和PC端是指,重邮的每个上网账号可以同时存在一个PC账号和手机端。
"""
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(["ip", "a"]).decode("utf-8")
        
        # 使用正则表达式解析 IP 地址
        ip_pattern = r"inet (\d+\.\d+\.\d+\.\d+)"
        match = re.findall(ip_pattern, output)
        
        # 筛选出以特定 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='<your_id>', help='your account for CQUPT network, maybe is your id number login ehall.cqupt.edu.cn')
    args.add_argument('--psw', type=str, default='<your_password>', help='password')
    args.add_argument('--isp', type=str, default='<your_isp>', 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('账号不存在!')