Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Google Play获取versionCode和VersionName_Java_Android_Google Play - Fatal编程技术网

Java 从Google Play获取versionCode和VersionName

Java 从Google Play获取versionCode和VersionName,java,android,google-play,Java,Android,Google Play,我正在寻找一种方法,如何通过PC中的java应用程序从google play获得应用程序版本代码和版本名称,并使用软件包名称。 我看到了:但它不再工作,也开始出现问题,也停止工作,它重新查询设备ID。 你能为我提供一些简单的解决方案或API吗? 非常重要,我需要versionCode和VersionName并且VersionName通过解析html google play应用程序站点相对容易获得。版本代码非常重要。没有官方的Google Play API,Playstore使用一个内部proto

我正在寻找一种方法,如何通过PC中的java应用程序从google play获得应用程序版本代码和版本名称,并使用软件包名称。 我看到了:但它不再工作,也开始出现问题,也停止工作,它重新查询设备ID。 你能为我提供一些简单的解决方案或API吗?
非常重要,我需要versionCode和VersionName并且VersionName通过解析html google play应用程序站点相对容易获得。版本代码非常重要。

没有官方的Google Play API,Playstore使用一个内部protobuf API,该API没有文档记录,也没有打开。IMHO,你可以:

  • 使用对API进行反向工程的开放源代码库
  • 废弃已提取此信息的apk下载站点(很可能通过相同的protobuf Google Play API)
请注意,有一个列表,但您不能列出您的APK、版本和应用程序。它主要用于管理应用程序分发、评论、编辑等

谷歌播放内部API 此库使用Google Play Store 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());
使用此方法:

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);
}
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'
}
废弃第三方apk下载站点 您可以从(当然是非官方的)中获取版本名和版本代码,方法是在页面上划掉所需的包名:

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));
    }
}
另一种可能性是报废:

此外,还有一个内部JSON api,但:

  • 有时它不起作用(return
    Ops,APK Downloader在尝试下载时被拒绝访问
    ),主要用于非流行应用程序
  • 它有防止刮取bot的机制(JS中生成的随机令牌,具有随机变量名)
以下内容返回带有FWIW的版本名和代码:

