Documentación de Steamworks
Interfaz ICloudService
Proporciona acceso a los archivos de Steam Cloud de un usuario de Steam. Esto está destinado principalmente a permitir el guardado multiplataforma para tu juego. La versión de Steam del juego puede utilizar características del Cloud de Steamworks (ya sea la API ISteamRemoteStorage o Steam Auto-Cloud). Las versiones que no son de Steam pueden utilizar esta WebAPI para acceder a los archivos y subir nuevas versiones.

Tu juego necesita conseguir permiso del usuario para acceder a sus archivos en Steam Cloud. Esto se puede hacerse a través de OAuth. Lo más probable es que quieras solicitar tanto el permiso read_cloud como el permiso write_cloud.

Consulta también nuestro artículo Descripción general de la WebAPI, concretamente la sección titulada "Interfaces de servicio". Pueden hacerse solicitudes GET con parámetros en el URL; sin embargo, para las solicitudes POST se recomienda que todos los parámetros estén en el cuerpo de la solicitud. El parámetro access-token está directamente codificado en el formulario, y el resto de los parámetros deberían estar en una estructura JSON configurada a través del campo input-json.

La respuesta a las solicitudes bien formadas y autenticadas suele ser 200 OK. Sin embargo, la solicitud puede haber fallado. Encontrarás el código de error detallado de Steam en el encabezado x-eresult. El valor para "success" es 1. Cualquier otro valor probablemente sea un error. Para más información, consulta la documentación sobre steam_api.h.

Enumeración de archivos

Requiere acceso OAuth read_cloud.

EnumerateUserFiles


Ejemplo:
GET https://api.steampowered.com/ICloudService/EnumerateUserFiles/v1/?access_token=<token>&appid=1234&extended_details=1 HTTP/1.1 Host: api.steampowered.com Content-Length: 0

NombreTipoObligatorioDescripción
access_tokenstringToken de acceso OAuth del usuario
appiduint32El id. de tu aplicación
extended_detailsboolIncluye detalles como los enlaces de descarga de los archivos
countuint32Número máximo de archivos para enumerar (por defecto, 500)
start_indexuint32Iniciando el índice de archivos para enumerar (valor predeterminado 0)

Enumera los archivos de Steam Cloud del usuario para tu juego. Comienza con un "start_index" de cero, y repite en caso necesario si el usuario tiene más de "count" archivos.

La respuesta tiene dos campos:
NombreTipoDescripción
filesver más abajoUna lista con los detalles de los archivos
total_filesuint32El número total de archivos que el usuario tiene en Steam Cloud para tu aplicación

La lista de archivos contiene estos datos:
NombreTipoDescripción
appiduint32Mismo id. de aplicación
ugciduint64Id. de archivo único
nombre de archivostringNombre del archivo
timestampuint64Tiempo Unix en que se modificó el archivo por última vez
file_sizeuint32Tamaño del archivo en bytes
urlstringUn URL que se puede utilizar para descargar el archivo
steamid_creatoruint64Id. de Steam del usuario
flagsuint32Solo para uso interno de Steam
platforms_to_syncstringLista de plataformas para las que este archivo es válido. Ver Carga de archivos para obtener la lista de posibles valores
file_shastringCadena hexadecimal (40 dígitos) que representa el resumen SHA1 del archivo

Descarga de archivos


Para descargar un archivo, simplemente haz una solicitud GET al URL devuelto por EnumerateUserFiles.

Modificación de archivos


Requiere acceso OAuth write_cloud.

Modificar archivos incluye cargar archivos nuevos, cargar nuevas versiones de los archivos existentes y borrar archivos de Steam Cloud.

El set de acciones de modificación de archivos se debe consolidar en un batch. Los batches se usan para comunicar la intención del conjunto de tus modificaciones a la Steam Cloud, lo cual ayuda a reducir la probabilidad de conflictos entre archivos.

Una secuencia de lotes completa tendrá este aspecto:

  • Llamada a la función BeginAppUploadBatch, con una lista de lo que se carga y lo que se borra.
  • 0 o más cargas, utilizando la secuencia:
    • BeginHTTPUpload.
    • Operación HTTP PUT para cargar el archivo.
    • CommitHTTPUpload.
  • 0 o más borrados, utilizando Delete.
  • CompleteAppUploadBatch

Hay que tener en cuenta que se debe llamar a CompleteAppUploadBatch independientemente de que las cargas y/o los borrados se lleven a cabo con éxito. Si no se llama a la función CompleteAppUploadBatch habrá un periodo de tiempo de varios minutos en el que los nuevos intentos de carga del usuario y de la aplicación quedarán bloqueados
y recibirán el mensaje "demasiadas solicitudes pendientes".

