예제 #1
0
def apps(appid):
    global config, market, operator

    request = AssetRequest(appid, market.token, config['device'], operator, config['devname'], config['sdklevel'])
    url, market_da = market.get_asset(request.encode())

    generator, size = Util.download_apk_stream(appid, url, market_da)
    return Response(response=generator, headers={'Content-Length': size})
예제 #2
0
def apps(appid):
    global config, market, operator

    request = AssetRequest(appid, market.token, config['device'], operator,
                           config['devname'], config['sdklevel'])
    url, market_da = market.get_asset(request.encode())

    generator, size = Util.download_apk_stream(appid, url, market_da)
    return Response(response=generator, headers={'Content-Length': size})
예제 #3
0
    def apps(self, appid):
        request = AssetRequest(appid, market.token, config['device'], operator, config['devname'], config['sdklevel'])
        try:
            url, market_da = market.get_asset(request.encode())
        except:
            self.send_response(403)
            self.end_headers()
            self.wfile.write(traceback.format_exc().encode('utf-8'))
            return

        generator, size = Util.download_apk_stream(appid, url, market_da)

        self.send_response(200)
        self.send_header('Content-Length', size)
        self.end_headers()
        for data in generator:
            self.wfile.write(data)
예제 #4
0
def download(package,
             email,
             password,
             country,
             operator,
             device,
             path='/tmp',
             devname='passion',
             sdklevel=19):
    try:
        if not package:
            raise ValueError('No package')
        market = Market(email, password)
        market.login()
        operator = Operator(country, operator)
        request = AssetRequest(package, market.token, device, operator,
                               devname, sdklevel)
        (url, market_da) = market.get_asset(request.encode())
        Util.download_apk(package, url, market_da, path)
        return True
    except:
        return False
def main():
        print("\n\tGooglePlay Downloader - Directly download apks from GooglePlay to your PC.\n" +
              "\tCopyleft Simone Margaritelli <*****@*****.**>\n" +
              "\thttp://www.evilsocket.net\n\n")

        defaults = {
            'email': None,
            'password': None,
            'package': None,
            'country': None,
            'operator': None,
            'device': None,
            'sdklevel': '19',
            'devname': 'hammerhead',
            'dry_run': False
        }

        usage = """usage: %prog [options]

EXAMPLE:
        %prog --email [email protected] --password your-password --name com.arttech.xbugsfree --country "Italy" --operator "3" --device your-device-id
"""
        parser = ExtendedOptionParser(defaults=defaults, usage=usage)

        parser.add_option_with_default("-e", "--email", action="store", dest="email", help="Your android account email.")
        parser.add_option_with_default("-p", "--password", action="store", dest="password", help="Your android account password.")
        parser.add_option_with_default("-n", "--name", action="store", dest="package", help="Package identifier (com.something.name).")
        parser.add_option_with_default("-c", "--country", action="store", dest="country", help="Your country.")
        parser.add_option_with_default("-o", "--operator", action="store", dest="operator", help="Your phone operator.")
        parser.add_option_with_default("-d", "--device", action="store", dest="device", help="Your device ID (can be obtained with this app https://play.google.com/store/apps/details?id=com.redphx.deviceid) .")
        parser.add_option_with_default("-s", "--sdklevel", action="store", dest="sdklevel", help="Android SDK API level (default is 19 like Android 4.4).")
        parser.add_option_with_default("-m", "--devname", action="store", dest="devname", help="Device name (default 'passion' like HTC Passion aka Google Nexus One.")
        parser.add_option_with_default("-t", "--dry-run", action="store_true", dest="dry_run", help="Test only, a.k.a. dry run")
        parser.add_option_with_default("--proxy", action="store", dest="proxy", default=None, help="Proxy server to use. Use the form user:pass@host:port")
        parser.add_option_with_default("--proxy-auth-digest", action="store_true", default=None, dest="proxy_auth_digest", help="Use digest authentication in proxies. Default is basic authentication")
        parser.add_option("-f", "--config", action="store", dest="config", default=None, help="Load additional settings from the specified config file. Parameters in this file always overwrite command line settings.")

        (o, args) = parser.parse_args()

        option_pool = {}

        for key in defaults:
            option_pool[key] = getattr(o, key)

        if o.config is not None:
            config = json.loads(open(o.config, 'rb').read().decode('utf-8'))
            for key in config:
                # in Python 2.x, json results are unicode
                option_pool[key] = str(config[key])

        if option_pool['email'] is None:
            print("No email specified.")

        elif option_pool['password'] is None:
            print("No password specified.")

        elif option_pool['package'] is None:
            print("No package specified.")

        elif option_pool['country'] is None or option_pool['country'] not in Operator.OPERATORS:
            print("Empty or invalid country specified, choose from: \n\n" + ", ".join(Operator.OPERATORS.keys()))

        elif option_pool['operator'] is None or option_pool['operator'] not in Operator.OPERATORS[option_pool['country']]:
            print("Empty or invalid operator specified, choose from: \n\n" + ", ".join(Operator.OPERATORS[option_pool['country']].keys()))

        elif option_pool['device'] is None:
            print("No device id specified.")

        elif int(option_pool['sdklevel']) < 2:
            print("The SDK API level cannot be less than 2.")

        else:
            if option_pool['proxy']:
                set_default_proxy(
                    option_pool['proxy'],
                    'digest' if option_pool['proxy_auth_digest'] else 'basic')
            print("@ Logging in ...")

            market = Market(option_pool['email'], option_pool['password'])
            market.login()

            print("@ Requesting package ...")

            operator = Operator(option_pool['country'], option_pool['operator'])

            request = AssetRequest(option_pool['package'], market.token, option_pool['device'], operator, option_pool['devname'], int(option_pool['sdklevel']))
            (url, market_da) = market.get_asset(request.encode())

            if not option_pool['dry_run']:
                print("@ Downloading...\n")

                Util.download_apk(option_pool['package'], url, market_da)