注意:教程来源于用户上传,互联网收集,其中真实性注意斟酌,操作可能存在风险,请践行时注意保存资料防止丢失,如果本教程侵犯您的个人或者集体利益,请邮件fiimecn@163.com下架处理,非常感谢!
自动提交 Bootloader 解锁应用程序
• 请勿使用 VPN(ping 计算将不正确)。在运行脚本后(或运行期间),立即尝试在“开发者选项”菜单中将设备链接到您的帐户,无论结果如何。
1. 退出设备上的帐户并重新登录。
2. 下载 Cookie-Editor 浏览器扩展程序(授予扩展程序访问所有网站的权限)。
3. 转到 http://new.c.mi.com/global 并登录。如果页面上没有令牌,请尝试在 http://mi.com 上登录。
4. 单击扩展程序(在网站上),找到并复制“new_bbs_serviceToken”字符串的值。
5. 从官方网站下载并安装 Python。
6. 下载附加的 mipy 文件。
# FiimeROM汉化脚本 import subprocess import sys import os # 服务器数组 ntp_servers = [ "ntp0.ntp-servers.net", "ntp1.ntp-servers.net", "ntp2.ntp-servers.net", "ntp3.ntp-servers.net", "ntp4.ntp-servers.net", "ntp5.ntp-servers.net", "ntp6.ntp-servers.net" ] MI_SERVERS = ['sgp-api.buy.mi.com', '20.157.18.26'] # 安装依赖包 def install_package(package): subprocess.check_call([sys.executable, "-m", "pip", "install", package]) required_packages = ["requests", "ntplib", "pytz", "urllib3", "icmplib"] for package in required_packages: try: __import__(package) except ImportError: print(f"正在安装包 {package}...") install_package(package) os.system('cls' if os.name == 'nt' else 'clear') import hashlib import random import time from datetime import datetime, timezone, timedelta import ntplib import pytz import urllib3 import json import statistics from icmplib import ping # 返回平均响应时间 def debug_ping(host): try: result = ping(host, count=1, interval=0.5, timeout=2) return result.avg_rtt if result.is_alive else None except Exception as e: print(f"Ping 错误: {e}") return None # 计算平均 ping def get_average_ping(): all_pings = [] print("开始计算 ping...") def ping_server(server): pings = [] for attempt in range(3): result = debug_ping(server) if result is not None: pings.append(result) time.sleep(0.2) return statistics.mean(pings) if pings else None for server in MI_SERVERS: try: ping_time = ping_server(server) if ping_time is not None: all_pings.append(ping_time) else: print(f"\n无法获取服务器 {server} 的 ping") except Exception as e: print(f"\nPing 服务器 {server} 时出错: {str(e)}") if not all_pings: print("\n无法获取任何服务器的 ping!") print("使用默认值: 300 ms") return 300 avg_ping = statistics.mean(all_pings) print(f"平均 ping: {avg_ping:.2f} ms") return avg_ping # 生成唯一设备标识符 def generate_device_id(): random_data = f"{random.random()}-{time.time()}" device_id = hashlib.sha1(random_data.encode('utf-8')).hexdigest().upper() print(f"生成的 deviceId: {device_id}") return device_id # 通过 NTP 获取当前北京时间 def get_initial_beijing_time(): client = ntplib.NTPClient() beijing_tz = pytz.timezone("Asia/Shanghai") for server in ntp_servers: try: print(f"尝试连接 NTP 服务器: {server}") response = client.request(server, version=3) ntp_time = datetime.fromtimestamp(response.tx_time, timezone.utc) beijing_time = ntp_time.astimezone(beijing_tz) print(f"从服务器 {server} 接收到的北京时间: {beijing_time.strftime('%Y-%m-%d %H:%M:%S.%f')}") return beijing_time except Exception as e: print(f"无法连接到 {server}: {e}") print("无法连接到任何 NTP 服务器。") return None # 同步北京时间 def get_synchronized_beijing_time(start_beijing_time, start_timestamp): elapsed = time.time() - start_timestamp current_time = start_beijing_time + timedelta(seconds=elapsed) return current_time # 考虑 ping 等待指定时间 def wait_until_target_time(start_beijing_time, start_timestamp, ping_delay): next_day = start_beijing_time + timedelta(days=1) network_delay = ping_delay / 2 server_processing_time = 30 total_delay = (network_delay - server_processing_time) / 1000.0 target_time = next_day.replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(seconds=total_delay) print(f"等待直到 {target_time.strftime('%Y-%m-%d %H:%M:%S.%f')} (考虑大约计算的网络延迟)。") while True: current_time = get_synchronized_beijing_time(start_beijing_time, start_timestamp) time_diff = target_time - current_time if time_diff.total_seconds() > 1: time.sleep(min(1.0, time_diff.total_seconds() - 1)) elif current_time >= target_time: print(f"时间已到: {current_time.strftime('%Y-%m-%d %H:%M:%S.%f')}. 开始发送请求...") break else: time.sleep(0.0001) # 检查通过 API 解锁账户的可能性 def check_unlock_status(session, cookie_value, device_id): try: url = "https://sgp-api.buy.mi.com/bbs/api/global/user/bl-switch/state" headers = { "Cookie": f"new_bbs_serviceToken={cookie_value};versionCode=500411;versionName=5.4.11;deviceId={device_id};" } response = session.make_request('GET', url, headers=headers) if response is None: print("[错误] 获取解锁状态失败。") return False response_data = json.loads(response.data.decode('utf-8')) response.release_conn() if response_data.get("code") == 100004: print("[错误] Cookie 已过期,需要更新!") input("按 Enter 键关闭...") exit() data = response_data.get("data", {}) is_pass = data.get("is_pass") button_state = data.get("button_state") deadline_format = data.get("deadline_format", "") if is_pass == 4: if button_state == 1: print("[状态] 账户可以提交解锁请求。") return True elif button_state == 2: print(f"[状态] 账户被阻止提交请求,直到 {deadline_format} (月/日)。") input("按 Enter 键关闭...") exit() elif button_state == 3: print("[状态] 账户未满 30 天。") input("按 Enter 键关闭...") exit() elif is_pass == 1: print(f"[状态] 请求已批准,解锁可用直到 {deadline_format}。") input("按 Enter 键关闭...") exit() else: print("[错误] 未知状态。") input("按 Enter 键关闭...") exit() except Exception as e: print(f"[状态检查错误] {e}") return False # 等待直到指定时间开始 ping 计算 def wait_until_ping_time(start_beijing_time, start_timestamp): next_day = start_beijing_time + timedelta(days=0) target_time = next_day.replace(hour=23, minute=59, second=30) print(f"等待直到 {target_time.strftime('%Y-%m-%d %H:%M:%S')} 开始 ping 计算。") while True: current_time = get_synchronized_beijing_time(start_beijing_time, start_timestamp) time_diff = (target_time - current_time).total_seconds() if time_diff <= 0: print(f"时间已到: {current_time.strftime('%Y-%m-%d %H:%M:%S')}. 开始 ping 计算...") avg_ping = get_average_ping() return avg_ping else: time.sleep(min(1, time_diff)) # HTTP 请求的包装器 class HTTP11Session: def __init__(self): self.http = urllib3.PoolManager( maxsize=10, retries=True, timeout=urllib3.Timeout(connect=1.0, read=4.0), headers={} ) def make_request(self, method, url, headers=None, body=None): try: request_headers = {} if headers: request_headers.update(headers) request_headers['Content-Type'] = 'application/json; charset=utf-8' if method == 'POST': if body is None: body = '{"is_retry":true}'.encode('utf-8') request_headers['Content-Length'] = str(len(body)) request_headers['Accept-Encoding'] = 'gzip, deflate, br' request_headers['User-Agent'] = 'okhttp/4.12.0' request_headers['Connection'] = 'keep-alive' response = self.http.request( method, url, headers=request_headers, body=body, preload_content=False ) return response except Exception as e: print(f"[网络错误] {e}") return None def main(): cookie_value = input("输入 'new_bbs_serviceToken' 的值: ") device_id = generate_device_id() session = HTTP11Session() if check_unlock_status(session, cookie_value, device_id): start_beijing_time = get_initial_beijing_time() if start_beijing_time is None: print("设置初始时间失败。按 Enter 键关闭...") input() exit() start_timestamp = time.time() avg_ping = wait_until_ping_time(start_beijing_time, start_timestamp) if avg_ping is None: print("使用默认 ping: 50 ms") avg_ping = 50 wait_until_target_time(start_beijing_time, start_timestamp, avg_ping) url = "https://sgp-api.buy.mi.com/bbs/api/global/apply/bl-auth" headers = { "Cookie": f"new_bbs_serviceToken={cookie_value};versionCode=500411;versionName=5.4.11;deviceId={device_id};" } try: while True: request_time = get_synchronized_beijing_time(start_beijing_time, start_timestamp) print(f"\n[请求] 在 {request_time.strftime('%Y-%m-%d %H:%M:%S.%f')} (UTC+8) 发送请求") response = session.make_request('POST', url, headers=headers) if response is None: continue response_time = get_synchronized_beijing_time(start_beijing_time, start_timestamp) print(f"[响应] 在 {response_time.strftime('%Y-%m-%d %H:%M:%S.%f')} (UTC+8) 收到响应") try: response_data = response.data response.release_conn() json_response = json.loads(response_data.decode('utf-8')) code = json_response.get("code") data = json_response.get("data", {}) if code == 0: apply_result = data.get("apply_result") if apply_result == 1: print(f"[状态] 请求已批准,检查状态...") check_unlock_status(session, cookie_value, device_id) elif apply_result == 3: deadline_format = data.get("deadline_format", "未指定") print(f"[状态] 请求未提交,请求限制已达,尝试在 {deadline_format} (月/日) 再试。") input("按 Enter 键关闭...") exit() elif apply_result == 4: deadline_format = data.get("deadline_format", "未指定") print(f"[状态] 请求未提交,阻止提交请求直到 {deadline_format} (月/日)。") input("按 Enter 键关闭...") exit() elif code == 100001: print(f"[状态] 请求被拒绝,请求错误。") print(f"[完整服务器响应]: {json_response}") elif code == 100003: print("[状态] 请求可能已批准,检查状态...") print(f"[完整服务器响应]: {json_response}") check_unlock_status(session, cookie_value, device_id) elif code is not None: print(f"[状态] 未知请求状态: {code}") print(f"[完整服务器响应]: {json_response}") else: print("[错误] 响应不包含所需的代码。") print(f"[完整服务器响应]: {json_response}") except json.JSONDecodeError: print("[错误] 解码 JSON 响应失败。") print(f"服务器响应: {response_data}") except Exception as e: print(f"[响应处理错误] {e}") continue except Exception as e: print(f"[请求错误] {e}") input("按 Enter 键关闭...") exit() if __name__ == "__main__": main()
7. 运行它。出现提示时,粘贴之前复制的 cookie 并按 Enter。
8. 等待所需的时间,脚本将为您处理其余部分。
注意:不能保证 100% 的成功率。您可能会收到 5/10/30 天的提交阻止,但这也可以手动发生。该脚本只是尽可能地自动化和简化流程
信用:
• 原始帖子/作者(https://4pda.to/forum/index.php?showtopic=721838&view=findpost&p=133301054)
没有评论数据