admin 管理员组

文章数量: 1184232

使用 Python 实现PPPOE拨号连接

PPPOE大家小时候应该都用过,输入宽带账号和密码后,会向运营商请求一个公网IP,通过此IP访问互联网,小编身边有几个朋友是做自媒体工作室的,不同平台对于IP的要求严格苛刻,需要做到单号单IP,当然,这些都是题外话了,咱们直接进入正文!完整的代码我已放到文章最末尾

一、模块导入

import subprocess
import sys

subprocess 模块

subprocess 模块允许我们通过 Python 程序执行外部命令或程序。在本代码中, subprocess 用于执行拨号命令和获取 IP 地址。简单来说就是python的小跟班帮其传递指令给系统,本文的宽带连接就是通过 subprocess 底层传输拨号指令的

新手小白,可以看下: subprocess 模块允许 Python 程序生成新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。换句话说, subprocess 使得 Python 能够与系统的命令行环境进行交互,执行外部命令或程序,并处理其输出。

sys 模块

sys 模块提供了一些与 Python 解释器紧密相关的功能。在本代码中, sys 用于在发生错误时退出程序。

二、定义拨号连接函数: dial_connection

def dial_connection(username, password):
    # 默认的拨号连接名称
    connection_name = "宽带连接"
    
    # 构建拨号命令
    command = f"rasdial {connection_name} {username} {password}"
    
    try:
        # 执行拨号命令
        result = subprocess.check_output(command, stderr=subprocess.STDOUT, text=True, shell=True)
        print(result)
        
        # 获取拨号后的IP地址
        ip_command = "ipconfig | findstr /i \"IPv4 Address\""
        ip_result = subprocess.check_output(ip_command, stderr=subprocess.STDOUT, text=True, shell=True)
        print(ip_result)
        
    except subprocess.CalledProcessError as e:
        # 拨号失败,打印错误信息
        print(f"An error occurred: {e.output}")
        sys.exit(1)

1. 默认的拨号连接名称

connection_name = "宽带连接"

这里定义了默认的拨号连接名称为“宽带连接”。这是 Windows 系统中常见的拨号连接名称,用户可以根据实际情况修改。小编提示 :一般Windows系统中默认拨号名称是:宽带连接,大家在写的时候可以查看

2. 构建拨号命令

command = f"rasdial {connection_name} {username} {password}"

使用字符串格式化构建拨号命令。 rasdial 是 Windows 下用于拨号网络连接的命令行工具 ,后跟连接名称、用户名和密码。

3. 执行拨号命令

result = subprocess.check_output(command, stderr=subprocess.STDOUT, text=True, shell=True)
print(result)
  • subprocess.check_output :执行构建的命令,并捕获其输出。
  • 参数说明
    • command :要执行的命令。
    • stderr=subprocess.STDOUT :将标准错误合并到标准输出中。
    • text=True :以字符串形式返回输出,而不是字节。
    • shell=True :通过 shell 执行命令,这在执行带有管道或重定向的命令时是必要的。

执行成功后,输出拨号命令的结果。

4. 获取拨号后的 IP 地址

ip_command = "ipconfig | findstr /i \"IPv4 Address\""
ip_result = subprocess.check_output(ip_command, stderr=subprocess.STDOUT, text=True, shell=True)
print(ip_result)
  • 构建 IP 获取命令 :使用 ipconfig 获取网络配置信息,并通过 findstr 过滤出包含 “IPv4 Address” 的行。
  • 执行命令并输出结果 :同样使用 subprocess.check_output 执行命令,并打印结果以显示当前 IP 地址。

5. 错误处理

except subprocess.CalledProcessError as e:
    # 拨号失败,打印错误信息
    print(f"An error occurred: {e.output}")
    sys.exit(1)
  • 捕获异常 :如果拨号命令执行失败, subprocess.check_output 会抛出 CalledProcessError 异常。
  • 打印错误信息 :输出错误信息,帮助用户了解失败原因。
  • 退出程序 :使用 sys.exit(1) 退出程序,并返回状态码 1 表示发生错误。此处就是咱们开头引入的sys

三、定义主函数: main

def main():
    # 输入用户名和密码
    username = input("Enter your username: ")
    password = input("Enter your password: ")
    
    # 进行拨号连接
    dial_connection(username, password)

1. 输入用户名和密码

username = input("Enter your username: ")
password = input("Enter your password: ")

使用 input 函数提示用户输入拨号连接所需的用户名和密码。这些输入将传递给 dial_connection 函数以建立连接。小编提示:用户在终端上填写宽带拨号的账号和密码,此处是 明文显示

2. 进行拨号连接

dial_connection(username, password)

这里我们调用前面定义的 dial_connection 函数,传入用户输入的用户名和密码,开始愉快的拨号过程。

四、程序入口

if __name__ == "__main__":
    main()

这段代码确保当脚本作为主程序运行时,调用 main 函数。它防止在脚本被导入为模块时自动执行 main 函数。小编提示:如果大家后期想做卡密系统(类似于市面上的单机单卡验证系统)在这个入口处做一扇门,如果大家感兴趣我下一期写一个文章专门讲解

五:完整代码

完整的代码我放这了,运行后输入宽带的账号和密码就可以正常切网(ipv4),

import subprocess
import sys
def dial_connection(username, password):
    # 默认的拨号连接名称
    connection_name = "宽带连接"
    
    # 构建拨号命令
    command = f"rasdial {connection_name} {username} {password}"
    
    try:
        # 执行拨号命令
        result = subprocess.check_output(command, stderr=subprocess.STDOUT, text=True, shell=True)
        print(result)
        
        # 获取拨号后的IP地址
        ip_command = "ipconfig | findstr /i \"IPv4 Address\""
        ip_result = subprocess.check_output(ip_command, stderr=subprocess.STDOUT, text=True, shell=True)
        print(ip_result)
        
    except subprocess.CalledProcessError as e:
        # 拨号失败,打印错误信息
        print(f"An error occurred: {e.output}")
        sys.exit(1)
def main():
    # 输入用户名和密码
    username = input("Enter your username: ")
    password = input("Enter your password: ")
    
    # 进行拨号连接
    dial_connection(username, password)
if __name__ == "__main__":
    main()

以上就是本期内容: 使用 Python 实现拨号连接

欢迎大家在评论区留言

本文标签: 使用 地址 编程