Не удается загрузить APK в Google Play для разработчиков через API издателя

Я создаю сценарий, используя nodejs загрузить мой APK в Google Play Developer через API публикации, однако это не удалось. Я думаю, что нет ничего плохого в файле 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'));
    }); 
}

3 ответа

Я думаю, что вы неправильно понимаете, как работают потоки 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);
}));

Вы смотрели на https://fastlane.tools/? Полный сценарий публикации, загрузки, снятия скриншотов, слабых уведомлений и многого другого для Android и iOS.

Согласно https://developers.google.com/games/services/publishing/:

API публикации игровых сервисов Google Play позволяет автоматизировать часто выполняемые задачи (...)

Вы находитесь под абсолютным ограничением для использования JS & node.js для этой задачи? Если нет, то вам может пригодиться этот пример кода инструментов управления Google.

В этом репозитории вы можете найти инструменты, которые помогут вам публиковать, управлять и тестировать приложения служб Play Games

На мой взгляд, для этого всегда лучше установить Python (и повторно использовать официальный код).

(Разработчики Google явно предпочитают Python для такого рода задач)

Другие вопросы по тегам