Signed-off-by: Domenico Iezzi <domenico.iezzi.201@gmail.com>
This commit is contained in:
Domenico Iezzi 2017-10-07 18:21:05 +02:00
parent 3529c3c736
commit ed0c926dc5
2 changed files with 61 additions and 17 deletions

View File

@ -405,9 +405,43 @@ class GooglePlayAPI(object):
message = self.executeRequestApi2(path)
return message.payload.reviewResponse
def delivery(self, packageName, versionCode,
offerType=1, downloadToken=None):
"""Download an already purchased app.
packageName is the app unique ID (usually starting with 'com.').
versionCode can be grabbed by using the details() method on the given
app."""
path = "delivery"
params = { 'ot': str(offerType),
'doc': packageName,
'vc': str(versionCode) }
headers = self.getDefaultHeaders()
if downloadToken is not None:
params['dtok'] = downloadToken
url = "https://android.clients.google.com/fdfe/%s" % path
response = requests.get(url, headers=headers,
params=params, verify=ssl_verify)
resObj = googleplay_pb2.ResponseWrapper.FromString(response.content)
if resObj.commands.displayErrorMessage != "":
raise RequestError(resObj.commands.displayErrorMessage)
elif resObj.payload.deliveryResponse.appDeliveryData.downloadUrl == "":
raise RequestError('App not purchased')
else:
downloadUrl = resObj.payload.deliveryResponse.appDeliveryData.downloadUrl
cookie = resObj.payload.deliveryResponse.appDeliveryData.downloadAuthCookie[0]
cookies = {
str(cookie.name): str(cookie.value)
}
return requests.get(downloadUrl, headers=headers,
cookies=cookies, verify=ssl_verify).content
def download(self, packageName, versionCode,
offerType=1, progress_bar=False):
"""Download an app and return its raw data (APK file).
offerType=1):
"""Download an app and return its raw data (APK file). Free apps need
to be "purchased" first, in order to retrieve the download cookie.
If you want to download an already purchased app, use *delivery* method.
packageName is the app unique ID (usually starting with 'com.').
@ -433,17 +467,6 @@ class GooglePlayAPI(object):
raise RequestError(resObj.commands.displayErrorMessage)
else:
dlToken = resObj.payload.buyResponse.downloadToken
path = "delivery"
params['dtok'] = dlToken
url = "https://android.clients.google.com/fdfe/%s" % path
response = requests.get(url, headers=headers,
params=params, verify=ssl_verify)
resObj = googleplay_pb2.ResponseWrapper.FromString(response.content)
downloadUrl = resObj.payload.deliveryResponse.appDeliveryData.downloadUrl
cookie = resObj.payload.deliveryResponse.appDeliveryData.downloadAuthCookie[0]
cookies = {
str(cookie.name): str(cookie.value)
}
return requests.get(downloadUrl, headers=headers,
cookies=cookies, verify=ssl_verify).content
return self.delivery(packageName, versionCode,
offerType, dlToken)

25
test.py
View File

@ -1,4 +1,4 @@
from gpapi.googleplay import GooglePlayAPI
from gpapi.googleplay import GooglePlayAPI, RequestError
import sys
@ -32,7 +32,6 @@ for a in apps:
print(a['docId'])
# DOWNLOAD
docid = apps[0]['docId']
version = apps[0]['versionCode']
print('\nTermux docid is: %s\n' % docid)
@ -43,6 +42,28 @@ with open(docid + '.apk', 'wb') as f:
print('\nDownload successful\n')
f.close()
# DOWNLOAD APP NOT PURCHASED
# Attempting to download Nova Launcher Prime
# it should throw an error 'App Not Purchased'
errorThrown = False
try:
app = server.search('nova launcher prime', 3, None)
app = filter(lambda x: x['docId'] == 'com.teslacoilsw.launcher.prime', app)
app = list(app)[0]
fl = server.download(app['docId'], app['versionCode'])
with open(docid + '.apk', 'wb') as f:
f.write(fl)
print('\nDownload successful\n')
f.close()
except RequestError as e:
errorThrown = True
if not errorThrown:
print('Download of previous app should have failed')
sys.exit(1)
# BULK DETAILS
print('\nGetting details for %s\n' % testApps[0])