import json import os import threading from pychrysalide import core from pychrysalide.analysis.contents import MemoryContent from pychrysalide.plugins.gplay import PlayStore, AndroidDevice if __name__ == "__main__": core.set_verbosity(0) assert('bacon' in AndroidDevice.list_available_models()) dev = AndroidDevice('bacon') MyPlayStore = PlayStore if not(os.path.isfile('playstore.cfg')): user = os.getenv('USER') password = os.getenv('PASSWORD') store = PlayStore(dev, user, password) cfg = { 'dev_id': store.device_id, 'auth_token': store.auth_token, 'dev_token': store.device_token, } with open('playstore.cfg', 'w') as fd: json.dump(cfg, fd, indent=' ') else: with open('playstore.cfg', 'r') as fd: cfg = json.load(fd) store = PlayStore(dev, dev_id=cfg['dev_id'], auth_token=cfg['auth_token'], dev_token=cfg['dev_token']) _take_ownership = None ret = store.login() if ret: pkg_name = 'org.mozilla.firefox' details = store.get_package_details(pkg_name) pkg_version = details.version_code def _on_downloaded(_store, _content, _event): if not(_content is None): # As the content is allocated from another thread, # transfer ownership to the main thread in order # to avoid deadlock when Python tries to free this content global _take_ownership _take_ownership = _content with open('%s-%u.apk' % (pkg_name, pkg_version), 'wb') as fd: fd.write(_content.data) else: core.log_message(core.LogMessageType.EXT_ERROR, 'Error while downloading the APK file') _event.set() event = threading.Event() store.connect('downloaded', _on_downloaded, event) store.download_package(pkg_name, pkg_version) event.wait()