Giter Club home page Giter Club logo

googleplay-api's People

Contributors

egirault avatar fuzion24 avatar kanzure avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

googleplay-api's Issues

Error retrieving information from server

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

App reviews

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!

downloading only pre-ICS app

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

Retrieve more than 250 results

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.

androproto not working

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

Error downloading app

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.

Getting error as 'Need Browser' while sign in to google play.

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

Request: Getting the category from the packagename

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?

Bug in categories.py

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.

VersionCode is empty?

when I call detail method get the details.appDetails.versionCode value always is 0,versionstring isemtpy?

Optimization for downloading

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.

search.py always returns an error message

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?

requests.py

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

Apps list returned by list.py is very incomplete

I'm comparing the list of apps returned in specific categories & sub-categories

  1. by googleplay-api, or
  2. by the Play Store app on the actual android device, or
  3. The browser-accessed web store https://play.google.com/store/apps.

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.

Google App Engine?

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.

Error downloading paid app

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

Images types and convert apps details into json

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.

How to get promotionalDescription?

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

Download errors

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?

Login

hi. i keep get this..
googleplay.LoginError : u'server says: Needs Browser

Request to add functionality

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:

  1. https://android.clients.google.com/auth
  2. https://android.clients.google.com/fdfe/details
  3. https://android.clients.google.com/fdfe/rev
  4. https://android.clients.google.com/fdfe/rec
  5. https://android.clients.google.com/fdfe/purchase
  6. https://android.clients.google.com/fdfe/delivery
  7. https://android.clients.google.com/fdfe/log

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.

  1. 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:

  1. https://android.clients.google.com/auth
  2. https://android.clients.google.com/fdfe/details
  3. https://android.clients.google.com/fdfe/rev
  4. https://android.clients.google.com/fdfe/rec
  5. https://android.clients.google.com/fdfe/purchase

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. :-)

MessageMicro is now MessageNano

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.

Download Issue

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]·♣

preFetch not hitting on logically equiv urls

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.

protobuf version

Please add a note that this package works with protobuf version 2.4 but not with versions 2.5 or 2.2.

Language / Location setting

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?

It can not working for me

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 == []

Changing Architecture

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?

offset seems to be broken in list.py

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:

  • $ python list.py BUSINESS apps_topselling_free 5 0
    Title;Package name;Creator;Super Dev;Price;Offer Type;Version Code;Size;Rating;Num Downloads
    Job Search;com.indeed.android.jobsearch;Indeed Jobs;0;Free;1;19;1.7MB;4.02;10,000,000+
    Facebook Pages Manager;com.facebook.pages.app;Facebook;1;Free;1;9490210;27.1MB;4.13;10,000,000+
    ADP Mobile Solutions;com.adpmobile.android;ADP, LLC;0;Free;1;47;6.1MB;3.97;1,000,000+
    Square Register;com.squareup;Square, Inc.;0;Free;1;365;26.1MB;4.52;5,000,000+
    Job Search - Snagajob;com.snagajob.jobseeker;Snagajob;0;Free;1;42;9.1MB;3.90;1,000,000+

The second request should return apps 6-10 of the same category, but the results are identical.

  • $ python list.py BUSINESS apps_topselling_free 5 5
    Title;Package name;Creator;Super Dev;Price;Offer Type;Version Code;Size;Rating;Num Downloads
    Job Search;com.indeed.android.jobsearch;Indeed Jobs;0;Free;1;19;1.7MB;4.02;10,000,000+
    Facebook Pages Manager;com.facebook.pages.app;Facebook;1;Free;1;9490210;27.1MB;4.13;10,000,000+
    ADP Mobile Solutions;com.adpmobile.android;ADP, LLC;0;Free;1;47;6.1MB;3.97;1,000,000+
    Square Register;com.squareup;Square, Inc.;0;Free;1;365;26.1MB;4.52;5,000,000+
    Job Search - Snagajob;com.snagajob.jobseeker;Snagajob;0;Free;1;42;9.1MB;3.90;1,000,000+

This query was constructed from the documentation presented in the project wiki (https://github.com/egirault/googleplay-api/blob/master/README.md).

How to download paid apps?

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.

Unexpected end-group tag

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.

cannot download paid apps

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

Error downloading APKS

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]"
}

Error during execution

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 ?

Unauthorized - Error 401

I am trying to use this api for a day now.

  1. First i encountered a problem when trying to call categories.py, I got this as response:
    information from server. [RH-01]
  2. Iv'e noticed that that the library used SERVICE = "androidmarket" when trying to login. which was weird because android market is dead. changed it to SERVICE = "googleplay" and the problem was gone.
  3. now im getting:
    HTML> HEAD> TITLE>Unauthorized</TITLE> /HEAD> BODY BGCOLOR="#FFFFFF" TEXT="#000000"> H1>Unauthorized</H1> H2>Error 401</H2> /BODY> HTML>
    as a response to categories.py call.

please help :)

P.S for all stages I got OK from the login call (got back auth and a token)

Error when download apk

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.

Bad download size for some apps

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

Impossible to use googleplay as a library in another project due to config.py throwing exceptions

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.

Download the most downloaded app from Google Play

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.