精华内容
下载资源
问答
  • 下载谷歌play应用App Signing by Google Play has been around since 2017. With App Signing, Google manages your app signing keys and uses it to sign your APKs for distribution. Enrolling your app in App ...

    下载谷歌play应用

    App Signing by Google Play has been around since 2017. With App Signing, Google manages your app signing keys and uses it to sign your APKs for distribution. Enrolling your app in App Signing is optional. You might have decided to handle the signing and storage of your keys instead of uploading them to Google Play.

    自2017年以来,由Google Play进行的应用签名已存在。通过应用签名,Google可以管理您的应用签名密钥,并使用它来对您的APK进行分发。 将应用程序注册到应用程序签名是可选的。 您可能已决定处理密钥的签名和存储,而不是将其上传到Google Play。

    Now, you have changed your mind and want Google to manage your signing keys instead of doing it personally. Or you want to try to reduce your app’s size and simplify the release process with Android App Bundle but you are required to use App Signing for it. So how can you opt-in your existing apps to App Signing?

    现在,您已经改变了主意,希望Google管理您的签名密钥,而不是亲自执行。 或者,您想尝试通过Android App Bundle减小应用程序的大小并简化发布过程,但需要使用App Signing。 那么,如何才能选择将现有应用加入“应用签名”呢?

    Opting in to app signing by Google Play

    选择通过Google Play进行应用签名

    Before enrolling your app to App Signing by Google Play, there are two things you need to know. First, there is no opt out so make sure that you are ready for it. Also, you won’t be able to download your app signing keys from Google Play so if you would need it in the future, store them somewhere safe.

    在将您的应用注册到Google Play应用签名之前,您需要了解两点。 首先,没有退出选择,因此请确保您已经准备好了。 此外,您将无法从Google Play下载应用签名密钥,因此,如果将来需要它,请将其存放在安全的地方。

    To enroll your app in App Signing, you need to upload your app signing key to Google Play. Open your app in the Google Play Console and navigate to Release Management > App Signing (Release > Setup > App Signing in the New Google Play Console). Read and accept the Terms of Service.

    要将您的应用注册到应用签名中,您需要将应用签名密钥上传到Google Play。 在Google Play控制台中打开您的应用,然后导航至发布管理 > 应用签名 (在新的Google Play控制台中, 发布 > 设置 > 应用签名 )。 阅读并接受服务条款。

    There are three options to export and upload your app signing key: from Android Studio, from a Java keystore, and from your key (if you’re not using a Java keystore).

    可以使用以下三个选项来导出和上载应用程序签名密钥:从Android Studio,从Java密钥库和从密钥(如果您不使用Java密钥库)。

    Export and upload a key from Android Studio

    从Android Studio导出和上传密钥

    Using Android Studio is the easiest way to to export your app signing key. Open the Build menu, then click Build > Generate Signed Bundle / APK… In the Generate Signed Bundle or APK dialog, select Android App Bundle then click Next. Select Export encrypted key for enrolling published apps in Google Play App Signing, set the location where you want to export it, then click Next. Android Studio will generate the bundle and export the private_key.pepk in the directory you provided.

    使用Android Studio是导出应用签名密钥的最简单方法。 打开“构建”菜单,然后单击“ 构建” >“ 生成签名的捆绑包/ APK…”。在“生成签名的捆绑包或APK”对话框中,选择“ Android App Bundle”,然后单击“ 下一步” 。 选择导出加密密钥以在Google Play应用签名中注册已发布的应用程序,设置导出位置,然后单击下一步。 Android Studio将生成捆绑包,并将导出的private_key.pepk导出到您提供的目录中。

    Image for post
    Export encrypted key with Android Studio
    使用Android Studio导出加密密钥

    In the Google Play Console App Signing page, select “Export and upload a key from Android Studio” and upload the key Android Studio generated.

    在Google Play控制台应用签名页面中,选择“ 从Android Studio导出并上传密钥 ”,然后上传生成的Android Studio密钥。

    Export and upload a key from a Java Keystore

    从Java密钥库导出和上传密钥

    If you’re using a Java keystore to sign your apps, select the “Export and upload a key from a Java keystore” in the Google Play Console App Signing page. Download the Play Encrypt Private Key (PEPK) tool from the console and save it in your preferred location. Also, take note of the encryption key in the instructions.

    如果您使用Java密钥库对应用进行签名,请在Google Play控制台应用签名页面中选择“从Java密钥库导出并上传密钥”。 从控制台下载“播放加密私钥(PEPK)”工具,并将其保存在您的首选位置。 另外,请注意说明中的加密密钥。

    The PEPK tool is a JAR file that allows you to export and encrypt your app signing key. For example, if you have the following:* the PEPK tool in /Users/admin/Downloads* app signing key signing-key.jks that has “release” as the alias, located in the same folder as the pepk.jar* encrypted key from the Google Play console with the value encryptionkeyfromtheconsole

    PEPK工具是一个JAR文件,可用于导出和加密应用程序签名密钥。 例如,如果您具有以下内容:* / Users / admin / Downloads *应用程序签名密钥signing-key.jks中的PEPK工具,其别名为“ release”,与pepk.jar *位于相同的文件夹中来自Google Play控制台的密钥,其值来自控制台

    you can export the key to encryptedkey.pepk using the following command:

    您可以使用以下命令将密钥导出到cryptokey.pepk

    java -jar /Users/admin/Downloads/pepk.jar — keystore=signing-key.jks — alias=release — output=/Users/admin/Downloads/encryptedkey.pepk — encryptionkey=encryptionkeyfromtheconsole

    java -jar /Users/admin/Downloads/pepk.jar — keystore = signing-key.jks —别名= release — output = / Users / admin / Downloads / encryptedkey.pepk —加密密钥=来自控制台的加密密钥

    The terminal will ask you for the keystore and key password. Once you input them, the command will generate the encryptedkey.pepk file in the /Users/admin/Downloads/ directory. In the Google Play Console App Signing page, select “Export and upload a key from Java keystore” and upload the encryptedkey.pepk file.

    终端会要求您提供密钥库和密钥密码。 输入它们后,该命令将在/ Users / admin / Downloads /目录中生成cryptokey.pepk文件。 在Google Play控制台应用签名页面中,选择“ 从Java密钥库导出并上传密钥 ”,然后上传加密的key.pepk文件。

    Export and upload a key (not using a Java keystore)

    导出和上传密钥(不使用Java密钥库)

    If your app signing key wasn’t made using a Java keystore, select the “Export and upload a key (not using a Java keystore)” option in the Google Play Console App Signing page. You can download the PEPK tool source code and use the hex encoded public key provided in the console to export your private key.

    如果您的应用签名密钥不是使用Java密钥库创建的,请在Google Play控制台应用签名页面中选择“导出并上传密钥(不使用Java密钥库)”选项。 您可以下载PEPK工具源代码,并使用控制台中提供的十六进制编码的公共密钥来导出您的私有密钥。

    In the Google Play Console App Signing page, select “Export and upload a key (not using Java Keystore)” and upload the key you exported.

    在Google Play控制台应用签名页面中,选择“ 导出并上传密钥(不使用Java密钥库) ”,然后上传导出的密钥。

    Creating an Upload Key

    创建一个上传密钥

    An upload key is the key you will use to sign your app bundle or APK before publishing it on Google Play. You can use the same signing key as the upload key so your process will be the same as what you were doing before. However, it is better to use a different upload key so the app signing key won’t be compromised.

    上传密钥是用于在您的应用包或APK发布到Google Play之前对其进行签名的密钥。 您可以使用与上载密钥相同的签名密钥,这样您的过程将与之前相同。 但是,最好使用其他上传密钥,这样应用签名密钥不会受到损害。

    To create an upload key for your app, you need to create a new signing key and upload its public certificate (in PEM format). You can create a new key in Android Studio. In the Build menu, click Build > Generate Signed Bundle / APK… In the Generate Signed Bundle or APK dialog, select either Android App Bundle or APK, then click Next. Click the Create new… button below the Key store path input text. Provide the information in the New Key Store dialog then click OK.

    要为您的应用创建上传密钥,您需要创建一个新的签名密钥并上传其公共证书(PEM格式)。 您可以在Android Studio中创建新密钥。 在“ 构建”菜单中,单击“ 构建” >“ 生成签名的捆绑包/ APK”。在“生成签名的捆绑包或APK”对话框中,选择“ Android App Bundle”或“ APK”,然后单击“ 下一步” 。 单击密钥存储路径输入文本下方的创建新…按钮。 在“新密钥存储”对话框中提供信息,然后单击“ 确定”

    Image for post
    Generating New Key Store from Android Studio 从Android Studio生成新密钥库

    Let’s say your new upload key is upload-key.jks with “alias” as the alias, you can export its key to upload-cert.pem by running the following command:

    假设您的新上传密钥是“ alias”作为别名的upload-key.jks ,您可以通过运行以下命令将其密钥导出到upload-cert.pem

    keytool -export -rfc -keystore upload-key.jks -alias alias -file upload-cert.pem

    keytool -export -rfc -keystore upload-key.jks -alias别名-file upload-cert.pem

    The terminal will ask you for the keystore password. Once you provide it successfully, the command will generate the upload-cert.pem file. You can then upload this PEM file in the Google Play Console. Now, you must sign the next app updates with the upload-key.jks upload key.

    终端将要求您提供密钥库密码。 成功提供后,该命令将生成upload-cert.pem文件。 然后,您可以在Google Play控制台中上传此PEM文件。 现在,您必须使用upload-key.jks上载密钥对下一个应用程序更新进行签名。

    What’s Next?

    下一步是什么?

    Once you have uploaded the app signing key (and created a new upload key), you can click the Finish button (Save in the New Google Play Console) to save the changes. You will see a notification that App Signing is now enabled for the app. You can now use Android App Bundle in publishing your next update.

    一旦你已经上传的应用程序签名密钥(并创造新的上传键),您可以单击Finish按钮( 保存在新的谷歌游戏控制台)以保存更改。 您将看到一条通知,通知您现已为该应用程序启用了“应用程序签名”。 现在,您可以使用Android App Bundle发布下一个更新。

    The App Signing page will also display the certificates for the app signing key and upload key, along with their key signatures (MD5, SHA-1, SHA-256), which you will need to use for some APIs.

    “应用程序签名”页面还将显示应用程序签名密钥和上载密钥的证书,以及它们的密钥签名(MD5,SHA-1,SHA-256),您需要在某些API中使用它们。

    翻译自: https://proandroiddev.com/opting-in-existing-apps-to-google-play-app-signing-19239853b57f

    下载谷歌play应用

    展开全文
  • Recently, we update this tool, since Google changes the class names used in Google Play site. We will keep upgrading this tool once Google makes changes on Google Play site. Contact
  • 谷歌商店 接入应用内评价demo,找了一遍CSDN没找到自己实现了一个 博客文章链接:https://blog.csdn.net/t1446242775/article/details/109256073
  • 两表中的数据共包含应用数据10841行,评论数据64163行。 APP数据表包含列:软件名、软件类别、评分、评论数、软件大小、安装数、收费类型、价格、类型标签、最近更新日期、当前版本号、安卓版本号(系统最低要求)。...
  • 仿 GooglePlay 应用商城

    2018-08-15 23:04:06
    仿 GooglePlay 应用商城,使用 MVP + RxJava + Retrofit + Dagger2
  • 一个油猴脚本:Direct download from Google Play 它会直接帮你显示几个下载源,点击就可以直接从第三方下载了,非常方便 然后复制脚本代码到如图所示,再点击保存即可启用~ 脚本代码 // ==UserScript== ...

    利用脚本下载

    一个油猴脚本:Direct download from Google Play

    它会直接帮你显示几个下载源,点击就可以直接从第三方下载了,非常方便

    然后复制脚本代码到如图所示,再点击保存即可启用~

    脚本代码

    // ==UserScript==
    // @name         Direct download from Google Play
    // @namespace    StephenP
    // @version      2.8.2
    // @description  Adds APK-DL, APKPure, APKCombo, APKMirror and Evozi download buttons to Google Play when browsing apps. This script is based on yurenchen's "google play apk downloader".
    // @author       StephenP
    // @icon https://play.google.com/favicon.ico
    // @match        https://play.google.com/*
    // @match        http://play.google.com/*
    // @match        http://apkfind.com/store/captcha?app=*
    // @grant        GM.xmlHttpRequest
    // @grant        GM.download
    // @require      https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
    // @connect      self
    // @connect      apkpure.com
    // @connect      apkfind.com
    // @connect      apk-cloud.com
    // @connect      winudf.com
    // @connect      apkcombo.com
    // @connect      gpudf.down-apk.com
    // @connect      play.googleapis.com
    // @connect      gvt1.com
    // ==/UserScript==
    var ui;
    var wlButton;
    var pageURL;
    var title;
    var appCwiz;
    var done=[0];
    var useGS=false;
    (function() {
      if(document.location.href.includes("apkfind")===true){
        setInterval(unredirect,100);
      }
      else{
        try{
          'use strict';
          var site=window.location.href.toString();
          ui=checkUI();
          pageURL=location.href;
          if(ui>0){
          	title=document.getElementById("main-title").innerHTML;
          }
          if(ui>=3){
            var buttonsStyle=document.createElement("style");
            var styleString='.ddlButton:visited{color: white;} .ddlButton:hover{opacity: 0.8;} .ddlButton:active{opacity: 0.6;} .ddlButton{color: white; border-radius: 4px; border: 1px; font-size: 14px; height: 46px; padding: 9px 20px; font-weight: 500; font-family: "Roboto",sans-serif; position: relative; text-align: center; line-height: 46px;';
            if(ui==3){
              styleString+=' margin-right: 4px;}';
              buttonsStyle.innerHTML=styleString;
            }
            if(ui==4){
              styleString+=' margin-left: 4px;}';
              buttonsStyle.innerHTML=styleString;
            }
            document.body.appendChild(buttonsStyle);
          }
          if(pageURL.includes("details?id=")){
            addButtons();
          }
          setInterval(checkReload, 2000);
        }
        catch(err){
          console.log("main(): "+err);
        }
    	}
    })();
    function unredirect(){
        var tot=document.body.children.length-1;
        if(parseInt(document.body.children[tot].style.zIndex, 10)>2){
          if(document.body.children[tot].id==""){
            document.body.children[tot].style.zIndex="1";
            document.body.children[tot-1].style.zIndex="-1000";
          }
          else{
            document.body.children[tot].style.zIndex="-1000";
          }
        }
    }
    function waitForRemovingButtons(){
        //if(title!=document.getElementById("main-title").innerHTML){
      	if((pageURL!=location.href)||(isButtonVisible()===false)){
            title=document.getElementById("main-title").innerHTML;
            pageURL=location.href;
            wlButton=null;
            if(location.href.includes("details?id=")){
                if((ui>=3)&&(document.getElementsByClassName("ddlButton").length>0)){
                  	try{
                    	removePreviousCwiz();
                    }
                  	catch(err){
                      console.log(err+"; I was probably just trying to remove buttons that weren't there...");
                    }
                }
                addButtons();
            }
        }
        else{
            setTimeout(waitForRemovingButtons, 1000);
        }
    }
    function checkReload(){
        if((pageURL!=location.href)||(isButtonVisible()===false)){
                waitForRemovingButtons();
        }
    }
    function isButtonVisible(){
      var allButtons=document.getElementsByClassName("ddlButton");
      //console.log("how many buttons: "+allButtons.length);
      if(allButtons.length>0){
        for(var i=0;i<allButtons.length;i++){
          if(allButtons[i].offsetParent!=null){
            //console.log(i+true);
            return true;
          }
        }
        //console.log(i+false);
        return false;
      }
      else{
        if(document.location.href.includes("play.google.com/store/apps/details")){
          console.log("apppage//"+false);
          return false;
        }
        //console.log("notapppage//"+false);
        return true;
      }
    }
    function addButtons(){
        var price=-1;
        var installButton=null;
        var instWishButtons=[];
        if((ui<=2)&&(ui>0)){
            installButton=document.getElementsByClassName("buy")[0];
          	try{
            	price=installButton.firstElementChild.firstElementChild.getElementsByTagName("META")[1].content;
              //alert("Price: "+price);
            }
            catch(err){
              console.error("Price not found. Maybe the app is already installed?");
              price=0;
            }
        }
        else if(ui>2){
            instWishButtons=getUglyUIButtons();
            if(ui==3){
            	installButton=instWishButtons[0];
            }
            else{
              installButton=instWishButtons[1];
              if((typeof installButton==='undefined')||(!installButton.getAttribute("data-item-id").includes(location.search.match(/id=(.*)/)[1].split("&", 1)))){//Condition 1: if the app is installed, the whishlist button is absent, so the install button is the first and only.
                installButton=instWishButtons[0];              //Condition 2: if the app is not yet released, there is only a wishlist button.
              }
            }
            do{
                installButton=installButton.parentNode;
            }while(installButton.tagName!="C-WIZ");
            try{
          		price=installButton.firstElementChild.firstElementChild.getElementsByTagName("META")[1].content;
              //alert("Price: "+price);
            }
          	catch(err){
              console.error("Price not found. Maybe the app is already installed?");
              price=0;
            }
            //determina c-wiz dell'app per poterlo radere al suolo al cambio di pagina
            var currentNode;
            currentNode=installButton.parentNode;
            do{
                if(currentNode.tagName=="C-WIZ"){
                    appCwiz=currentNode;
                }
                currentNode=currentNode.parentNode;
            }while(currentNode.tagName!="BODY");
        }
      	else{
          document.getElementById("search-section").lastChild.remove();
          document.getElementById("search-section").innerHTML+='<span style="margin-top: 32px; float: left">or search on </span><span><a href="https://www.apkmirror.com/?post_type=app_release&searchtype=apk&s='+location.search.match(/id=(.*)/)[1].split("&", 1)+'" class="rounded" style="background-color: #FF8B14; font-weight: bold; text-decoration: none; padding: 1em; margin: 17px; float: left; color: white;">APKMirror</a></span><div style="clear:both"></div>';
        }
            if(price==0){
                var html;
                var buttonslist;
                var id=location.search.match(/id=(.*)/)[1].split("&", 1);
                var apkpureURL='https://m.apkpure.com/genericApp/'+id+'/download';
                var evoziURL='https://apps.evozi.com/apk-downloader/?id='+id;
                var apkdlURL='http://apkfind.com/store/download?id='+id;
                var apkmirrorURL='https://www.apkmirror.com/?post_type=app_release&searchtype=apk&s='+id;
                var apkleecherURL='https://apkleecher.com/download/dl.php?dl='+id;
                var apkcomboURL='https://apkcombo.com/genericApp/'+id+'/download/apk';
                wlButton = document.createDocumentFragment();
                var wishListButton;
                if(ui<=2){
                    wishListButton=document.getElementsByClassName("id-wishlist-display")[0];
                }
                else{
                  if(typeof instWishButtons[1]!=='undefined'){
                    wishListButton=instWishButtons[0];
                    do{
                        wishListButton=wishListButton.parentNode;
                    }while(wishListButton.tagName!="C-WIZ");
                  }
                }
                if(ui==1){
                    buttonslist = document.getElementsByClassName("details-actions")[0];
                    html='<span id="apkdlbutton"><a style="background-color: #009688" class="medium play-button download-apk-button apps ">APK&#x2011;DL</a></span><span id="apkpurebutton"><a style="background-color: #24cd77" class="medium play-button download-apk-button apps ">APKPure</a></span><span id="apkcombobutton"><a style="background-color: #00875f" class="medium play-button download-apk-button apps ">APKCombo</a></span><br><span><a href="'+evoziURL+'" style="background-color: #286090" class="medium play-button download-apk-button apps ">Evozi</a></span><span><a href="'+apkmirrorURL+'" style="background-color: #FF8B14" class="medium play-button download-apk-button apps ">APKMirror</a></span><br><input type="checkbox" id="useGoogleServers" name="useGoogleServers" value="useGoogleServers"/>Use Google\'s servers when downloading from APKCombo';
                }
                else if(ui==2){
                    buttonslist = document.getElementsByClassName("details-actions-right")[0];
                    html='<span id="apkdlbutton"><a style="background-color: #009688" class="large play-button download-apk-button apps ">APK&#x2011;DL</a></span><span id="apkpurebutton"><a style="background-color: #24cd77" class="large play-button download-apk-button apps ">APKPure</a></span><span id="apkcombobutton"><a style="background-color: #00875f" class="large play-button download-apk-button apps ">APKCombo</a></span><br><span><a href="'+evoziURL+'" style="background-color: #286090" class="large play-button download-apk-button apps ">Evozi</a></span><span><a href="'+apkmirrorURL+'" style="background-color: #FF8B14" class="large play-button download-apk-button apps ">APKMirror</a></span><br><input type="checkbox" id="useGoogleServers" name="useGoogleServers" value="useGoogleServers"/>Use Google\'s servers when downloading from APKCombo';
                }
                else{
                    buttonslist = installButton.parentNode;
                    html='<span id="apkdlbutton"><a style="background-color: #009688" class="ddlButton">APK&#x2011;DL</a></span><span id="apkpurebutton"><a style="background-color: #24cd77" class="ddlButton">APKPure</a></span><span id="apkcombobutton"><a style="background-color: #00875f" class="ddlButton">APKCombo</a></span><br><span><a href="'+evoziURL+'" style="background-color: #286090" class="ddlButton">Evozi</a></span><span><a href="'+apkmirrorURL+'" style="background-color: #FF8B14" class="ddlButton">APKMirror</a></span><br><input type="checkbox" id="useGoogleServers" name="useGoogleServers" value="useGoogleServers"/>Use Google\'s servers when downloading from APKCombo';
                }
                if(ui<=2){
                  wlButton.appendChild(wishListButton);
                }
                else{
                  if(typeof wishListButton!=='undefined'){
                  	wlButton.appendChild(wishListButton.firstChild.firstChild);
                  }
                }
                buttonslist.innerHTML=buttonslist.innerHTML+html;
                buttonslist.appendChild(wlButton);
    
                var ddlButton1=document.getElementById("apkdlbutton");
                ddlButton1.onclick=function(){ddl(this,apkdlURL);};
              	var ddlButton2=document.getElementById("apkpurebutton");
                ddlButton2.onclick=function(){ddl(this,apkpureURL);};
              	var ddlButton3=document.getElementById("apkcombobutton");
                ddlButton3.onclick=function(){ddl(this,apkcomboURL);};
              	document.getElementById("useGoogleServers").checked=useGS;
            }
    }
    function openLink(link){
      window.open(link.replace("http://","https://"),"_self");
    }
    function ddlFinalApk(link,ddlButton,i){
      if(link!=""){
         done[i]=0;
         GM.xmlHttpRequest({
            method: "GET",
            url: link,
            timeout: 5000,
            ontimeout: function(response) {
              if(done[i]==0){
                ddlButton.firstChild.innerHTML="Retry";
              }
              else{
                done[i]=0;
              }
            },
           onprogress: function(response){
              //console.log(response.finalUrl);
             if((response.finalUrl.includes("winudf.com"))||(response.finalUrl.includes("down-apk.com"))||(response.finalUrl.includes("/play-apps-download-default/"))){
               if(done[i]==0){
                 console.log("downloading file n."+i);
                 done[i]=1;
                 if(link.includes("apkpure")){
                   window.open(response.finalUrl,"_self");
                   ddlButton.onclick=function(){openLink(response.finalUrl);};
                   ddlButton.firstChild.innerHTML="Ready!";
                 }
                 else{
                   window.open(response.finalUrl,i);
                   ddlButton.firstChild.innerHTML="APKCombo";
                 }
               }
             }
            },
           	onload: function(response){
           		if(done[i]==0){
                ddlButton.firstChild.innerHTML="Retry";
              }
              else{
                done[i]=0;
              }
         		},
          	onerror: function(){
               buttonError(ddlButton,"Offline!");
             }
          });
       }
       else{
         buttonError(ddlButton,"Failed!");
       }
    }
    function ddl(ddlButton,ddlURL){
        ddlButton.firstChild.innerHTML="Loading...";
      	if(ddlURL.includes("apkfind")){
          try {
            var apkDlRequest1=GM.xmlHttpRequest({
                  method: "GET",
                  url: ddlURL,
                  onload: function(response) {
                      if(response.finalUrl.includes("/captcha?")){
                          ddlButton.firstChild.setAttribute("href",response.finalUrl);
                          ddlButton.firstChild.innerHTML="CAPTCHA";
                          ddlButton.onclick=null;
                      }
                      else if(response.finalUrl.includes("app/removed")){
                          buttonError(ddlButton,"Removed!");
                      }
                      else{
                          try{
                            	var linkIntermediary = document.createElement("html");
                              linkIntermediary.innerHTML=response.response;
                              var link="http:"+linkIntermediary.getElementsByClassName("mdl-button")[0].getAttribute("href");
                              ddlButton.firstChild.innerHTML="Ready!";
                              openLink(link);
                            	ddlButton.onclick=function(){openLink(link);};
    
                          }
                          catch(err){
                              buttonError(ddlButton,"Failed!");
                              console.log(err);
                          }
                      }
                  },
              		onerror: function(){
                    buttonError(ddlButton,"Offline!");
                  }
            });
          }
          catch (err) {
            buttonError(ddlButton,"Failed!");
            console.log(err);
          }
        }
        else if(ddlURL.includes("apkpure")){
            try{
                GM.xmlHttpRequest({
                    method: "GET",
                    url: ddlURL,
                    onload: function(response) {
                      switch (response.status) {
                          case 410:
                              buttonError(ddlButton, "Removed!");
                              break;
                          case 404:
                              buttonError(ddlButton, "Not found!");
                              break;
                          default:
                            var apklink=response.responseText.substr(response.responseText.indexOf('https://download.apkpure.com/b/'),response.responseText.length-1);
                            apklink=apklink.substr(0,apklink.indexOf('"'));
                            console.log(ddlURL);
                            ddlButton.firstChild.innerHTML="Wait...";
                            //ddlButton.onclick=function(){GM.openInTab(apklink,"open_in_background");};
                            ddlFinalApk(apklink,ddlButton,0);
                      }
                    },
                    onerror: function(){
                      buttonError(ddlButton,"Offline!");
                    }
                });
            }
            catch(err){
              buttonError(ddlButton,"Failed!");
              console.log(err);
            }
        }
      	else if(ddlURL.includes("apkcombo")){
            try{
                GM.xmlHttpRequest({
                    method: "GET",
                    url: ddlURL,
                    onload: function(response) {
                      switch (response.status) {
                          case 410:
                              buttonError(ddlButton, "Removed!");
                              break;
                          case 404:
                              buttonError(ddlButton, "Not found!");
                              break;
                          default:
                              try {
                                  var i;
                                  var parser = new DOMParser();
                                  var resp = parser.parseFromString(response.responseText, 'text/html');
                                  var google = resp.getElementById("origin-server-tab");
                                  var combo = resp.getElementById("apkcombo-server-tab");
                                  var useGoogleServers=document.getElementById("useGoogleServers").checked;
                                  setUseGS(useGoogleServers);
                                  if ((google !== null)&&((combo === null)||(useGoogleServers==true))) {
                                      var googlelinks = google.getElementsByTagName("a");
                                      for (i = 0; i < googlelinks.length; i++) {
                                          ddlFinalApk(googlelinks[i].getAttribute("href"), ddlButton, i);
                                      }
                                  } else if ((combo !== null)&&(useGoogleServers==false)) {
                                      var combolinks = combo.getElementsByTagName("a");
                                      for (i = 0; i < combolinks.length; i++) {
                                          ddlFinalApk(combolinks[i].getAttribute("href"), ddlButton, i);
                                      }
                                  }
                                  else{ //if loading the main download page results in an empty list of apks, tries to read the token to request directly the urls from apkcombo server
                                        var tokenStart=response.responseText.indexOf("/dl?token=")+4;
                                        var tokenEnd=response.responseText.indexOf("\"",tokenStart);
                                        var token = response.responseText.substring(tokenStart,tokenEnd);
                                        ddlURL=response.finalUrl;
                                        GM.xmlHttpRequest({
                                            method: "POST",
                                            url: ddlURL.replace("/download/apk", "/dl")+"?"+token,
                                            onload: function(response) {
                                                var parser2 = new DOMParser();
                                                var resp2 = parser2.parseFromString(response.responseText, 'text/html');
                                                google = resp2.getElementById("origin-server-tab");
                                                combo = resp2.getElementById("apkcombo-server-tab");
                                                if ((google !== null)&&((combo === null)||(useGoogleServers==true))) {//same as above
                                                    var googlelinks = google.getElementsByTagName("a");
                                                    for (i = 0; i < googlelinks.length; i++) {
                                                        ddlFinalApk(googlelinks[i].getAttribute("href"), ddlButton, i);
                                                    }
                                                } else if ((combo !== null)&&(useGoogleServers==false)) {
                                                    var combolinks = combo.getElementsByTagName("a");
                                                    for (i = 0; i < combolinks.length; i++) {
                                                        ddlFinalApk(combolinks[i].getAttribute("href"), ddlButton, i);
                                                    }
                                                } else {
                                                    ddlButton.firstChild.setAttribute("href", ddlURL);
                                                    ddlButton.firstChild.innerHTML = "New tab >";
                                                    ddlButton.onclick = null;
                                                }
                                            },
                                            onerror: function(response) {
                                                buttonError(ddlButton, "Error!");
                                            }
                                        });
                                    }
                              } catch (err) {
                                  console.log(err);
                              }
                      }
                  },
                  	onerror: function(){
                      buttonError(ddlButton,"Offline!");
                    }
                });
            }
            catch(err){
              buttonError(ddlButton,"Failed!");
              console.log(err);
            }
        }
    }
    function getUglyUIButtons(){
      var matchingElements=[];
      var allElements = document.getElementsByTagName('button');
      for (element of allElements){
        if (element.getAttribute("data-item-id")!==null){
          if (element.getAttribute("data-item-id").startsWith("%.@.")===true){
              matchingElements.push(element);
          }
        }
      }
      //alert(matchingElements.length); shows how many buttons for installation and whishlist are in the page
      return matchingElements;
    }
    function checkUI(){
        //Different UIs:
        //1=Mobile HTML
        //2=Desktop HTML
        //3=Mobile UglyUI
        //4=Desktop UglyUI
        var check=0;
        try{
            if(document.getElementsByClassName("action-bar-menu-button").length>0){
                check=1;
            }
            else{
                if(document.getElementsByClassName("details-info").length>0){
                    check=2;
                }
                else if(!document.getElementById("error-section")){
                    check=4;
                    var metaTags=document.head.getElementsByTagName("meta");
                    for(var i=0;i<metaTags.length;i++){
                        if(metaTags[i].getAttribute("name")=="mobile-web-app-capable"){
                            check=3;
                        }
                   }
                }
            }
        }
        catch(err){
            console.error('The user interface of Google Play Store was not recognized by "Direct Download from Google Play" script. This might result in unexpected behaviour of the page. Please report the error to the author on Greasyfork. Error: '+err);
        }
        return check;
    }
    function removePreviousCwiz(){
        appCwiz.parentNode.removeChild(appCwiz);
    }
    function buttonError(ddlButton,error){
      ddlButton.firstChild.innerHTML=error;
      ddlButton.firstChild.style.backgroundColor="#CCCCCC";
      ddlButton.onclick=null;
    }
    function setUseGS(check){
      useGS=check;
    }

    效果图

     以下载 Signal APP 为例

    展开全文
  • PlaystoreDownloader一种命令行工具,可直接从Google Play商店下载Android应用程序。 PlaystoreDownloader是直接从Google Play S下载Android应用程序的工具PlaystoreDownloader是直接从Google Play商店直接下载...
  • 下载谷歌play应用If you’ve had a smartphone for any reasonable amount of time, you’ve probably installed and uninstalled more apps than you care to remember. Here’s how to access a list of all the ...
    下载谷歌play应用

    下载谷歌play应用

    If you’ve had a smartphone for any reasonable amount of time, you’ve probably installed and uninstalled more apps than you care to remember. Here’s how to access a list of all the apps you’ve installed on your Android phone(s) over time.

    如果您在合理的时间内拥有智能手机,那么您安装和卸载的应用程序可能比您想记住的要多。 随着时间的推移,这是访问您已在Android手机上安装的所有应用程序的列表的方法。

    This feature is built into the Google Play Store, so you can actually take a peek at the entire list from any device logged in to your Google account. Even apps that you installed on your first Android phone should show up here (assuming they’re still available for download, of course). Also, since it’s part of the Google Play Store, the process will be the same on basically every device.

    此功能内置于Google Play商店中,因此您实际上可以从登录到Google帐户的任何设备浏览整个列表。 即使您在第一部Android手机上安装的应用程序也应显示在此处(当然,假设它们仍然可以下载)。 另外,由于它是Google Play商店的一部分,因此基本上每个设备上的过程都相同。

    To get started, go ahead and fire up the Google Play Store, then open the menu. To do this, either slide in from the left side of the screen or tap the three lines in the upper left.

    首先,请启动Google Play商店,然后打开菜单。 为此,请从屏幕左侧滑入或点击左上方的三行。

    From there, tap on “My Apps & Games.”

    在此处,点击“我的应用和游戏”。

    ,rel

    ,rel

    There are three tab in this menu (or four, depending on whether or not you’re enrolled in any beta apps). The third option should read “Library.” Tap it.

    此菜单中有3个标签(或4个标签,具体取决于您是否注册了任何Beta版应用程序 )。 第三个选项应显示为“图书馆”。 点一下

    By default, this list shows every app you’ve installed in the past, but that is not currently installed on the device you’re using. That makes sense, because there’s an Installed tab just to the left of the Library tab that will show you everything that’s currently installed on the device.

    默认情况下,此列表显示您过去安装的每个应用程序,但当前尚未安装在您使用的设备上。 这是有道理的,因为“库”选项卡的左侧有一个“已安装”选项卡,它将向您显示设备上当前已安装的所有内容。

    There are a few different options here to pay attention to: first, you can either choose to sort the list by Most Recent, which will show you the things that have been recently added to your account, or alphabetically. Take your pick.

    这里有几个不同的选项要注意:首先,您可以选择按“最近”对列表进行排序,这将向您显示最近添加到您帐户中的内容,或者按字母顺序。 随便你吧。

    You can also choose to remove any app you’d like from this list…for whatever reason. It’s also worth mentioning that if it’s a paid app, you won’t have to re-buy it if you ever choose to reinstall it. It’s still associated with your Google account.

    您也可以出于任何原因选择从此列表中删除任何应用程序。 还值得一提的是,如果它是付费应用程序,则可以选择重新安装它,而无需重新购买。 它仍然与您的Google帐户关联。

    翻译自: https://www.howtogeek.com/333601/how-to-find-a-list-of-every-app-youve-installed-from-google-play/

    下载谷歌play应用

    展开全文
  • 国内下载GooglePlay应用商店的apk

    万次阅读 2019-11-11 16:09:42
    最近signal提示版本太旧需要更新,就到官网去下载,发现官网的android版本链接直接指向google,由于现在没有多少可用的科学上网工具,所以只能另想它法了,网上找了很多教程都是直接访问...最新可用的地址为:... ...

    最近signal提示版本太旧需要更新,就到官网去下载,发现官网的android版本链接直接指向GooglePlay,由于现在没有多少可用的科学上网工具,所以只能另想它法了,网上找了很多教程都是直接访问http://apps.evozi.com/apk-downloader/来下载,但是现在这个网址以及无法访问了,
    最新可用的地址为:https://www.apkfollow.com/

    展开全文
  • 介绍 Google Play商店应用评论下载器 插入app_id之后,它会获取评论,如下所示。 跑步 python reviews_fetch.py 'app_id' 改进之处 []当前未下载所有评论
  • 不知道大家有没有遇到过这种情况,某些app必须通过play商店下载,但是又由于某些情况(比如连不上Google、装Google框架报错等)无法使用play商店。该怎么办呢?通过以下方法可以提取Google play商店的应用安装包。...
  • 解决方案: 要有'魔法',确保魔法可以生效 打开设置->应用,查找“下载器”,“内容” ...问题:如果之前安装过,后来删除了,再次安装就极容易出现这种情况,出现这种问题是是因为下载时,google ...
  • 如何在线下载Google Play里面的应用

    千次阅读 2020-11-03 19:35:40
    1.翻墙 2.网页play.google搜索应用,复连接 https://play.google.com/store/apps/details?id=net.metaquotes.metatrader4 3.打开这个网站把地址进行搜索 ... 下载。 有迅雷的自动下载 ......
  • Google Play结算示例应用程序。 要构建每个样本,请参阅项目目录中的自述文件说明。 在Android应用(无服务器)中购买商品/订阅。 在Android应用(无服务器)中购买商品/订阅。 -在Android应用程序中购买订阅并在...
  • Google Play结算示例应用程序。 要构建每个样本,请参阅项目目录中的自述文件说明。 在您的Android应用中购买商品。 -在Android应用程序中购买订阅并在服务器上管理订阅。 在您的Android应用程序中购买订阅并在...
  • 下载谷歌play应用In the previous posts of this Part II of the series, we registered for our app on Google Play Console, created upload key and bundled our app to .aab file. We are now ready to publish ...
  • 直接用电脑下载google play应用

    千次阅读 2016-10-28 21:52:06
    直接用电脑下载google play应用本文转载自:直接用电脑下载google play应用_百度经验首先,通过电脑打开google play的官方页面,并找到你希望下载的应用,以Google应用为例,打开应用的安装页面,可以看到浏览器地址...
  • 本人手机是魅族,最近突然发现能连接到Google Play但是点更新或者下载都是一直转圈圈等待下载。绝大多数人都让你去清除软件的缓存或者数据啥的,你能看到我这篇文章这种方法应该没用了。 本人找遍网上的解决方案给出...
  • 游戏商店抓取工具 从Google Play商店抓取应用程序评论并将其写入xml文件。 该应用程序使用JSoup和json-simple来解析响应。
  • GooglePlay应用PC下载

    2013-11-01 22:38:38
    通过PC下载Google Play应用
  • 电脑和手机下载Google play应用的方法

    千次阅读 2019-06-22 22:02:57
    电脑:复制你想下载的APP的地址粘贴到...去小米应用商店下载谷歌应用下载器,安装后点里面的Google play下载,它会提示你一键安装Google服务框架之类的。都安装完后先不要打开Googl...
  • 国内安卓手机搜不到想要的应用,官方告诉google play上有,浏览器直接也登录不上链接怎么办?下面告诉你 电脑访问https://apkpure.com/网站,有时候上不去,不知原因; 搜索你想要的应用,点击下载,就这么简单,...
  • Google Play 应用迁移

    千次阅读 2019-04-22 12:28:54
    原文地址:... 资料:https://support.google.com/googleplay/android-developer/answer/6230247?hl=zh-Hans 将应用转移到其他开发者帐号 如果您要将应用转移到其他 Google Play ...
  • 谷歌play app海量游戏和软件免费资源轻松下,详细排行榜帮助你找到最新版类型,安卓无需ROOT直接使用。谷歌play商店服务安卓版(google store)自由畅玩,想找什么精品软件就来谷歌空间看看吧,现在就来谷歌play体验...
  • 有一台可以科学上网的电脑 + 想把google play中的游戏下载到安卓手机上: 有一种亲测有效的方法: https://apkpure.com/cn/search?q=rusty+lake 直接在这里下载apk文件,,然后手机里打开安装即可。 参考:...
  • Google play谷歌商店一直正在等待下载

    万次阅读 多人点赞 2019-10-07 15:22:57
    Google play商店一直正在等待下载? 1,打开手机里的设置(不是google play里的设置) 2,应用 3,搜索到google play 4,点商店,然后下方清除所有能清除的。 额外:miui关迅雷加速办法: 手机待机主页上滑调出搜索...
  • 刮取并解析Google Play商店中的应用程序数据。 安装 用pip安装。 pip install play-scraper 用法 :获取应用程序的详细信息 :获取应用程序及其详细信息的列表。 :获取开发者提供的应用程序。 :获取查询字符串...
  • Google Play 不能直接下载apk安装包,解决办法,安装插件下载 第一步  FQ就不说了 第二步  安装google浏览器 APK Downloader插件 第三步 打开Google play网站,找到要下载的APP,点击进入详情页面。点击插件,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,602
精华内容 16,240
关键字:

play应用下载google