String packageName=“com.facebook.katana”;
字符串数据=Jsoup.connect(“https://apps.evozi.com/apk-downloader")
.userAgent(“Mozilla”)
.execute().body();
字符串标记=”;
字符串时间=”;
Pattern varPattern=Pattern.compile(“dedbadfbadc:\\s+(\\w+”);
Pattern timePattern=Pattern.compile(“t:\\s+(\\w+)”);
Matcher varMatch=varPattern.Matcher(数据);
Matcher timeMatch=timePattern.Matcher(数据);
if(varMatch.find()){
Pattern-tokenPattern=Pattern.compile(“\\s*var\\s*”+varMatch.group(1)+“\\s*=\\s*”(*)”;
Matcher-tokenMatch=tokenPattern.Matcher(数据);
if(tokenMatch.find()){
token=tokenMatch.group(1);
}
}
if(timeMatch.find()){
时间=时间匹配。组(1);
}
HttpClient HttpClient=HttpClients.createDefault();
HttpPost HttpPost=新的HttpPost(“https://api-apk.evozi.com/download");
List params=new ArrayList();
参数添加(新的BasicNameValuePair(“t”,时间));
参数add(新的BasicNameValuePair(“afedcfdcbdedcafe”,packageName));
参数add(新的BasicNameValuePair(“dedBadfBad”,token));
参数add(新的BasicNameValuePair(“fetch”、“false”);
setEntity(新的UrlEncodedFormEntity(参数,“UTF-8”);
HttpResponse response=httpclient.execute(httppost);
JsonElement元素=新的JsonParser().parse(EntityUtils.toString(response.getEntity());
JsonObject结果=element.getAsJsonObject();
if(result.has(“版本”)&&result.has(“版本代码”)){
System.out.println(“版本名:”+result.get(“版本”).getAsString());
System.out.println(“版本代码:”+result.get(“版本代码”).getAsInt());
}否则{
系统输出打印项次(结果);
}
实施 您可以在与Java应用程序直接通信的后端上实现它,这样,如果上述方法之一失败,您可以维护检索版本代码/名称的过程

如果您只对自己的应用程序感兴趣,那么更干净的解决方案是:

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

除了使用JSoup,我们还可以通过模式匹配从playStore获取应用程序版本

匹配谷歌playstore ie的最新模式
当前版本X.X.X
我们首先要匹配上面的节点序列,然后从上面的序列得到版本值。下面是相同的代码段:

    private String getAppVersion(String patternString, String inputString) {
        try{
            //Create a pattern
            Pattern pattern = Pattern.compile(patternString);
            if (null == pattern) {
                return null;
            }

            //Match the pattern string in provided string
            Matcher matcher = pattern.matcher(inputString);
            if (null != matcher && matcher.find()) {
                return matcher.group(1);
            }

        }catch (PatternSyntaxException ex) {

            ex.printStackTrace();
        }

        return null;
    }


    private String getPlayStoreAppVersion(String appUrlString) {
        final String currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>";
        final String appVersion_PatternSeq = "htlgb\">([^<]*)</s";
        String playStoreAppVersion = null;

        BufferedReader inReader = null;
        URLConnection uc = null;
        StringBuilder urlData = new StringBuilder();

        final URL url = new URL(appUrlString);
        uc = url.openConnection();
        if(uc == null) {
           return null;
        }
        uc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
        inReader = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        if (null != inReader) {
            String str = "";
            while ((str = inReader.readLine()) != null) {
                           urlData.append(str);
            }
        }

        // Get the current version pattern sequence 
        String versionString = getAppVersion (currentVersion_PatternSeq, urlData.toString());
        if(null == versionString){ 
            return null;
        }else{
            // get version from "htlgb">X.X.X</span>
            playStoreAppVersion = getAppVersion (appVersion_PatternSeq, versionString);
        }

        return playStoreAppVersion;
    }
私有字符串getAppVersion(字符串模式字符串,字符串输入字符串){
试一试{
//创建一个模式
Pattern=Pattern.compile(patternString);
if(null==模式){
返回null;
}
//匹配所提供字符串中的模式字符串
Matcher Matcher=pattern.Matcher(inputString);
if(null!=matcher&&matcher.find()){
返回匹配器组(1);
}
}捕获(模式语法异常){
例如printStackTrace();
}
返回null;
}
私有字符串getPlayStoreAppVersion(字符串appUrlString){
最终字符串currentVersion_PatternSeq=“]*?>当前\\s版本]*?>(.*?>]*?>(.*?>]*?>(.*?>]);

最终字符串appVersion_PatternSeq=“htlgb\”>([^Jsoup花费的时间太长,效率低下,简而言之,模式转换非常简单:

public class PlayStoreVersionChecker {

public String playStoreVersion = "0.0.0";

OkHttpClient client = new OkHttpClient();

private String execute(String url) throws IOException {
    okhttp3.Request request = new Request.Builder()
            .url(url)
            .build();

    Response response = client.newCall(request).execute();
    return response.body().string();
}

public String getPlayStoreVersion() {
    try {
        String html = execute("https://play.google.com/store/apps/details?id=" + APPIDHERE!!! + "&hl=en");
        Pattern blockPattern = Pattern.compile("Current Version.*([0-9]+\\.[0-9]+\\.[0-9]+)</span>");
        Matcher blockMatch = blockPattern.matcher(html);
        if(blockMatch.find()) {
            Pattern versionPattern = Pattern.compile("[0-9]+\\.[0-9]+\\.[0-9]+");
            Matcher versionMatch = versionPattern.matcher(blockMatch.group(0));
            if(versionMatch.find()) {
                playStoreVersion = versionMatch.group(0);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return playStoreVersion;
}


}
公共类PlayStoreVersionChecker{
公共字符串playStoreVersion=“0.0.0”;
OkHttpClient=新的OkHttpClient();
私家侦探
    private String getAppVersion(String patternString, String inputString) {
        try{
            //Create a pattern
            Pattern pattern = Pattern.compile(patternString);
            if (null == pattern) {
                return null;
            }

            //Match the pattern string in provided string
            Matcher matcher = pattern.matcher(inputString);
            if (null != matcher && matcher.find()) {
                return matcher.group(1);
            }

        }catch (PatternSyntaxException ex) {

            ex.printStackTrace();
        }

        return null;
    }


    private String getPlayStoreAppVersion(String appUrlString) {
        final String currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>";
        final String appVersion_PatternSeq = "htlgb\">([^<]*)</s";
        String playStoreAppVersion = null;

        BufferedReader inReader = null;
        URLConnection uc = null;
        StringBuilder urlData = new StringBuilder();

        final URL url = new URL(appUrlString);
        uc = url.openConnection();
        if(uc == null) {
           return null;
        }
        uc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
        inReader = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        if (null != inReader) {
            String str = "";
            while ((str = inReader.readLine()) != null) {
                           urlData.append(str);
            }
        }

        // Get the current version pattern sequence 
        String versionString = getAppVersion (currentVersion_PatternSeq, urlData.toString());
        if(null == versionString){ 
            return null;
        }else{
            // get version from "htlgb">X.X.X</span>
            playStoreAppVersion = getAppVersion (appVersion_PatternSeq, versionString);
        }

        return playStoreAppVersion;
    }
public class PlayStoreVersionChecker {

public String playStoreVersion = "0.0.0";

OkHttpClient client = new OkHttpClient();

private String execute(String url) throws IOException {
    okhttp3.Request request = new Request.Builder()
            .url(url)
            .build();

    Response response = client.newCall(request).execute();
    return response.body().string();
}

public String getPlayStoreVersion() {
    try {
        String html = execute("https://play.google.com/store/apps/details?id=" + APPIDHERE!!! + "&hl=en");
        Pattern blockPattern = Pattern.compile("Current Version.*([0-9]+\\.[0-9]+\\.[0-9]+)</span>");
        Matcher blockMatch = blockPattern.matcher(html);
        if(blockMatch.find()) {
            Pattern versionPattern = Pattern.compile("[0-9]+\\.[0-9]+\\.[0-9]+");
            Matcher versionMatch = versionPattern.matcher(blockMatch.group(0));
            if(versionMatch.find()) {
                playStoreVersion = versionMatch.group(0);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return playStoreVersion;
}


}
public class Store {

    private Document document;
    private final static String baseURL = "https://play.google.com/store/apps/details?id=";

    public static void main(String[] args) {

    }

    public Store(String packageName) {
        try {
            document = Jsoup.connect(baseURL + packageName).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0").get();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public String getTitle() {
        return document.select("h1.AHFaub > span").text();
    }

    public String getDeveloper() {
        return document.selectFirst("span.UAO9ie > a").text();
    }

    public String getCategory() {
        Elements elements = document.select("span.UAO9ie > a");
        for (Element element : elements) {
            if (element.hasAttr("itemprop")) {
                return element.text();
            }
        }
        return null;
    }

    public String getIcon() {
        return document.select("div.xSyT2c > img").attr("src");
    }

    public String getBigIcon() {
        return document.select("div.xSyT2c > img").attr("srcset").replace(" 2x", "");
    }

    public List<String> getScreenshots() {
        List<String> screenshots = new ArrayList<>();
        Elements img = document.select("div.u3EI9e").select("button.Q4vdJd").select("img");
        for (Element src : img) {
            if (src.hasAttr("data-src")) {
                screenshots.add(src.attr("data-src"));
            } else {
                screenshots.add(src.attr("src"));
            }
        }
        return screenshots;
    }

    public List<String> getBigScreenshots() {
        List<String> screenshots = new ArrayList<>();
        Elements img = document.select("div.u3EI9e").select("button.Q4vdJd").select("img");
        for (Element src : img) {
            if (src.hasAttr("data-src")) {
                screenshots.add(src.attr("data-srcset").replace(" 2x", ""));
            } else {
                screenshots.add(src.attr("srcset").replace(" 2x", ""));
            }
        }
        return screenshots;
    }

    public String getDescription() {
        return document.select("div.DWPxHb > span").text();
    }

    public String getRatings() {
        return document.select("div.BHMmbe").text();
    }
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;