egirault / googleplay-api Goto Github PK
View Code? Open in Web Editor NEWGoogle Play Unofficial Python API - This project was a PoC and is not maintained anymore. Please feel free to fork it and improve it in any way.
Google Play Unofficial Python API - This project was a PoC and is not maintained anymore. Please feel free to fork it and improve it in any way.
This is a question or feature request rather than a bug report.
Current implementation get the downloadURL from a query
message = self.executeRequestApi2(path, data) url = message.payload.buyResponse.purchaseStatusResponse.appDeliveryData.downloadUrl
this will hit google play every time when we download a single app.
In the case I use this to enumerate the google play and download free apps one by one, the google server will throttle our searches and block googleplay-api.
Is there a way to craft the downloadURL since we already know the packagename and authtoken and cookie?
My tcpdump shows that the downloadURL has consistent format but different token for each app.
The preFetch urls returned by ResponseWrapper have the ctr= param before the cat param, eg
list?c=3&ctr=apps_topselling_paid&cat=BOOKS_AND_REFERENCE
The urls now built by GooglePlayAPI.list() now append those params in the opposite order. As a result, these urls never hit in the preFetch cache and the data returned in the original request is wasted.
A complicated fix would be to check urls for equality in a way which understands that the order of params is often irrelevant. A simpler fix is to change list() to append these specific params in the same order that Google's servers apparently prefer.
hello, I'm try to use this API but each time after command "python search.py 'angry'" receive error:
Title;Package name;Creator;Super Dev;Price;Offer Type;Version Code;Size;Rating;Num Downloads
Traceback (most recent call last):
File "search.py", line 41, in
doc = message.doc[0]
File "build\bdist.win32\egg\google\protobuf\internal\containers.py", line 64, in getitem
IndexError: list index out of range
Could you please help me with it ?
The previous androproto.py relied on the parent class that implemented protobuf fields to be of type MessageMicro. I changed the strings "MessageMicro" to "MessageNano". I got some output for some fields, but most of the object definitions were blank. I think the script needs to be relooked at, otherwise we will have to look at smali code to find fields.
I'm comparing the list of apps returned in specific categories & sub-categories
2 and 3 are identical in content and order, and covers 500 topmost apps in most categories.
1 is a very short subset of the full list, skipping some 80% of the first 25 apps and all of the tail. The largest list in any category&subcategory is 16 apps. I don't see a pattern to which apps are getting skipped. It does not seem to be affected by content-maturity level.
Categories.py seems non-working anymore, issuing HTTP 500 error (oO)
Traceback (most recent call last):
File "categories.py", line 15, in
response = api.browse()
File "/home/virtualabs/playstore/googleplay-api/googleplay.py", line 209, in browse
message = self.executeRequestApi2(path)
File "/home/virtualabs/playstore/googleplay-api/googleplay.py", line 165, in executeRequestApi2
data = urllib2.urlopen(request).read()
File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.6/urllib2.py", line 397, in open
response = meth(req, response)
File "/usr/lib/python2.6/urllib2.py", line 510, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.6/urllib2.py", line 435, in error
return self._call_chain(_args)
File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
result = func(_args)
File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 500: Internal Server Error
Launched from my laptop connected to the Internet through my phone.
Please add a note that this package works with protobuf version 2.4 but not with versions 2.5 or 2.2.
Is there any info available on imageType and what does supportsFifeUrlOptions means?
Is it possible to download app icon from api.details method?
I am trying to convert response from api.details(appPackage)
to json by using json.dumps()
function but I am getting json serialization error. I am new to python any help will be greatly appreciated.
Hi,
I'm trying to do a simple search, "python search.py earth", but get this response:
Title;Package name;Creator;Super Dev;Price;Offer Type;Version Code;Size;Rating;Num Downloads
Traceback (most recent call last):
File "search.py", line 39, in
doc = message.doc[0]
File "C:\Program Files\Python 2.6\lib\site-packages\google\protobuf\internal\containers.py", line 64, in getitem
return self._values[key]
IndexError: list index out of range
Any other action also either fails or return no results.
Looking closer at the message details (with python debugger), it seems this is what is returned from google play:
{displayErrorMessage: "Error retrieving information from server. [DF-DFERH-01]"}
With some searching on the web, it seems this error is not uncommon, but the cause for it is very unclear. Anyone else have any experience with this error?
Thanks,
Audun
Anybody else had trouble running this library on the GAE? I've got it working great locally, but once I deploy the same code is giving me a ConnectionError: ('Connection aborted.', error(13, 'Permission denied')) when I attempt api.login().
I'm thinking maybe this api is being blocked on the GAE, just wondering if others are getting the same result.
Hi,
I am getting issue while trying to sign in into google account. I have automated script to download the apk file from Google Play store. The script was running fine till last week. But, recently getting error as Need Browser. Bellow is the error -
Exception in thread "main" com.akdeniz.googleplaycrawler.GooglePlayException: Error=NeedsBrowser
Url=https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&continue=https%3A%2F%2Faccounts.google.com%2Fo%2Fandroid%2Fauth%3Fhl%3Den_us%26xoauth_display_name%3DAndroid%2BLogin%2BService%26source%3DAndroid%2BLogin&plt=AKgnsbvpYOFQNYD02v2gawgW73Qa_H9ymB1OhI6mqifo1tfMndMaVWA6wyfuVSN94w4003Kc6lz9gJ51fjnAY97fXoMvEHTlV0AqVIwRpHNwcNMS50dFsO7e7dveFv-8HhJRvfDHHruJy7MJH-Gq808p3U_LANxN0g0irHHDcf3o4TjFQC1GHpg2abYrIkPYuea4qVhzHgN2gI7tduYeFF7VTSLhQ-SQIHWLmgMhnfrTGMBsgWUPN7w
ErrorDetail=To access your account, you must sign in on the web. Touch Next to start browser sign-in.
at com.akdeniz.googleplaycrawler.GooglePlayAPI.executeHttpRequest(GooglePlayAPI.java:522)
at com.akdeniz.googleplaycrawler.GooglePlayAPI.executePost(GooglePlayAPI.java:482)
at com.akdeniz.googleplaycrawler.GooglePlayAPI.executePost(GooglePlayAPI.java:462)
at com.akdeniz.googleplaycrawler.GooglePlayAPI.loginAC2DM(GooglePlayAPI.java:180)
at com.akdeniz.googleplaycrawler.GooglePlayAPI.checkin(GooglePlayAPI.java:160)
at com.info.playservice.GooglePlayService.createService(GooglePlayService.scala:49)
at com.info.playservice.GooglePlayService.loginToPlayService(GooglePlayService.scala:79)
at com.info.playservice.GooglePlayService.(GooglePlayService.scala:36)
at com.info.boot.free.BootFreeApps$delayedInit$body.apply(BootFreeAppsSelenium.scala:24)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:71)
at scala.App$$anonfun$main$1.apply(App.scala:71)
at scala.collection.immutable.List.foreach(List.scala:318)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32)
at scala.App$class.main(App.scala:71)
at com.info.boot.free.BootFreeApps$.main(BootFreeAppsSelenium.scala:20)
at com.info.boot.free.BootFreeApps.main(BootFreeAppsSelenium.scala)
Currently, I am using googleplaycrawler-0.3.jar to download apk files from play store. Can you please help me to resolve this issue.
Thanks,
Sayali
Hi! Thanks once more for making this possible. I managed to port it partially to PHP ( koconder/android-market-api-php#12 (comment) ) but was wondering where the app reviews data lurks... I don't get it back in the "details" request, however there is an empty "userReview" field there... might be a bug in the PHP protobuf implementation or something else entirely... any pointers appreciated!
The offset seems to be broken in the list.py functionality. See snippets below for example:
The first request should return results 1-5 of the app selling free apps in the business category:
The second request should return apps 6-10 of the same category, but the results are identical.
This query was constructed from the documentation presented in the project wiki (https://github.com/egirault/googleplay-api/blob/master/README.md).
I know there's a cap of 100 results per search, but after playing around with things for a bit, it seems it only will ever return 250 total results. Is there any way to increase this amount, or does google limit searches to a total of 250 results?
No matter what I put in for a search, it will not return anything if you use an offset of 250.
I am getting errors when downloading a non-free application from the app store using download.py
My account is funded with cash and should be able to download the application. I have actually already purchased the application using the normal google play store methods so that shouldn't be the hangup either.
Is this a bug?
[xxx@mobile-shell-1]$ python download.py com.qo.android.am3
Downloading 12.3MB...
Traceback (most recent call last):
File "download.py", line 38, in
data = api.download(packagename, vc, ot)
File "/home/xxx/source/trunk/yyyy/googleplay.py", line 252, in download
cookie = message.payload.buyResponse.purchaseStatusResponse.appDeliveryData.downloadAuthCookie[0]
File "build/bdist.linux-x86_64/egg/google/protobuf/internal/containers.py", line 64, in getitem
IndexError: list index out of range
I'm getting the following error when I call any script with different (right) parameters:
File "search.py", line 33, in
message = api.search(request, nb_res, offset)
File "/Users/rankor/src/3rd-party/python/googleplay-api/googleplay.py", line 190, in search
message = self.executeRequestApi2(path)
File "/Users/rankor/src/3rd-party/python/googleplay-api/googleplay.py", line 171, in executeRequestApi2
message = googleplay_pb2.ResponseWrapper.FromString(data)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 583, in FromString
message.MergeFromString(s)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 844, in MergeFromString
raise message_mod.DecodeError('Unexpected end-group tag.')
google.protobuf.message.DecodeError: Unexpected end-group tag.
Hey - Isn't download.py works for downloading country resricted apps?
when I call detail method get the details.appDetails.versionCode value always is 0,versionstring isemtpy?
hi,
i got the following error when trying downloading paid app from google play store:
Traceback (most recent call last):
File "download.py", line 43, in
data = api.download(packagename, vc, ot)
File "/home/zxia10x/free/googleplay.py", line 261, in download
cookie = message.payload.buyResponse.purchaseStatusResponse.appDeliveryData.downloadAuthCookie[0]
File "/usr/lib/python2.7/dist-packages/google/protobuf/internal/containers.py", line 64, in getitem
return self._values[key]
IndexError: list index out of range
it seems that the the format of messages are different between paid and free.
so, would you please fix it?
thanks
for example:
$python lookup.py com.zeptolab.ctr.ads
then will retrive all relative info on https://play.google.com/store/apps/details?id=com.zeptolab.ctr.ads
I'm trying to use GooglePlayAPI from the googleplay module as a library in another project, and when I try to create an instance of GooglePlayAPI (with an android ID passed in the constructor) I get an exception from config.py that I didn't edit it.
Eventually I had to edit config.py and remove the test there, as it made it impossible to start multiple instances of GooglePlayAPI with different device IDs.
Either load config.py only from the command line tools, or allow some option to disable this exception when using GooglePlayAPI from another program.
Seems non-working (again).
$ python search.py "angry birds"
Error: something went wrong. Maybe the nb_res you specified was too big?
$ python search.py "angry birds" 10
Error: something went wrong. Maybe the nb_res you specified was too big?
Hi,
Thank you for developing such an awesome tool!
I'm trying to use your androproto to extract the proto in the GoogleServiceFramework.odex(4.1 version) but androguard seems not be able to solve the "invoke-virtual-quick/vtable" bytecode, then it can't find the "read/set" pair. Any idea?
Regards,
Eong
Hey, this is a great project, thanks.
permissions.py with multi packagenames is not work
api.bulkDetails return multi empty entry
hi. i keep get this..
googleplay.LoginError : u'server says: Needs Browser
I am trying to use this api for a day now.
HTML> HEAD> TITLE>Unauthorized</TITLE> /HEAD> BODY BGCOLOR="#FFFFFF" TEXT="#000000"> H1>Unauthorized</H1> H2>Error 401</H2> /BODY> HTML>
please help :)
P.S for all stages I got OK from the login call (got back auth and a token)
Hi!
Looks like the displayed size for some packages is wrong:
Downloading app: com.gameloft.android.ANMP.GloftR3HM with id: xyz
Downloading 857.4MB... Done
Downloading app: com.gameloft.android.ANMP.GloftR2HM with id: xyz
Downloading 467.8MB... Done
The apps above are fortunately not as big as that :) (around 21M)
This is a minor bug.
I suppose that in the code, the size format is corrupt or incorrect:
print "Downloading %s..." % sizeof_fmt(doc.details.appDetails.installationSize),
Regards
Some applications such as snapchat are unavailable, how can we download them?
We've been using and reading your googleplay java api, and it works perfectly well in downloading an app from the play store. We were trying to go a step further and see if those downloads could also lead to an increase in install numbers on the play store. But that didn't happen, and in order to make that happen:
We observed the following requests when Gplay market downloads an app:
Apart from these, there was another request, the following, which was being sent at random times. This contained a Base64 encoded string which, as far as we could apprehend had Authtoken, logging id(constant for a device), device_id(gsf_id for the device), and a string that had list of package names installed which we think are protobuffed and we couldn't figure out.
https://android.clients.google.com/market/api/ApiRequest
Here is the trace for one such request :
POST https://android.clients.google.com/market/api/ApiRequest HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
User-Agent: Android-Market/2
X-Public-Android-Id: 6532b095d0193d17
Content-Length: 7183
Host: android.clients.google.com
Connection: Keep-Alive
version=2&request=CuMCCosCRFFBQUFMb0FBQURjQnUxX1JmM3pfYzhhMnpLbmhMamh3UmVpVUxiUDl1YTNheEEwalVyWTBwSW9ieTZNTFNmdlc1MUNnTkhReGN2cTBVek1tZkI0M1R5UnFCSWtwLXZ4UDhRYkFnLTVXTFhYZTVDS0I4U2xRa1Q2QXlPVFQyQlpaTk4zRWJlZTB6SGdlODlYX1JqamtSWkRJMklROFJMSEdQTi10WmNwMmhGZGZVWVY5Wkl2UzIzYjA4RHR4Z09PWXdvZkFCTjJRYU53UW9oN2NsdFlVQkVuTktLMlVLT0RTTGVVZ3E4V2kxYXBnZEFlTzIydElubmgyRGNWRldpaGVGVXlCZG94cnFnEAEYlbuhJiIQMzdhYWVjZDk0YmExNWVjNSoLdmJveDg2dHA6MTYyAmVuOgJVU0IASgBSAFoAYgphbS11bmtub3duahEtNjg2ZTVjZWMyZmZjMjM3MhNKkicTGiR2Mjpjb20ubGlvbWlpLndhdGVyLnB1enpsZS5sb2dpYzoxOjMgAiizvp3Spyg6HWNvbS5saW9taWkud2F0ZXIucHV6emxlLmxvZ2ljQAMUExoddjI6Y29tLnRlc3RhcHAuaGFzb2ZmZXJzNjoxOjMgAiizvp3Spyg6FmNvbS50ZXN0YXBwLmhhc29mZmVyczZAAxQTGh52MjptZS5zb3VuZHdhdmUuc291bmR3YXZlOjE6OTAgAiizvp3Spyg6Fm1lLnNvdW5kd2F2ZS5zb3VuZHdhdmVAWhRTWgdhbmRyb2lkYBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWhRjb20uYW5kcm9WTS52bWNvbmZpZ2ABahtKeGx1T0d1SFhuYXQ5d0RuNm9Ua3h1N2pQZm9UU1oZY29tLmFuZHJvaWQuYmFja3VwY29uZmlybWAQahtKeGx1T0d1SFhuYXQ5d0RuNm9Ua3h1N2pQZm9UU1oVY29tLmFuZHJvaWQuYmx1ZXRvb3RoYBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWhNjb20uYW5kcm9pZC5icm93c2VyYBBqG1llMDNmb1hUaHFqZjdtdUdTOWhiQ19xbHI0RVRTWhdjb20uYW5kcm9pZC5jYWxjdWxhdG9yMmAQahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUU1oUY29tLmFuZHJvaWQuY2FsZW5kYXJgEGobWWUwM2ZvWFRocWpmN211R1M5aGJDX3FscjRFVFNaEmNvbS5hbmRyb2lkLmNhbWVyYWABahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUU1oZY29tLmFuZHJvaWQuY2VydGluc3RhbGxlcmAQahtKeGx1T0d1SFhuYXQ5d0RuNm9Ua3h1N2pQZm9UU1oUY29tLmFuZHJvaWQuY29udGFjdHNgEGobV3phTV95MmlhR21XdkpYcXdaRHFwUFZqRC1VVFNaGGNvbS5hbmRyb2lkLmRlZmNvbnRhaW5lcmAQahtKeGx1T0d1SFhuYXQ5d0RuNm9Ua3h1N2pQZm9UU1oVY29tLmFuZHJvaWQuZGVza2Nsb2NrYMsBahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUU1oRY29tLmFuZHJvaWQuZW1haWxgkIMZahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUU1oUY29tLmFuZHJvaWQuZXhjaGFuZ2VgoMIeahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUU1oTY29tLmFuZHJvaWQuZ2FsYXh5NGABahtXemFNX3kyaWFHbVd2Slhxd1pEcXBQVmpELVVUU1oTY29tLmFuZHJvaWQuZ2FsbGVyeWAQaht0NTMwcUM2UXRYNm5aU1dyY0Rlckk0cEM5ZE1UU1oWY29tLmFuZHJvaWQuaHRtbHZpZXdlcmAQahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUU1oYY29tLmFuZHJvaWQuaW5wdXRkZXZpY2VzYBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWh1jb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbmAQahtXemFNX3kyaWFHbVd2Slhxd1pEcXBQVmpELVVUU1oeY29tLmFuZHJvaWQuaW5wdXRtZXRob2QucGlueWluYBBqG1d6YU1feTJpYUdtV3ZKWHF3WkRxcFBWakQtVVRTWhRjb20uYW5kcm9pZC5rZXljaGFpbmAQahtKeGx1T0d1SFhuYXQ5d0RuNm9Ua3h1N2pQZm9UU1oUY29tLmFuZHJvaWQubGF1bmNoZXJgEGobV3phTV95MmlhR21XdkpYcXdaRHFwUFZqRC1VVFNaJGNvbS5hbmRyb2lkLmxpdmV3YWxscGFwZXIubWljcm9iZXNnbGAPahtuRUZ5bEhHeWtQeUxJQXZQWXRLVWQtc1lHdWtUU1oWY29tLmFuZHJvaWQubWFnaWNzbW9rZWAQahtXemFNX3kyaWFHbVd2Slhxd1pEcXBQVmpELVVUU1oPY29tLmFuZHJvaWQubW1zYBBqG1llMDNmb1hUaHFqZjdtdUdTOWhiQ19xbHI0RVRTWhFjb20uYW5kcm9pZC5tdXNpY2AQahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUU1oTY29tLmFuZHJvaWQubXVzaWNmeGCgUWobWWUwM2ZvWFRocWpmN211R1M5aGJDX3FscjRFVFNaFGNvbS5hbmRyb2lkLm11c2ljdmlzYBBqG1d6YU1feTJpYUdtV3ZKWHF3WkRxcFBWakQtVVRTWhZjb20uYW5kcm9pZC5ub2lzZWZpZWxkYAFqG1d6YU1feTJpYUdtV3ZKWHF3WkRxcFBWakQtVVRTWhxjb20uYW5kcm9pZC5wYWNrYWdlaW5zdGFsbGVyYBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWhVjb20uYW5kcm9pZC5waGFzZWJlYW1gAWobV3phTV95MmlhR21XdkpYcXdaRHFwUFZqRC1VVFNaEWNvbS5hbmRyb2lkLnBob25lYBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWiJjb20uYW5kcm9pZC5wcm92aWRlcnMuYXBwbGljYXRpb25zYBBqG1d6YU1feTJpYUdtV3ZKWHF3WkRxcFBWakQtVVRTWh5jb20uYW5kcm9pZC5wcm92aWRlcnMuY2FsZW5kYXJgEGobWWUwM2ZvWFRocWpmN211R1M5aGJDX3FscjRFVFNaHmNvbS5hbmRyb2lkLnByb3ZpZGVycy5jb250YWN0c2AQahtXemFNX3kyaWFHbVd2Slhxd1pEcXBQVmpELVVUU1ofY29tLmFuZHJvaWQucHJvdmlkZXJzLmRvd25sb2Fkc2AQaht0NTMwcUM2UXRYNm5aU1dyY0Rlckk0cEM5ZE1UU1oiY29tLmFuZHJvaWQucHJvdmlkZXJzLmRvd25sb2Fkcy51aWAQaht0NTMwcUM2UXRYNm5aU1dyY0Rlckk0cEM5ZE1UU1oZY29tLmFuZHJvaWQucHJvdmlkZXJzLmRybWAQaht0NTMwcUM2UXRYNm5aU1dyY0Rlckk0cEM5ZE1UU1obY29tLmFuZHJvaWQucHJvdmlkZXJzLm1lZGlhYP0Daht0NTMwcUM2UXRYNm5aU1dyY0Rlckk0cEM5ZE1UU1oeY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzYBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWh9jb20uYW5kcm9pZC5wcm92aWRlcnMudGVsZXBob255YBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWiRjb20uYW5kcm9pZC5wcm92aWRlcnMudXNlcmRpY3Rpb25hcnlgEGobV3phTV95MmlhR21XdkpYcXdaRHFwUFZqRC1VVFNaFWNvbS5hbmRyb2lkLnByb3Zpc2lvbmAQahtKeGx1T0d1SFhuYXQ5d0RuNm9Ua3h1N2pQZm9UU1oUY29tLmFuZHJvaWQuc2V0dGluZ3NgEGobSnhsdU9HdUhYbmF0OXdEbjZvVGt4dTdqUGZvVFNaH2NvbS5hbmRyb2lkLnNoYXJlZHN0b3JhZ2ViYWNrdXBgEGobSnhsdU9HdUhYbmF0OXdEbjZvVGt4dTdqUGZvVFNaE2NvbS5hbmRyb2lkLnNtc3B1c2hgEGobWWUwM2ZvWFRocWpmN211R1M5aGJDX3FscjRFVFNaGWNvbS5hbmRyb2lkLnNvdW5kcmVjb3JkZXJgEGobWWUwM2ZvWFRocWpmN211R1M5aGJDX3FscjRFVFNaFGNvbS5hbmRyb2lkLnN5c3RlbXVpYBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWhNjb20uYW5kcm9pZC52ZW5kaW5nYJW7oSZqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWhdjb20uYW5kcm9pZC52aWRlb2VkaXRvcmALahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUU1oXY29tLmFuZHJvaWQudm9pY2VkaWFsZXJgEGobWWUwM2ZvWFRocWpmN211R1M5aGJDX3FscjRFVFNaFmNvbS5hbmRyb2lkLnZwbmRpYWxvZ3NgEGobSnhsdU9HdUhYbmF0OXdEbjZvVGt4dTdqUGZvVFNaFWNvbS5hbmRyb2lkLndhbGxwYXBlcmAQahtXemFNX3kyaWFHbVd2Slhxd1pEcXBQVmpELVVUU1ogY29tLmFuZHJvaWQud2FsbHBhcGVyLmhvbG9zcGlyYWxgEGobV3phTV95MmlhR21XdkpYcXdaRHFwUFZqRC1VVFNaIGNvbS5hbmRyb2lkLndhbGxwYXBlci5saXZlcGlja2VyYBBqG0p4bHVPR3VIWG5hdDl3RG42b1RreHU3alBmb1RTWhtjb20uY3lhbm9nZW5tb2QuZmlsZW1hbmFnZXJgZWobSnhsdU9HdUhYbmF0OXdEbjZvVGt4dTdqUGZvVFNaHWNvbS5leGFtcGxlLmFuZHJvaWQubGl2ZWN1YmVzYBBqG1llMDNmb1hUaHFqZjdtdUdTOWhiQ19xbHI0RVRTWiljb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5nZW5pZS5nZW5pZXdpZGdldGCfCmobSkxza3dGNUg0Szc2YUtXS2RtRjUyYllUcGdBVFNaIGNvbS5nb29nbGUuYW5kcm9pZC5hcHBzLnVwbG9hZGVyYMC4AmobT0pHS1JUMEhHWk5VLUxHYThGN0dWaXp0VjRnVFNaGWNvbS5nb29nbGUuYW5kcm9pZC5iYWNrdXBgEGobSnhsdU9HdUhYbmF0OXdEbjZvVGt4dTdqUGZvVFNaG2NvbS5nb29nbGUuYW5kcm9pZC5mZWVkYmFja2AQahtPSkdLUlQwSEdaTlUtTEdhOEY3R1ZpenRWNGdUU1onY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZXF1aWNrc2VhcmNoYm94YIC5x19qG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWhZjb20uZ29vZ2xlLmFuZHJvaWQuZ3NmYBBqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWhxjb20uZ29vZ2xlLmFuZHJvaWQuZ3NmLmxvZ2luYBBqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWhtjb20uZ29vZ2xlLmFuZHJvaWQubG9jYXRpb25g1ghqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWiJjb20uZ29vZ2xlLmFuZHJvaWQubWFydmluLnRhbGtiYWNrYERqG20wSk1MU2V0VWFRcU0zNEx0cGtjZHV5a1JHRVRTWiVjb20uZ29vZ2xlLmFuZHJvaWQub25ldGltZWluaXRpYWxpemVyYBBqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWh9jb20uZ29vZ2xlLmFuZHJvaWQucGFydG5lcnNldHVwYBBqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWh5jb20uZ29vZ2xlLmFuZHJvaWQuc2V0dXB3aXphcmRgggFqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWiljb20uZ29vZ2xlLmFuZHJvaWQuc3luY2FkYXB0ZXJzLmJvb2ttYXJrc2AQahtPSkdLUlQwSEdaTlUtTEdhOEY3R1ZpenRWNGdUU1ooY29tLmdvb2dsZS5hbmRyb2lkLnN5bmNhZGFwdGVycy5jYWxlbmRhcmAPahtPSkdLUlQwSEdaTlUtTEdhOEY3R1ZpenRWNGdUU1ooY29tLmdvb2dsZS5hbmRyb2lkLnN5bmNhZGFwdGVycy5jb250YWN0c2AQahtPSkdLUlQwSEdaTlUtTEdhOEY3R1ZpenRWNGdUU1oXY29tLmdvb2dsZS5hbmRyb2lkLnRhbGtgygJqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWhZjb20uZ29vZ2xlLmFuZHJvaWQudHRzYBBqG09KR0tSVDBIR1pOVS1MR2E4RjdHVml6dFY0Z1RTWh5jb20uZ29vZ2xlLmFuZHJvaWQudm9pY2VzZWFyY2hggJL0AWobT0pHS1JUMEhHWk5VLUxHYThGN0dWaXp0VjRnVFNaF2NvbS5ub3NodWZvdS5hbmRyb2lkLnN1YC9qG1h4RV93c0lLZkp2WktCa2lhaktoa0V0MTc0c1RTWg1jb20uc3ZveC5waWNvYAFqG1llMDNmb1hUaHFqZjdtdUdTOWhiQ19xbHI0RVRTWhRjb20udGYudGhpbmtkcm9pZC5zZ2DnswpqGzl2UVlPS0QyS3ozMTViZVJfXy1iYlZ4OG1aY1RTWhdqcC5jby5vbXJvbnNvZnQub3BlbndubmAQahtZZTAzZm9YVGhxamY3bXVHUzloYkNfcWxyNEVUcAQU&
Your code simulates the following 5 requests:
After using your functions for the above requests we tried to simulate the following requests ourselves:
-https://android.clients.google.com/fdfe/log
This request contains a protobuffed string(as per our understanding) which seems to be some kind of a confirmation for downloading the app to the device.
This is how the string looks: = ( 4confirmFreeDownload?doc=com.google.android.apps.maps
-https://android.clients.google.com/market/api/ApiRequest
We tried to construct the Base64 encoded string, and the protobuffed string for apps that are installed on a particular device, but recieved a 400 response
We replicated a request sent by a Device without changes but we got 400 response.
(We could not figure out how to get the logging_id as well.)
We need help in reconstructing the same request, and understanding how the the data being sent in the request is formed so that we can figure out the last three requests and complete the install cycle.
Any help would be highly appreciated since you're the ultimate authority on this. :-)
I try to get reviews from an app but response just have content and title without author name. How do i get it ?
Hello,
I use the API and when I ran the command: python download.py com.google.android.gm
I got the following error message:
Downloading 2.3MB...
Traceback (most recent call last):
File "download.py", line 38, in
data = api.download(packagename, vc, ot)
File "/Users/guest/Desktop/googleplay2/googleplay.py", line 252, in download
cookie = message.payload.buyResponse.purchaseStatusResponse.appDeliveryData.downloadAuthCookie[0]
File "/Users/guest/Desktop/googleplay2/google/protobuf/internal/containers.py", line 67, in getitem
return self._values[key]
IndexError: list index out of range
Any idea how i can resolve this issue? Thanks.
Is it possible to set the architecture when downloading an apk? I used an emulator to get an android device id and therefor my downloaded apks are for x86, not arm. Is there a way to fix this?
Hey,
I am not able to get some apps in the google play search because my server location is of somewhere in us. Is there any way to do that?
I have tried to download APK's with the API.
./download.py com.ideashower.readitlater.pro
for an example.
in my config.py I added email , password and Android ID.
and the traceback is:
authSubToken: DQAAAMYAAABKwzq7PQ19uuKFxs5ZA5Qt6o7XdP5YyxnpXqczDJpVe-EjR4BYDYiBX8ZCABV2FAJs_8IHgF7FC0vcWzbJfZkoj_j_lpr-njXu8oPyx5RTmnqgx95BAjTBMWui-iqfnT1N9jgEy5r0KKVS7GERdr_Tobsj_LW4cpnnwjeJT8VZf79bMjPTtdVe7p0rsUQyfB0lTIqWOHDv1YXtMc5zFcr7nEohw7vu5_udMVxIYU0RVsnPkuH78Y-TVimRS--xU6BcLvxJ-Zy8QQF5QVwJ3F-5_HdkQs
Downloading 0.0bytes...
Traceback (most recent call last):
File "download.py", line 37, in
data = api.download(packagename, vc, ot)
File "/home/me/tools/PlayStoreDownloader/python-api/googleplay.py", line 268, in download
cookie = message.payload.buyResponse.purchaseStatusResponse.appDeliveryData.downloadAuthCookie[0]
File "/usr/lib/python2.7/dist-packages/google/protobuf/internal/containers.py", line 64, in getitem
return self._values[key]
IndexError: list index out of range
I tried to debug it a bit, I saw the returning version code is 0 instead of certain number, but I failed even when I tried to enter it manually.
When debugging it:
vc = 0 (Version Code)
ot = 1 (Offer Type)
which is not really reasonable.
if I will find the solution I will post it. does anyone knows the problem?
Printed message from download function:
commands {
displayErrorMessage: "Error retrieving information from server. [RPC:S-5:AEC-0]"
}
The ANDROID_ID field in config.py needs to be your GSF key (not your Android Device ID as one might intuitively assume).
How to get your GSF key:
http://myandroidmyview.blogspot.com/2014/02/gsfkey.html
Hi,
So I have two issues, the first one is on downloading apps, I have setup my android id, email and password properly I can login to the googleplay api but when I try to download an app I get this error message:
File "/root/Desktop/ares-downloader/googleplay-api-master/googleplay.py", line 267, in download
cookie = message.payload.buyResponse.purchaseStatusResponse.appDeliveryData.downloadAuthCookie[0]
File "/usr/local/lib/python2.7/dist-packages/protobuf-2.6.1-py2.7.egg/google/protobuf/internal/containers.py", line 64, in getitem
return self._values[key]
IndexError: list index out of range
When I printed the message that I got from googleplay server I got this which seems to be good I suppose:
payload {
buyResponse {
CheckoutInfo {
item {
name: "Minecraft - Pocket Edition"
amount {
micros: 69000000
currencyCode: "SEK"
formattedAmount: "SEK69.00"
}
}
deprecatedCheckoutUrl: "https://checkout.google.com"
addInstrumentUrl: "https://checkout.google.com/customer/gadget/tablet/newinstrument.html?continue=https://android.clients.google.com/fdfe/purchase?doc%3Dcom.mojang.minecraftpe&cartId=12999763169054705758.1354774077524690&hl=en"
eligibleInstrumentFamily: 0
eligibleInstrument {
instrumentFamily: 0
}
}
continueViaUrl: "https://checkout.google.com/customer/gadget/tablet/newinstrument.html?continue=https://android.clients.google.com/fdfe/purchase?doc%3Dcom.mojang.minecraftpe&cartId=12999763169054705758.1354774077524690&hl=en"
checkoutServiceId: "sierra"
baseCheckoutUrl: "https://checkout.google.com"
purchaseCookie: "CAE"
}
}
Where this error can come from?
Hi,
This is a question then a bug. I just noticed that for login we use
https://android.clients.google.com/auth
instead of
https://www.google.com/accounts/ClientLogin
which is used in other projects...
Could you please brief me about the difference between them or point me to some documentation about it.
Many thanks,
Can you create an API to get application info?
More info such as description, images link...
Thank you
python search.py earth
Traceback (most recent call last):
File "search.py", line 10, in
from googleplay import GooglePlayAPI
File "/home/user/googleplay/googleplay-api-master/googleplay.py", line 7, in
import requests
ImportError: No module named requests
Google recently forced everyone writing a review to use their Google+ profile. I think the current .proto lacks this and doesn't return it in the "rev" API call. Could you please analyze the latest store APK and add this?
http://www.androidpolice.com/2012/11/17/download-latest-google-play-store-3-10-9/
Thanks! :)
I am wondering whether there is a parameter to config the googleplay-api to download ICS apps
a quick test is
download.py com.google.android.gm
only download the version 2.3.6 gmail,
How can I download the 4.1.6 version which is for ICS?
Thank
Is there a way to retrieve the short promotional text? For example, visiting the play store app on an Android phone, and search for Skype. The app detail page contain the promotional text "Skype video and voice calls, instant messaging and cheap international calls". Note that it's not the first sentence of the app description.
Looking at the .proto file, ExtendedInfo.promotionalDescription seems to contain this information. However, I don't know how to construct a valid request.
Thanks
Hi,
When I'm trying to download an app, I get the following error message:
File "download.py", line 38, in
data = api.download(packagename, vc, ot)
File "/home/renzo/Desktop/googleplay-api-master/googleplay.py", line 272, in download
cookie = message.payload.buyResponse.purchaseStatusResponse.appDeliveryData.downloadAuthCookie[0]
File "/usr/local/lib/python2.7/dist-packages/google/protobuf/internal/containers.py", line 64, in getitem
return self._values[key]
IndexError: list index out of range
The server response is the following:
Downloading 3.8MB... commands {
displayErrorMessage: "Error retrieving information from server. [RPC:S-7:AEC-0 N344-2BTF-3CL5Q]"
}
I only get this error with the download method..., and the android device ID is correct.
Any idea how I can solve the RPC:S-7:AEC-0 error?
Thanks.
Hi,
I was wondering if there is a way to download the most downloaded apps from google play.
For example sort them by "numDownloads" in decreasing order and get the first 10000.
Thanks.
Best,
Simone
Next is the error info:
googleplay-api michael$ python search.py earth
Title;Package name;Creator;Super Dev;Price;Offer Type;Version Code;Size;Rating;Num Downloads
Traceback (most recent call last):
File "search.py", line 39, in <module>
doc = message.doc[0]
File "/usr/local/Cellar/python/2.7.8_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/protobuf/internal/containers.py", line 64, in __getitem__
return self._values[key]
IndexError: list index out of range
the message.doc == []
Since the results vary from location to location, it would be an advantage to have the option to over-steer your configuration of France/French.
If not with an option, at leas with a global variable in the config.py.
What's your idea about that?
This looks great, but there's one feature that I'm missing. I don't see a way to get the app's category by giving the packagename. I see how to get the permissions and search for it but not the category. Maybe I'm missing something?
Is there any way to download paid apps??. .
I'm getting index out of bound exception when i try to download paid apps, but when i download free apps it downloads it fine.
I have google wallet associated with my account.
Login Error: googleplay.LoginError: u'server says: ServerError'
Is the login url down?
https://android.clients.google.com/auth
How to fix it? Thanks.
I am able to Register my Email Creds, Able to Checkin
But when i am trying to download, i am getting an error
Error retrieving information from server. [RPC:S-5:AEC-0]·♣
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.