无法通过 Publisher API 将 APK 上传到 Google Play Developer

Posted

技术标签:

【中文标题】无法通过 Publisher API 将 APK 上传到 Google Play Developer【英文标题】:Can't Upload APK to Google Play Developer via Publisher API 【发布时间】:2018-01-16 04:16:18 【问题描述】:

我正在使用 nodejs 创建脚本以通过 Publishing API 将我的 APK 上传到 Google Play Developer,但是它失败了。我认为,APK文件没什么问题,因为它是一个好文件。那么有什么办法解决这个问题吗?

我也尝试分段上传,但返回错误(我将很快附上)

以下是错误消息:

Upload successful!  Server responded with: 
 "error": 
  "errors": [
   
    "domain": "androidpublisher",
    "reason": "apkInvalidFile",
    "message": "Invalid APK file."
   
  ],
  "code": 403,
  "message": "Invalid APK file."
 

我的源代码

var https = require('https');
var request = require('request');
https.post = require('https-post');
var fs = require('fs');

var tokens = process.argv[2];

var formData = 
    my_file: fs.createReadStream('example_file.apk')
   



if (tokens != '')

    var url_create_listing = 'https://www.googleapis.com/androidpublisher/v2/applications/com.example.apps/edits?access_token='+tokens;
    request.post( url_create_listing, function (error, response, body) 
        var str_body = JSON.parse (body);
        var listing_id = str_body.id;

        var url_upload = 'https://www.googleapis.com/upload/androidpublisher/v2/applications/com.example.apps/edits/'+listing_id+'/apks?uploadType=media&access_token='+tokens;


        var options = 
          url: url_upload,
          headers: 
            'Content-Type': 'application/vnd.android.package-archive'
          
        ;

        request.post( options, function optionalCallback(err, httpResponse, body)
         
          if (err) 
            return console.error('upload failed:', err);
          
          console.log('Upload successful!  Server responded with:', body);
        ).pipe(fs.createReadStream('example_file.apk'));
    ); 

【问题讨论】:

【参考方案1】:

我认为您对 NodeJS 流的工作方式存在误解。

在上面显示的示例代码中,您试图将request.post 的结果通过管道传输到fs.createReadStream,这没有意义,这就是错误的原因,因为您没有发送任何apk 文件。相反,它应该像下面那样完成。 (我不确定 androidpublisher api 是如何工作的,我假设您的示例显示了正确的用法。)

var url_create_listing = 'https://www.googleapis.com/androidpublisher/v2/applications/com.example.apps/edits?access_token='+tokens;

request.post( url_create_listing, function (error, response, body) 
var str_body = JSON.parse (body);
var listing_id = str_body.id;
var url_upload = 'https://www.googleapis.com/upload/androidpublisher/v2/applications/com.example.apps/edits/'+listing_id+'/apks?uploadType=media&access_token='+tokens;

// request module is capable of auto detecting the Content-Type header
// based on the file extension.
var options = 
  url: url_upload
;

fs.createReadStream('example_file.apk')
.pipe(request.post(options, function optionalCallback(err, httpResponse, body)
  if (err) 
    return console.error('upload failed:', err);
  
  console.log('Upload successful!  Server responded with:', body);
));

【讨论】:

【参考方案2】:

根据https://developers.google.com/games/services/publishing/:

Google Play 游戏服务发布 API 可让您自动化 经常要做的任务(...)

您是否受到绝对限制使用 JS 和 node.js 来完成这项任务?如果没有,您可能会发现这个 Google management-tools 代码示例很有用。

在此存储库中,您可以找到帮助您发布、管理和 测试您的 Play 游戏服务应用

在我看来,最好还是安装 Python(并重用官方代码)来做到这一点。

(Google 开发人员显然更喜欢 python 来完成这种任务)

【讨论】:

【参考方案3】:

你看过fastlane.tools吗?发布、上传、截屏、松弛通知等的完整脚本,适用于 Android 和 ios

【讨论】:

以上是关于无法通过 Publisher API 将 APK 上传到 Google Play Developer的主要内容,如果未能解决你的问题,请参考以下文章

无法将“Published<Bool>.Publisher”类型的值转换为预期的参数类型“Binding<Bool>”

无法将提示中的多个值传递给 Bi Publisher 11g

SwiftUI 结合 Publisher targetstruct 来解码数据

任务 ':rtmp_publisher:compileReleaseKotlin' 执行失败

使用 buildozer 创建 kivy apk 错误:“Aidl 无法执行”

将 MQTT 消息与 Publisher 的 clienID 连接