Untitled

 avatar
unknown
plain_text
8 days ago
4.4 kB
4
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