Untitled
unknown
plain_text
9 months ago
4.4 kB
11
Indexable
import os
import sys
import json
import requests
from argparse import ArgumentParser
try:
from utils import crypto, data
from utils.logger import Logger
from utils.request import Request
except ImportError:
from realme_ota.utils import crypto, data
from realme_ota.utils.request import Request
from realme_ota.utils.logger import Logger
def main():
parser = ArgumentParser()
# Verbosity
verbosity = parser.add_mutually_exclusive_group()
verbosity.add_argument("-v", "--verbosity", type=int, choices=range(0, 6), default=4, help="Set the verbosity level (0-5). Default: 4.")
verbosity.add_argument("-s", "--silent", action='store_true', help="Enable silent output.")
# Positional arguments
parser.add_argument("product_model", type=str, help="Product Model (ro.product.name).")
parser.add_argument("ota_version", help="OTA Version (ro.build.version.ota).")
parser.add_argument("rui_version", type=int, choices=[1, 2, 3, 4, 5], help="RealmeUI Version (ro.build.version.realmeui).")
parser.add_argument("nv_identifier", type=str, nargs='?', help="NV identifier (ro.build.oplus_nv_id) (if none, provide 0 or omit).")
# Request attributes
req_opts = parser.add_argument_group("request options")
req_opts.add_argument("-r", "--region", type=int, choices=[0, 1, 2, 3], default=0, help="Custom region (GL=0, CN=1, IN=2, EU=3).")
req_opts.add_argument("-i", "--imei", type=str, nargs='+', help="Specify one or two IMEIs for the request.")
req_opts.add_argument("-b", "--beta", action='store_true', help="Try to get a test version.")
# Output settings
out_opts = parser.add_argument_group("output options")
out_opts.add_argument("-d", "--dump", type=str, help="Save request response into a file.")
args = parser.parse_args()
logger = Logger(level=0 if args.silent else args.verbosity)
request = Request(
req_version=1 if args.rui_version == 1 else 2,
model=args.product_model,
ota_version=args.ota_version,
rui_version=args.rui_version,
nv_identifier=args.nv_identifier,
region=args.region,
imei0=args.imei[0] if args.imei else None,
imei1=args.imei[1] if args.imei and len(args.imei) > 1 else None,
beta=args.beta
)
logger.log(f"Loading payload for {args.product_model} (RealmeUI V{args.rui_version})")
try:
request.set_vars()
req_body, req_hdrs, plain_body = request.set_body_headers()
except Exception as e:
logger.die(f"Error setting request variables: {e}", 2)
logger.log(f"Request headers: {json.dumps(req_hdrs, indent=4)}", 5)
logger.log(f"Request body: {json.dumps(plain_body, indent=4)}", 5)
logger.log("Waiting for the endpoint response...")
try:
response = requests.post(request.url, data=request.body, headers=request.headers, timeout=30)
except Exception as e:
logger.die(f"Request error: {e}", 1)
try:
request.validate_response(response)
except Exception as e:
logger.die(f"Response validation error: {e}", 1)
logger.log("Processing response data...")
try:
json_response = json.loads(response.content)
content = json.loads(request.decrypt(json_response[request.resp_key]))
except Exception as e:
logger.die(f"Response parsing error: {e}", 2)
# Save processed data into a variable
server_data = {
"model": content.get("aid", "Unknown"),
"version": content.get("versionName", "Unknown"),
"description_url": content.get("description", {}).get("url", "Unknown"),
"update_url": content.get("components", [{}])[0].get("componentPackets", {}).get("url", "Unknown")
}
# Save to file if requested
if args.dump:
try:
with open(args.dump, "w", encoding="utf-8") as file:
json.dump(server_data, file, indent=4, ensure_ascii=False)
logger.log(f"Response saved to {args.dump}")
except Exception as e:
logger.die(f"File writing error: {e}", 1)
print(json.dumps(server_data, indent=4, ensure_ascii=False))
if __name__ == "__main__":
main()
Editor is loading...
Leave a Comment