BeginAppUploadBatch


La primera operación para un conjunto de modificaciones de archivo es llamar a la función BeginAppUploadBatch. Esta llamada le comunica a Steam Cloud el conjunto de cargas y borrados previstos, así como la información sobre la máquina del usuario que está haciendo la actualización.

Ejemplo:
POST https://api.steampowered.com/ICloudService/BeginAppUploadBatch/v1/ HTTP/1.1 Host: api.steampowered.com Content-Type: application/x-www-form-urlencoded Content-Length: <body length> access_token=<token>&input_json={ "appid": "1234", "machine_name": "My%20Handheld", "files_to_upload": ["%25WinAppDataLocal%25Foobar%2FGamename%2Fcloud%2Fgames%2Fsave.sav"], "files_to_delete": ["%25WinAppDataLocal%25Foobar%2FGamename%2Fcloud%2Fgames%2Fsave_old.sav"] }

NombreTipoObligatorioDescripción
access_tokenstringToken de acceso OAuth del usuario
appiduint32El id. de tu aplicación
machine_namestringUn nombre para la máquina de origen, preferiblemente uno que el usuario haya aplicado al dispositivo
files_to_uploadstring listLista de todos los archivos que se van a subir como parte de este lote, ya sean archivos nuevos o actualizaciones de archivos existentes
files_to_deletestring listCadena hexadecimal (40 dígitos) que representa el resumen SHA1 del archivo.

Llama a esta API para iniciar la carga del lote.

Ten en cuenta que para los parámetros de la lista, como "files_to_upload", la sintaxis cuando se usa como un parámetro GET es la siguiente:
&files_to_upload[0]=file1.sav&files_to_upload[1]=file2.sav

En un campo codificado en JSON en un parámetro POST, sería:
"files_to_upload": ["file1.sav", "file2.sav"]

Los datos de la respuesta:
NombreTipoDescripción
batch_iduint64El id. de este batch, que se utilizará con la llamada CompleteAppUploadBatch.
app_change_numberuint64Actualmente no utilizado por esta API.

Tu aplicación debe recordar el batch_id de esta respuesta e incluirlo en la petición de CompleteAppUploadBatch, una vez que se hayan intentado realizar todas las cargas y borrados.

CompleteAppUploadBatch


Una vez que se hayan intentado realizar todas las cargas y borrados, ya sea con o sin éxito, debes llamar a la función CompleteAppUploadBatch. Esto le indica a Steam que se han intentado realizar todas las operaciones de este lote, y entonces permitirá procesar inmediatamente cualquier otro lote recién pedido.

Ejemplo:
POST https://api.steampowered.com/ICloudService/CompleteAppUploadBatch/v1/ HTTP/1.1 Host: api.steampowered.com Content-Type: application/x-www-form-urlencoded Content-Length: <body length> access_token=<token>&input_json={ "appid": "1234", "batch_id": "434565457423", "batch_eresult": "1" }

NombreTipoObligatorioDescripción
access_tokenstringOAuth es el token de acceso para el usuario.
appiduint32El id. de tu aplicación.
batch_iduint64El número de identificación de este batch.
batch_eresultuint32Resultado del batch (ver comentarios).

El parámetro batch_eresult tiene que ser bien 1 (correcto) o 2 (incorrecto). Técnicamente este es un valor EResult (ver steam_api.h con la lista). Para este método es bastante con indicarle a Steam si fue correcto o no.

No hay datos en la respuesta de esta API.

BeginHTTPUpload


La carga se realiza a través de una API de dos partes. Primero llamarás a BeginHTTPUpload para obtener los detalles sobre dónde cargar el archivo y, cuando eso se haya completado, llamarás a CommitHTTPUpload.

Por ejemplo:
POST https://api.steampowered.com/ICloudService/BeginHTTPUpload/v1/ HTTP/1.1 Host: api.steampowered.com Content-Type: application/x-www-form-urlencoded Content-Length: <body length> access_token=<token>&input_json={ "appid": "1234", "file_size": "7448889", "filename": "%25WinAppDataLocal%25Foobar%2FGamename%2Fcloud%2Fgames%2Fsave.sav", "file_sha": "FDFE308499263F9361B472648E9F49DC0B8799C8", "is_public": "0", "platforms_to_sync": ["all"] }

