Exemplo de Python: envios para aplicativos, complementos e versões de pré-lançamento
Este artigo fornece exemplos de código Python que demonstram como usar a API de envio da Microsoft Store para estas tarefas:
- Obter um token de acesso do Azure AD
- Criar um complemento
- Criar um pacote de pré-lançamento
- Criar um envio de aplicativo
- Criar um envio de complemento
- Criar um envio de pacote de pré-lançamento
Obter um token de acesso do Azure AD
O exemplo a seguir demonstra como obter um token de acesso do Azure AD que é possível usar para chamar métodos na API de envio da Microsoft Store. Depois de obter um token, você tem 60 minutos para usá-lo em chamadas para a API de envio da Microsoft Store antes que ele expire. Depois que o token expirar, será possível gerar um novo.
import http.client, json
tenantId = "" # Your tenant ID
clientId = "" # Your client ID
clientSecret = "" # Your client secret
tokenEndpoint = "https://login.microsoftonline.com/{0}/oauth2/token"
tokenResource = "https://manage.devcenter.microsoft.com"
tokenRequestBody = "grant_type=client_credentials&client_id={0}&client_secret={1}&resource={2}".format(clientId, clientSecret, tokenResource)
headers = {"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"}
tokenConnection = http.client.HTTPSConnection("login.microsoftonline.com")
tokenConnection.request("POST", "/{0}/oauth2/token".format(tenantId), tokenRequestBody, headers=headers)
tokenResponse = tokenConnection.getresponse()
print(tokenResponse.status)
tokenJson = json.loads(tokenResponse.read().decode())
print(tokenJson["access_token"])
tokenConnection.close()
Criar um complemento
O exemplo a seguir demonstra como criar e depois excluir um complemento.
import http.client, json
accessToken = "" # Your access token
iapRequestJson = "" # Your in-app-product request JSON
headers = {"Authorization": "Bearer " + accessToken,
"Content-type": "application/json",
"User-Agent": "Python"}
ingestionConnection = http.client.HTTPSConnection("manage.devcenter.microsoft.com")
# Create a new in-app-product
ingestionConnection.request("POST", "/v1.0/my/inappproducts", iapRequestJson, headers)
createIapResponse = ingestionConnection.getresponse()
print(createIapResponse.status)
print(createIapResponse.reason)
print(createIapResponse.headers["MS-CorrelationId"]) # Log correlation ID
iapJsonObject = json.loads(createIapResponse.read().decode())
inAppProductId = iapJsonObject["id"]
# Delete created in-app-product
ingestionConnection.request("DELETE", "/v1.0/my/inappproducts/" + inAppProductId, "", headers)
deleteIapResponse = ingestionConnection.getresponse()
print(deleteIapResponse.status)
print(deleteIapResponse.headers["MS-CorrelationId"]) # Log correlation ID
ingestionConnection.close()
Criar um pacote de pré-lançamento
O exemplo a seguir demonstra como criar e depois excluir um pacote de pré-lançamento.
import http.client, json, requests, time
from azure.storage.blob import BlobClient
accessToken = "" # Your access token
applicationId = "" # Your application ID
flightRequestJson = "" # Your flight request JSON
headers = {"Authorization": "Bearer " + accessToken,
"Content-type": "application/json",
"User-Agent": "Python"}
ingestionConnection = http.client.HTTPSConnection("manage.devcenter.microsoft.com")
# Create a new flight, a flight submission will be created together with the flight
ingestionConnection.request("POST", "/v1.0/my/applications/{0}/flights".format(applicationId), flightRequestJson, headers)
createFlightResponse = ingestionConnection.getresponse()
print(createFlightResponse.status)
print(createFlightResponse.reason)
print(createFlightResponse.headers["MS-CorrelationId"]) # Log correlation ID
flightJsonObject = json.loads(createFlightResponse.read().decode())
flightId = flightJsonObject["flightId"]
submissionId = flightJsonObject["pendingFlightSubmission"]["id"]
# Delete created flight
ingestionConnection.request("DELETE", "/v1.0/my/applications/{0}/flights/{1}".format(applicationId, flightId), "", headers)
deleteFlightResponse = ingestionConnection.getresponse()
print(deleteFlightResponse.status)
print(deleteFlightResponse.headers["MS-CorrelationId"]) # Log correlation ID
ingestionConnection.close()
Criar um envio de aplicativo
O exemplo a seguir mostra como usar diversos métodos na API de envio da Microsoft Store para criar um envio de aplicativo. Para isso, o código cria um novo envio como um clone do último envio publicado e, em seguida, atualiza e confirma o envio clonado para o Partner Center. Especificamente, o exemplo realiza estas tarefas:
- Para começar, o exemplo obtém dados do aplicativo especificado.
- Em seguida, ele exclui o envio pendente para o aplicativo, caso haja um.
- Em seguida, ele cria um novo envio para o aplicativo (o novo envio é uma cópia do último envio publicado).
- Ele muda alguns detalhes para o novo envio e carrega um novo pacote para o envio no Armazenamento de Blobs do Azure.
- Em seguida, ele atualiza e confirma o novo envio para o Partner Center.
- Por fim, ele verifica periodicamente o status do novo envio até que o envio seja confirmado com êxito.
import http.client, json, requests, time
from azure.storage.blob import BlobClient
accessToken = "" # Your access token
applicationId = "" # Your application ID
appSubmissionRequestJson = ""; # Your submission request JSON
zipFilePath = r'*.zip' # Your zip file path
headers = {"Authorization": "Bearer " + accessToken,
"Content-type": "application/json",
"User-Agent": "Python"}
ingestionConnection = http.client.HTTPSConnection("manage.devcenter.microsoft.com")
# Get application
ingestionConnection.request("GET", "/v1.0/my/applications/{0}".format(applicationId), "", headers)
appResponse = ingestionConnection.getresponse()
print(appResponse.status)
print(appResponse.headers["MS-CorrelationId"]) # Log correlation ID
# Delete existing in-progress submission
appJsonObject = json.loads(appResponse.read().decode())
if "pendingApplicationSubmission" in appJsonObject :
submissionToRemove = appJsonObject["pendingApplicationSubmission"]["id"]
ingestionConnection.request("DELETE", "/v1.0/my/applications/{0}/submissions/{1}".format(applicationId, submissionToRemove), "", headers)
deleteSubmissionResponse = ingestionConnection.getresponse()
print(deleteSubmissionResponse.status)
print(deleteSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
deleteSubmissionResponse.read()
# Create submission
ingestionConnection.request("POST", "/v1.0/my/applications/{0}/submissions".format(applicationId), "", headers)
createSubmissionResponse = ingestionConnection.getresponse()
print(createSubmissionResponse.status)
print(createSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
submissionJsonObject = json.loads(createSubmissionResponse.read().decode())
submissionId = submissionJsonObject["id"]
fileUploadUrl = submissionJsonObject["fileUploadUrl"]
print(submissionId)
print(fileUploadUrl)
# Update submission
ingestionConnection.request("PUT", "/v1.0/my/applications/{0}/submissions/{1}".format(applicationId, submissionId), appSubmissionRequestJson, headers)
updateSubmissionResponse = ingestionConnection.getresponse()
print(updateSubmissionResponse.status)
print(updateSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
updateSubmissionResponse.read()
# Upload images and packages in a zip file.
blob_client = BlobClient.from_blob_url(fileUploadUrl)
with open(zipFilePath, "rb") as data:
blob_client.upload_blob(data, blob_type="BlockBlob")
# Commit submission
ingestionConnection.request("POST", "/v1.0/my/applications/{0}/submissions/{1}/commit".format(applicationId, submissionId), "", headers)
commitResponse = ingestionConnection.getresponse()
print(commitResponse.status)
print(commitResponse.headers["MS-CorrelationId"]) # Log correlation ID
print(commitResponse.read())
# Pull submission status until commit process is completed
ingestionConnection.request("GET", "/v1.0/my/applications/{0}/submissions/{1}/status".format(applicationId, submissionId), "", headers)
getSubmissionStatusResponse = ingestionConnection.getresponse()
submissionJsonObject = json.loads(getSubmissionStatusResponse.read().decode())
while submissionJsonObject["status"] == "CommitStarted":
time.sleep(60)
ingestionConnection.request("GET", "/v1.0/my/applications/{0}/submissions/{1}/status".format(applicationId, submissionId), "", headers)
getSubmissionStatusResponse = ingestionConnection.getresponse()
submissionJsonObject = json.loads(getSubmissionStatusResponse.read().decode())
print(submissionJsonObject["status"])
print(submissionJsonObject["status"])
print(submissionJsonObject)
ingestionConnection.close()
Criar um envio de complemento
O exemplo a seguir mostra como usar diversos métodos na API de envio da Microsoft Store para criar um envio de complemento. Para isso, o código cria um novo envio como um clone do último envio publicado e, em seguida, atualiza e confirma o envio clonado para o Partner Center. Especificamente, o exemplo realiza estas tarefas:
- Para começar, o exemplo obtém dados do complemento especificado.
- Em seguida, ele exclui o envio pendente para o complemento, caso haja um.
- Em seguida, ele cria um novo envio para o complemento (o novo envio é uma cópia do último envio publicado).
- Ele carrega um arquivo ZIP que contém ícones para o envio no Armazenamento de Blobs do Azure. Para obter mais informações, consulte as instruções relevantes sobre como carregar um arquivo ZIP para o Armazenamento de Blobs do Azure em Criar um envio de complemento.
- Em seguida, ele atualiza e confirma o novo envio para o Partner Center.
- Por fim, ele verifica periodicamente o status do novo envio até que o envio seja confirmado com êxito.
import http.client, json, requests, time
from azure.storage.blob import BlobClient
accessToken = "" # Your access token
inAppProductId = "" # Your in-app-product ID
updateSubmissionRequestBody = ""; # Your in-app-product submission request JSON
zipFilePath = r'*.zip' # Your zip file path
headers = {"Authorization": "Bearer " + accessToken,
"Content-type": "application/json",
"User-Agent": "Python"}
ingestionConnection = http.client.HTTPSConnection("manage.devcenter.microsoft.com")
# Get in-app-product
ingestionConnection.request("GET", "/v1.0/my/inappproducts/{0}".format(inAppProductId), "", headers)
iapResponse = ingestionConnection.getresponse()
print(iapResponse.status)
print(iapResponse.headers["MS-CorrelationId"]) # Log correlation ID
# Delete existing in-progress submission
iapJsonObject = json.loads(iapResponse.read().decode())
if "pendingInAppProductSubmission" in iapJsonObject :
submissionToRemove = iapJsonObject["pendingInAppProductSubmission"]["id"]
ingestionConnection.request("DELETE", "/v1.0/my/inappproducts/{0}/submissions/{1}".format(inAppProductId, submissionToRemove), "", headers)
deleteSubmissionResponse = ingestionConnection.getresponse()
print(deleteSubmissionResponse.status)
print(deleteSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
deleteSubmissionResponse.read()
# Create submission
ingestionConnection.request("POST", "/v1.0/my/inappproducts/{0}/submissions".format(inAppProductId), "", headers)
createSubmissionResponse = ingestionConnection.getresponse()
print(createSubmissionResponse.status)
print(createSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
submissionJsonObject = json.loads(createSubmissionResponse.read().decode())
submissionId = submissionJsonObject["id"]
fileUploadUrl = submissionJsonObject["fileUploadUrl"]
print(submissionId)
print(fileUploadUrl)
# Update submission
ingestionConnection.request("PUT", "/v1.0/my/inappproducts/{0}/submissions/{1}".format(inAppProductId, submissionId), updateSubmissionRequestBody, headers)
updateSubmissionResponse = ingestionConnection.getresponse()
print(updateSubmissionResponse.status)
print(updateSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
updateSubmissionResponse.read()
# Upload images and packages in a zip file.
blob_client = BlobClient.from_blob_url(fileUploadUrl)
with open(zipFilePath, "rb") as data:
blob_client.upload_blob(data, blob_type="BlockBlob")
# Commit submission
ingestionConnection.request("POST", "/v1.0/my/inappproducts/{0}/submissions/{1}/commit".format(inAppProductId, submissionId), "", headers)
commitResponse = ingestionConnection.getresponse()
print(commitResponse.status)
print(commitResponse.headers["MS-CorrelationId"]) # Log correlation ID
print(commitResponse.read())
# Pull submission status until commit process is completed
ingestionConnection.request("GET", "/v1.0/my/inappproducts/{0}/submissions/{1}/status".format(inAppProductId, submissionId), "", headers)
getSubmissionStatusResponse = ingestionConnection.getresponse()
submissionJsonObject = json.loads(getSubmissionStatusResponse.read().decode())
while submissionJsonObject["status"] == "CommitStarted":
time.sleep(60)
ingestionConnection.request("GET", "/v1.0/my/inappproducts/{0}/submissions/{1}/status".format(inAppProductId, submissionId), "", headers)
getSubmissionStatusResponse = ingestionConnection.getresponse()
submissionJsonObject = json.loads(getSubmissionStatusResponse.read().decode())
print(submissionJsonObject["status"])
print(submissionJsonObject["status"])
print(submissionJsonObject)
ingestionConnection.close()
Criar um envio de pacote de pré-lançamento
O exemplo a seguir mostra como usar diversos métodos na API de envio da Microsoft Store para criar um envio de pacote de pré-lançamento. Para isso, o código cria um novo envio como um clone do último envio publicado e, em seguida, atualiza e confirma o envio clonado para o Partner Center. Especificamente, o exemplo realiza estas tarefas:
- Para começar, o exemplo obtém dados do pacote de pré-lançamento especificado.
- Em seguida, ele exclui o envio pendente para o pacote de pré-lançamento, caso haja um.
- Em seguida, ele cria um novo envio para o pacote de pré-lançamento (o novo envio é uma cópia do último envio publicado).
- Ele carrega um novo pacote para o envio no Armazenamento de Blobs do Azure. Para obter mais informações, consulte as instruções relevantes sobre como carregar um arquivo ZIP para o Armazenamento de Blobs do Azure em Criar um envio de pacote de pré-lançamento.
- Em seguida, ele atualiza e confirma o novo envio para o Partner Center.
- Por fim, ele verifica periodicamente o status do novo envio até que o envio seja confirmado com êxito.
import http.client, json, requests, time, zipfile
from azure.storage.blob import BlobClient
accessToken = "" # Your access token
applicationId = "" # Your application ID
flightId = "" # Your flight ID
flightSubmissionRequestJson = "" # Your submission request JSON
zipFilePath = r'*.zip' # Your zip file path
headers = {"Authorization": "Bearer " + accessToken,
"Content-type": "application/json",
"User-Agent": "Python"}
ingestionConnection = http.client.HTTPSConnection("manage.devcenter.microsoft.com")
# Get flight
ingestionConnection.request("GET", "/v1.0/my/applications/{0}/flights/{1}".format(applicationId, flightId), "", headers)
flightResponse = ingestionConnection.getresponse()
print(flightResponse.status)
print(flightResponse.headers["MS-CorrelationId"]) # Log correlation ID
# Delete existing in-progress submission
flightJsonObject = json.loads(flightResponse.read().decode())
if "pendingFlightSubmission" in flightJsonObject :
submissionToRemove = flightJsonObject["pendingFlightSubmission"]["id"]
ingestionConnection.request("DELETE", "/v1.0/my/applications/{0}/flights/{1}/submissions/{2}".format(applicationId, flightId, submissionToRemove), "", headers)
deleteSubmissionResponse = ingestionConnection.getresponse()
print(deleteSubmissionResponse.status)
print(deleteSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
deleteSubmissionResponse.read()
# Create submission
ingestionConnection.request("POST", "/v1.0/my/applications/{0}/flights/{1}/submissions".format(applicationId, flightId), "", headers)
createSubmissionResponse = ingestionConnection.getresponse()
print(createSubmissionResponse.status)
print(createSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
submissionJsonObject = json.loads(createSubmissionResponse.read().decode())
submissionId = submissionJsonObject["id"]
fileUploadUrl = submissionJsonObject["fileUploadUrl"]
print(submissionId)
print(fileUploadUrl)
# Update submission
ingestionConnection.request("PUT", "/v1.0/my/applications/{0}/flights/{1}/submissions/{2}".format(applicationId, flightId, submissionId), flightSubmissionRequestJson, headers)
updateSubmissionResponse = ingestionConnection.getresponse()
print(updateSubmissionResponse.status)
print(updateSubmissionResponse.headers["MS-CorrelationId"]) # Log correlation ID
updateSubmissionResponse.read()
# Upload images and packages in a zip file.
blob_client = BlobClient.from_blob_url(fileUploadUrl)
with open(zipFilePath, "rb") as data:
blob_client.upload_blob(data, blob_type="BlockBlob")
# Commit submission
ingestionConnection.request("POST", "/v1.0/my/applications/{0}/flights/{1}/submissions/{2}/commit".format(applicationId, flightId, submissionId), "", headers)
commitResponse = ingestionConnection.getresponse()
print(commitResponse.status)
print(commitResponse.headers["MS-CorrelationId"]) # Log correlation ID
print(commitResponse.read())
# Pull submission status until commit process is completed
ingestionConnection.request("GET", "/v1.0/my/applications/{0}/flights/{1}/submissions/{2}/status".format(applicationId, flightId, submissionId), "", headers)
getSubmissionStatusResponse = ingestionConnection.getresponse()
submissionJsonObject = json.loads(getSubmissionStatusResponse.read().decode())
while submissionJsonObject["status"] == "CommitStarted":
time.sleep(60)
ingestionConnection.request("GET", "/v1.0/my/applications/{0}/flights/{1}/submissions/{2}/status".format(applicationId, flightId, submissionId), "", headers)
getSubmissionStatusResponse = ingestionConnection.getresponse()
submissionJsonObject = json.loads(getSubmissionStatusResponse.read().decode())
print(submissionJsonObject["status"])
print(submissionJsonObject["status"])
print(submissionJsonObject)
ingestionConnection.close()