#!/usr/bin/env python3 import json import os from androguard.core.bytecodes.apk import APK import requests from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.serialization import pkcs12 from ChargeControl import ChargeControl, ChargeControls from MyPSACC import MyPSACC from sys import argv import sys import re def getxmlvalue(root, name): for child in root.findall("*[@name='" + name + "']"): return child.text def find_app_path(): base_dir = 'apps/' paths = os.listdir(base_dir) if len(paths) > 0: for path in paths: pattern = re.compile('com.psa.mym.\\w*') print(pattern.match(path)) if pattern.match(path) is not None: return base_dir + path return None def find_preferences_xml(): paths = os.listdir() if len(paths) > 0: for path in paths: pattern = re.compile('com.psa.mym.\\w*_preferences.xml') if pattern.match(path) is not None: return path return None def save_key_to_pem(pfx_data, pfx_password): private_key, certificate, additional_certificates = pkcs12.load_key_and_certificates(pfx_data, bytes.fromhex(pfx_password)) with open("public.pem", "wb") as f: f.write(certificate.public_bytes(encoding=serialization.Encoding.PEM)) with open("private.pem", "wb") as f: f.write(private_key.private_bytes(encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption())) current_dir = os.getcwd() script_dir = dir_path = os.path.dirname(os.path.realpath(__file__)) if sys.version_info < (3, 6): raise RuntimeError("This application requres Python 3.6+") if not argv[1].endswith(".apk"): print("No apk given") exit(1) print("APK loading...") a = APK(argv[1]) package_name = a.get_package() resources = a.get_android_resources() # .get_strings_resources() client_id = resources.get_string(package_name, "PSA_API_CLIENT_ID_PROD")[1] client_secret = resources.get_string(package_name, "PSA_API_CLIENT_SECRET_PROD")[1] HOST_BRANDID_PROD = resources.get_string(package_name, "HOST_BRANDID_PROD")[1] pfx_cert = a.get_file("assets/MWPMYMA1.pfx") remote_refresh_token = None print("APK loaded !") client_email = input("mypeugeot email: ") client_password = input("mypeugeot password: ") client_realm = input("What is the car api realm : clientsB2CPeugeot, clientsB2CCitroen, clientsB2CDS, clientsB2COpel, " "clientsB2CVauxhall\n") country_code = input("What is your country code ? (ex: FR, GB, DE, ES...)\n") ## Customer id site_code="AP_"+country_code+"_ESP" res=requests.post(HOST_BRANDID_PROD+"/GetAccessToken", headers={ "Connection": "Keep-Alive", "Content-Type": "application/json", "Host": "id-dcr.peugeot.com", "User-Agent": "okhttp/2.3.0" }, params={"jsonRequest": json.dumps({"siteCode": site_code, "culture": "fr-FR", "action": "authenticate", "fields": {"USR_EMAIL": {"value": client_email}, "USR_PASSWORD": {"value": client_password}}}) } ) token = res.json()["accessToken"] save_key_to_pem(pfx_cert,"") res2 = requests.post("https://mw-ap-m2c.mym.awsmpsa.com/api/v1/user?culture=fr_FR&width=1080&cgu=1611656517&v=1.27.0", data=json.dumps({"site_code":site_code, "ticket":token}), headers={ "Connection": "Keep-Alive", "Content-Type": "application/json;charset=UTF-8", "Source-Agent": "App-Android", "Token": token, "User-Agent": "okhttp/4.8.0", "Version": "1.27.0" }, cert=("public.pem","private.pem"), ) res_dict = res2.json()["success"] customer_id = res_dict["dealers"]["apv"]["data"]["Brand"] + "-" + res_dict["id"] # Psacc psacc = MyPSACC(None, client_id, client_secret, remote_refresh_token, customer_id, client_realm) psacc.connect(client_email, client_password) os.chdir(current_dir) psacc.save_config(name="test.json") res = psacc.get_vehicles() print(f"\nYour vehicles: {res}") ## Charge control charge_controls = ChargeControls() for vin, vehicle in res.items(): chc = ChargeControl(None, vin, 100, [0, 0]) charge_controls.list[vin] = chc charge_controls.save_config(name="charge_config1.json") try: os.remove("private.pem") os.remove("public.pem") except: print("Error when deleting temp files") print("Success !!!")