NombreTipoObligatorioDescripción
access_tokenstringOAuth es el token de acceso para el usuario
appiduint32El id. de tu aplicación
file_sizeuint32True si la solicitud PUT se ejecutó correctamente.
filenamestringEl nombre del archivo
file_shastringCadena hexadecimal (40 dígitos) que representa el resumen SHA1 del archivo
platforms_to_syncstringLista de plataformas para las que este archivo es válido Valores posibles: All, Windows, macOS, Linux, Android, iPhoneOS, Switch. No distingue entre mayúsculas y minúsculas
upload_batch_iduint64El batch_id devuelto por BeginAppUplaodBatch arriba.

Llama a esta API para iniciar la carga de un nuevo archivo (o una nueva versión de un archivo existente) a Steam Cloud para el usuario. Las nuevas versiones de los archivos existentes sobrescribirán la versión actual.

Ten en cuenta que para los parámetros de la lista, como "platforms_to_sync", la sintaxis cuando se usa como un parámetro GET es la siguiente:
&platforms_to_sync[0]=macos&platforms_to_sync[1]=windows

En un campo codificado en JSON en un parámetro POST, sería:
"platforms_to_sync": ["macOS", "Windows"]

Los datos de la respuesta:
NombreTipoDescripción
ugciduint64Id. de archivo único (no es necesario)
timestampuint32Marca de tiempo en formato epoch para este cambio
url_hoststringFQDN del host al que cargarás el archivo
url_pathstringRuta de solicitud. Ten en cuenta que actualmente esto ya incluye una barra diagonal (/) al principio
use_httpsboolSe establece como "true" si debes usar HTTPS para realizar la carga (generalmente siempre es "true").
request_headersver más abajoLista de encabezados HTTP que debes establecer en la solicitud PUT posterior.

La lista "request_headers" contiene estos datos:
NombreTipoDescripción
namestringEl nombre del encabezado.
valuestringEl valor del encabezado.

Para cargar el archivo, realiza una solicitud PUT a https://<url_host><url_path>/ donde cada uno de los encabezados HTTP indicados arriba tenga el valor especificado. En caso de éxito, puedes recibir una respuesta de 200 OK, 201 Created o 204 No Content, dependiendo del proveedor de almacenamiento.

La solicitud puede tener este aspecto:
PUT https://steamcloud-us-west1.storage.googleapis.com/00/00/00/00/1234/012_3_4A77D494_9D267_1464.dat?GoogleAccessId=numbersandletters@developer.gserviceaccount.com&Expires=1595961837&Signature=morestuffhere HTTP/1.1 Host: steamcloud-us-west1.storage.googleapis.com Content-Type: application/octet-stream Content-Length: <body length> Header-from-Steam1: value1 Header-from-Steam2: value2 <file data>

Cuando se completa (correctamente o no), llama a:

CommitHTTPUpload


Por ejemplo:
POST https://api.steampowered.com/ICloudService/CommitHTTPUpload/v1/ HTTP/1.1 Host: api.steampowered.com Content-Type: application/x-www-form-urlencoded Content-Length: <body length> access_token=<token>&input_json={ "appid": "1234", "transfer_succeeded": "1", "filename": "%25WinAppDataLocal%25Foobar%2FGamename%2Fcloud%2Fgames%2Fsave.sav", "file_sha": "FDFE308499263F9361B472648E9F49DC0B8799C8" }
NombreTipoObligatorioDescripción
access_tokenstringToken de acceso OAuth del usuario.
appiduint32El id. de tu aplicación.
transfer_succeededboolTrue si la solicitud PUT tuvo éxito.
filenamestringEl nombre del archivo.
file_shastringCadena hexadecimal (40 dígitos) que representa el resumen SHA1 del archivo

La respuesta a esta API actualmente tiene un solo campo, "file_committed", que será true si Steam pudo completar el cambio. Si es "false", entonces la carga ha fallado: no se ha registrado ningún archivo nuevo o, si se trataba de la actualización de un archivo existente, el archivo original sigue existiendo y será devuelto por futuras solicitudes de enumeración o descarga.

Delete


Por ejemplo:
POST https://api.steampowered.com/ICloudService/Delete/v1/ HTTP/1.1 Host: api.steampowered.com Content-Type: application/x-www-form-urlencoded Content-Length: <body length> access_token=<token>&input_json={ "appid": "1234", "filename": "%25WinAppDataLocal%25Foobar%2FGamename%2Fcloud%2Fgames%2Fsave.sav" }

NombreTipoObligatorioDescripción
access_tokenstringToken de acceso OAuth del usuario.
appiduint32El id. de tu aplicación.
filenamestringNombre del archivo que se quiere eliminar.

Esta API eliminará el archivo especificado del Steam Cloud del usuario. La eliminación es permanente; no se conservan versiones anteriores del archivo. No hay datos en la respuesta de esta API.