从Google Play获取versionCode和VersionName

Dim*_*Dim 5 java android google-play

我正在寻找一种方法如何通过PC中的Java应用程序从谷歌播放应用程序版本代码和版本名称.我看到:https://androidquery.appspot.com/但它不再起作用了,https://code.google.com/archive/p/android-market-api/开始出现问题,也停止了工作,它会征服设备ID.你能帮我解决一些简单的解决方案或API吗?非常重要,我需要versionCode和VersionName,并且通过解析html google play app网站相对容易获得VersionName.versionCode非常重要.

Ber*_*tel 8

没有正式的Google Play API,Playstore使用内部protobuf API,该API未记录且未打开.恕我直言,你可以:

  • 使用反向工程API的开源库
  • 废料apk下载已经提取此信息的网站(最有可能是通过相同的protobuf Google Play API)

请注意,有一个Google Play开发人员API,但您无法列出您的apks,版本,应用.它主要用于管理应用程序分发,评论,编辑等.

谷歌播放内部API

play-store-api Java库

此库使用Google Play商店protobuf API(未记录且已关闭的API),并且需要电子邮件/密码才能生成可以重复使用以与API一起使用的令牌:

GplaySearch googlePlayInstance = new GplaySearch();

DetailsResponse response = googlePlayInstance.getDetailResponse("user@gmail.com",
        "password", "com.facebook.katana");

AppDetails appDetails = response.getDocV2().getDetails().getAppDetails();

System.out.println("version name : " + appDetails.getVersionString());
System.out.println("version code : " + appDetails.getVersionCode());
Run Code Online (Sandbox Code Playgroud)

用这种方法:

public DetailsResponse getDetailResponse(String email,
                                         String password,
                                         String packageName) throws IOException, ApiBuilderException {
    // A device definition is required to log in
    // See resources for a list of available devices
    Properties properties = new Properties();
    try {
        properties.load(getClass().getClassLoader().getSystemResourceAsStream("device-honami" +
                ".properties"));
    } catch (IOException e) {
        System.out.println("device-honami.properties not found");
        return null;
    }
    PropertiesDeviceInfoProvider deviceInfoProvider = new PropertiesDeviceInfoProvider();
    deviceInfoProvider.setProperties(properties);
    deviceInfoProvider.setLocaleString(Locale.ENGLISH.toString());

    // Provide valid google account info
    PlayStoreApiBuilder builder = new PlayStoreApiBuilder()
            .setDeviceInfoProvider(deviceInfoProvider)
            .setHttpClient(new OkHttpClientAdapter())
            .setEmail(email)
            .setPassword(password);
    GooglePlayAPI api = builder.build();

    // We are logged in now
    // Save and reuse the generated auth token and gsf id,
    // unless you want to get banned for frequent relogins
    api.getToken();
    api.getGsfId();

    // API wrapper instance is ready
    return api.details(packageName);
}
Run Code Online (Sandbox Code Playgroud)

device-honami.properties是识别设备特征所需的设备属性文件.这里有一些device.properties文件示例

OkHttpClientAdapter可以发现这里

用于运行此示例的依赖项:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
    compile 'com.github.yeriomin:play-store-api:0.19'
    compile 'com.squareup.okhttp3:okhttp:3.8.1'
}
Run Code Online (Sandbox Code Playgroud)

Scrap第三部分apk下载网站

http://apk-dl​​.com

您可以通过使用jsoup抓取页面获取所需的包名称,从http://apk-dl​​.com(当然是非官方的)获取版本名称和版本代码:

String packageName = "com.facebook.katana";

Document doc = Jsoup.connect("http://apk-dl.com/" + packageName).get();
Elements data = doc.select(".file-list .mdl-menu__item");

if (data.size() > 0) {
    System.out.println("full text : " + data.get(0).text());
    Pattern pattern = Pattern.compile("(.*)\\s+\\((\\d+)\\)");
    Matcher matcher = pattern.matcher(data.get(0).text());
    if (matcher.find()) {
        System.out.println("version name : " + matcher.group(1));
        System.out.println("version code : " + matcher.group(2));
    }
}
Run Code Online (Sandbox Code Playgroud)

https://apkpure.com

另一种可能性是废弃https://apkpure.com:

String packageName = "com.facebook.katana";

Elements data = Jsoup.connect("https://apkpure.com/search?q=" + packageName)
        .userAgent("Mozilla")
        .get().select(".search-dl .search-title a");

if (data.size() > 0) {

    Elements data2 = Jsoup.connect("https://apkpure.com" + data.attr("href"))
            .userAgent("Mozilla")
            .get().select(".faq_cat dd p");

    if (data2.size() > 0) {
        System.out.println(data2.get(0).text());

        Pattern pattern = Pattern.compile("Version:\\s+(.*)\\s+\\((\\d+)\\)");
        Matcher matcher = pattern.matcher(data2.get(0).text());
        if (matcher.find()) {
            System.out.println("version name : " + matcher.group(1));
            System.out.println("version code : " + matcher.group(2));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

https://api-apk.evozi.com

此外,https://api-apk.evozi.com有一个内部JSON API,但是:

  • 有时它不起作用(返回Ops, APK Downloader got access denied when trying to download)主要是非流行的应用程序
  • 它具有针对抓取机器人的机制(在JS中使用随机变量名生成的随机令牌)

以下是使用https://api-apk.evozi.com FWIW 返回版本名称和代码:

String packageName = "com.facebook.katana";

String data = Jsoup.connect("https://apps.evozi.com/apk-downloader")
        .userAgent("Mozilla")
        .execute().body();

String token = "";
String time = "";

Pattern varPattern = Pattern.compile("dedbadfbadc:\\s+(\\w+),");
Pattern timePattern = Pattern.compile("t:\\s+(\\w+),");

Matcher varMatch = varPattern.matcher(data);
Matcher timeMatch = timePattern.matcher(data);

if (varMatch.find()) {
    Pattern tokenPattern = Pattern.compile("\\s*var\\s*" + varMatch.group(1) + "\\s*=\\s*'(.*)'.*");
    Matcher tokenMatch = tokenPattern.matcher(data);

    if (tokenMatch.find()) {
        token = tokenMatch.group(1);
    }
}

if (timeMatch.find()) {
    time = timeMatch.group(1);
}

HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://api-apk.evozi.com/download");

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("t", time));
params.add(new BasicNameValuePair("afedcfdcbdedcafe", packageName));
params.add(new BasicNameValuePair("dedbadfbadc", token));
params.add(new BasicNameValuePair("fetch", "false"));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

HttpResponse response = httpclient.execute(httppost);

JsonElement element = new JsonParser().parse(EntityUtils.toString(response.getEntity()));
JsonObject result = element.getAsJsonObject();

if (result.has("version") && result.has("version_code")) {
    System.out.println("version name : " + result.get("version").getAsString());
    System.out.println("version code : " + result.get("version_code").getAsInt());
} else {
    System.out.println(result);
}
Run Code Online (Sandbox Code Playgroud)

履行

您可以在与您的Java应用程序直接通信的后端实现它,这样,如果上述方法之一失败,您可以维护检索版本代码/名称的过程.

如果您只对自己的应用感兴趣,那么更清洁的解决方案是:

  • 设置后端,该后端将存储您当前的所有应用版本名称/版本代码
  • 贵公司的所有开发人员/发布者都可以共享发布任务(gradle任务),该任务将使用Google Play开发人员API发布apk,该gradle任务将包括调用后端以在应用程序中存储版本代码/版本名称条目发表.主要目标是通过存储应用程序元数据来自动化整个出版物.