pypush-plus-plus/gateway_fetch.py
2023-09-22 15:44:25 -04:00

80 lines
No EOL
2.8 KiB
Python

import requests, random, plistlib, zipfile
from io import BytesIO
appleplist = None
def getMasterList():
global appleplist
if (appleplist is None):
appleplist = plistlib.loads(requests.get("https://itunes.apple.com/WebObjects/MZStore.woa/wa/com.apple.jingle.appserver.client.MZITunesClientCheck/version?languageCode=en").content)
return appleplist
def getGatewayMCCMNC(MCCMNC):
gateways = getGatewaysMCCMNC(MCCMNC)
if gateways is None:
return None
return gateways[random.randrange(0, len(gateways))]
def getGatewaysMCCMNC(MCCMNC):
bundles = getBundlesMCCMNC(MCCMNC)
gateway = None
if bundles is None:
return
for bundle in bundles:
gateway = getGatewayFromBundle(parseBundle(bundle["Bundle"]))
if gateway is not None:
break
return gateway
def getBundlesMCCMNC(MCCMNC):
appleplist = getMasterList()
bundlelist = []
if MCCMNC in appleplist["MobileDeviceCarriersByMccMnc"]:
mmo = appleplist["MobileDeviceCarriersByMccMnc"][MCCMNC]
if "BundleName" in mmo:
bundle = getBundleByName(mmo["BundleName"])
if bundle is not None:
bundlelist.append({"Name": mmo["BundleName"], "Bundle": bundle})
if "MVNOs" in mmo:
for mv in mmo["MVNOs"]:
if "BundleName" in mv:
bundle = getBundleByName(mv["BundleName"])
if bundle is not None:
bundlelist.append({"Name": mv["BundleName"], "Bundle": bundle})
return bundlelist
else:
return None
def getGatewayFromBundle(bundledict):
applecarrierplist = bundledict
if "PhoneNumberRegistrationGatewayAddress" in applecarrierplist:
regnum = applecarrierplist["PhoneNumberRegistrationGatewayAddress"]
if (type(regnum) == str):
regnum = [regnum]
return regnum
return None
def parseBundle(bundle):
bundlebytes = BytesIO(bundle)
bundlezip = zipfile.ZipFile(bundlebytes)
carrierpath = [path for path in bundlezip.namelist() if path.startswith("Payload/") and path.endswith("/carrier.plist")][0]
applecarrierplist = plistlib.load(bundlezip.open(carrierpath, "r"))
return applecarrierplist
def getBundleByName(BundleName):
appleplist = getMasterList()
if BundleName in appleplist["MobileDeviceCarrierBundlesByProductVersion"]:
x = BundleName
greatestver = "0"
for y in appleplist["MobileDeviceCarrierBundlesByProductVersion"][x]:
try:
inty = float(y)
except:
continue
if (inty > float(greatestver)):
greatestver = y
if greatestver != "0":
return requests.get(appleplist["MobileDeviceCarrierBundlesByProductVersion"][x][greatestver]["BundleURL"]).content
else:
return None
return None