From 5bbdd195a19e4d9cfab6d8474961b825a48441b3 Mon Sep 17 00:00:00 2001 From: Domenico Iezzi Date: Thu, 12 Oct 2017 19:46:20 +0200 Subject: [PATCH] Moved header string preparation to config.py Signed-off-by: Domenico Iezzi --- gpapi/config.py | 34 +++++++++++++++++++++++++++------- gpapi/googleplay.py | 14 +++++--------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/gpapi/config.py b/gpapi/config.py index 1f7c944..d149af3 100644 --- a/gpapi/config.py +++ b/gpapi/config.py @@ -9,10 +9,10 @@ if VERSION == 2: else: import configparser -# separator used by search.py, categories.py, ... -SEPARATOR = ";" +DFE_TARGETS = "CAEScFfqlIEG6gUYogFWrAISK1WDAg+hAZoCDgIU1gYEOIACFkLMAeQBnASLATlASUuyAyqCAjY5igOMBQzfA/IClwFbApUC4ANbtgKVAS7OAX8YswHFBhgDwAOPAmGEBt4OfKkB5weSB5AFASkiN68akgMaxAMSAQEBA9kBO7UBFE1KVwIDBGs3go6BBgEBAgMECQgJAQIEAQMEAQMBBQEBBAUEFQYCBgUEAwMBDwIBAgOrARwBEwMEAg0mrwESfTEcAQEKG4EBMxghChMBDwYGASI3hAEODEwXCVh/EREZA4sBYwEdFAgIIwkQcGQRDzQ2fTC2AjfVAQIBAYoBGRg2FhYFBwEqNzACJShzFFblAo0CFxpFNBzaAd0DHjIRI4sBJZcBPdwBCQGhAUd2A7kBLBVPngEECHl0UEUMtQETigHMAgUFCc0BBUUlTywdHDgBiAJ+vgKhAU0uAcYCAWQ/5ALUAw1UwQHUBpIBCdQDhgL4AY4CBQICjARbGFBGWzA1CAEMOQH+BRAOCAZywAIDyQZ2MgM3BxsoAgUEBwcHFia3AgcGTBwHBYwBAlcBggFxSGgIrAEEBw4QEqUCASsWadsHCgUCBQMD7QICA3tXCUw7ugJZAwGyAUwpIwM5AwkDBQMJA5sBCw8BNxBVVBwVKhebARkBAwsQEAgEAhESAgQJEBCZATMdzgEBBwG8AQQYKSMUkAEDAwY/CTs4/wEaAUt1AwEDAQUBAgIEAwYEDx1dB2wGeBFgTQ" LANG = "en_US" +TIMEZONE = 'America/New_York' GOOGLE_PUBKEY = "AAAAgMom/1a/v0lblO2Ubrt60J2gcuXSljGFQXgcyZWveWLEwo6prwgi3iJIZdodyhKZQrNWp5nKJ3srRXcUW+F1BD3baEVGcmEgqaLZUNBjm057pKRI16kB0YppeGx5qIQ5QjKzsR8ETQbKLNWgRY0QRNVz34kMJR3P/LgHax/6rmf5AAAAAwEAAQ==" # parse phone config from the file 'device.properties'. @@ -28,6 +28,11 @@ filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'device.properties') config.read(filepath) device = {} +# initialize device, because we need to setup UserAgent +# before the end of login method. If the login defines a different +# device, it won't cause conflicts +for (key, value) in config.items('angler'): + device[key] = value def getDevicesCodenames(): @@ -40,12 +45,25 @@ def getDevicesReadableNames(): sections = getDevicesCodenames() output = [] for s in sections: - device = config[s]['userreadablename'] output.append({'codename': s, 'readableName': config[s]['userreadablename']}) return output +def getUserAgent(): + return "Android-Finsky/7.1.15 (" \ + "api=3" \ + ",versionCode={versionCode}" \ + ",sdk={sdk}" \ + ",device={device}" \ + ",hardware={hardware}" \ + ",product={product}".format(versionCode=device['vending.version'], + sdk=device['build.version.sdk_int'], + device=device['build.device'], + hardware=device['build.hardware'], + product=device['build.product']) + + def getDeviceConfig(): libList = device['sharedlibraries'].split(",") featureList = device['features'].split(",") @@ -53,13 +71,15 @@ def getDeviceConfig(): glList = device['gl.extensions'].split(",") platforms = device['platforms'].split(",") + hasFiveWayNavigation = (device['hasfivewaynavigation'] == 'true') + hasHardKeyboard = (device['hashardkeyboard'] == 'true') deviceConfig = googleplay_pb2.DeviceConfigurationProto() deviceConfig.touchScreen = int(device['touchscreen']) deviceConfig.keyboard = int(device['keyboard']) deviceConfig.navigation = int(device['navigation']) deviceConfig.screenLayout = int(device['screenlayout']) - deviceConfig.hasHardKeyboard = False if device['hashardkeyboard'] == 'false' else True - deviceConfig.hasFiveWayNavigation = False if device['hasfivewaynavigation'] == 'false' else True + deviceConfig.hasHardKeyboard = hasHardKeyboard + deviceConfig.hasFiveWayNavigation = hasFiveWayNavigation deviceConfig.screenDensity = int(device['screen.density']) deviceConfig.screenWidth = int(device['screen.width']) deviceConfig.screenHeight = int(device['screen.height']) @@ -113,8 +133,8 @@ def getAndroidCheckinRequest(device_codename): request = googleplay_pb2.AndroidCheckinRequest() request.id = 0 request.checkin.CopyFrom(getAndroidCheckin()) - request.locale = 'en_US' - request.timeZone = 'America/New_York' + request.locale = LANG + request.timeZone = TIMEZONE request.version = 3 request.deviceConfiguration.CopyFrom(getDeviceConfig()) request.fragment = 0 diff --git a/gpapi/googleplay.py b/gpapi/googleplay.py index 9e5ba41..f161448 100644 --- a/gpapi/googleplay.py +++ b/gpapi/googleplay.py @@ -44,13 +44,11 @@ class GooglePlayAPI(object): SEARCHURL = FDFE + "search" CHECKINURL = BASE + "checkin" AUTHURL = BASE + "auth" - ACCOUNT = "HOSTED_OR_GOOGLE" - authSubToken = None - gsfId = None def __init__(self, debug=False): - # you must use a device-associated androidId value + self.authSubToken = None + self.gsfId = None self.lang = config.LANG self.debug = debug @@ -87,11 +85,9 @@ class GooglePlayAPI(object): can later be updated, based on the request type""" headers = { - "Accept-Language": "en-US", - "X-DFE-Encoded-Targets": - "CAEScFfqlIEG6gUYogFWrAISK1WDAg+hAZoCDgIU1gYEOIACFkLMAeQBnASLATlASUuyAyqCAjY5igOMBQzfA/IClwFbApUC4ANbtgKVAS7OAX8YswHFBhgDwAOPAmGEBt4OfKkB5weSB5AFASkiN68akgMaxAMSAQEBA9kBO7UBFE1KVwIDBGs3go6BBgEBAgMECQgJAQIEAQMEAQMBBQEBBAUEFQYCBgUEAwMBDwIBAgOrARwBEwMEAg0mrwESfTEcAQEKG4EBMxghChMBDwYGASI3hAEODEwXCVh/EREZA4sBYwEdFAgIIwkQcGQRDzQ2fTC2AjfVAQIBAYoBGRg2FhYFBwEqNzACJShzFFblAo0CFxpFNBzaAd0DHjIRI4sBJZcBPdwBCQGhAUd2A7kBLBVPngEECHl0UEUMtQETigHMAgUFCc0BBUUlTywdHDgBiAJ+vgKhAU0uAcYCAWQ/" - "5ALUAw1UwQHUBpIBCdQDhgL4AY4CBQICjARbGFBGWzA1CAEMOQH+BRAOCAZywAIDyQZ2MgM3BxsoAgUEBwcHFia3AgcGTBwHBYwBAlcBggFxSGgIrAEEBw4QEqUCASsWadsHCgUCBQMD7QICA3tXCUw7ugJZAwGyAUwpIwM5AwkDBQMJA5sBCw8BNxBVVBwVKhebARkBAwsQEAgEAhESAgQJEBCZATMdzgEBBwG8AQQYKSMUkAEDAwY/CTs4/wEaAUt1AwEDAQUBAgIEAwYEDx1dB2wGeBFgTQ", - "User-Agent": "Android-Finsky/7.1.15 (api=3,versionCode=80798000,sdk=23,device=angler,hardware=angler,product=angler)", + "Accept-Language": config.LANG.replace('_', '-'), + "X-DFE-Encoded-Targets": config.DFE_TARGETS, + "User-Agent": config.getUserAgent() } if self.gsfId is not None: headers["X-DFE-Device-Id"] = "{0:x}".format(self.gsfId)