From e2ab1c0afb72c5a1f5d2015f111e4750aa4068d7 Mon Sep 17 00:00:00 2001 From: filoxenace Date: Sat, 7 Mar 2026 13:29:01 -0500 Subject: [PATCH] fix: use economy API for get_collectible_item_id (simpler, no CSRF needed) --- pyproject.toml | 2 +- src/rbx_upload/client.py | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e1eb122..df07c5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "rbx-upload" -version = "0.2.4" +version = "0.2.6" description = "Roblox asset upload client" requires-python = ">=3.13" dependencies = [ diff --git a/src/rbx_upload/client.py b/src/rbx_upload/client.py index c9e625f..2fe365b 100644 --- a/src/rbx_upload/client.py +++ b/src/rbx_upload/client.py @@ -289,18 +289,19 @@ class RobloxClient: response.raise_for_status() return response.json() if response.text else {} - async def get_collectible_item_id(self, asset_id: int) -> str | None: - """Look up the collectible item ID (UUID) for a given asset ID.""" - csrf = await self._get_csrf_token() - response = await self._http.post( - self._proxy_url("https://catalog.roblox.com/v1/catalog/items/details"), - json={"items": [{"itemType": "Asset", "id": asset_id}]}, - headers={"X-CSRF-TOKEN": csrf}, - cookies=self._csrf_cookies, - ) - response.raise_for_status() - items = response.json().get("data", []) - return items[0].get("collectibleItemId") if items else None + async def get_collectible_item_id(self, asset_id: int, max_attempts: int = 10, poll_interval: float = 3.0) -> str: + """Look up the collectible item ID (UUID) for a given asset ID, retrying until available.""" + for _ in range(max_attempts): + response = await self._http.get( + self._proxy_url(f"https://economy.roblox.com/v2/assets/{asset_id}/details"), + cookies=self._csrf_cookies, + ) + response.raise_for_status() + collectible_item_id = response.json().get("CollectibleItemId") + if collectible_item_id: + return collectible_item_id + await asyncio.sleep(poll_interval) + raise UploadError(f"collectibleItemId not available for asset {asset_id} after {max_attempts} attempts.") async def close(self): """Close the underlying HTTP client."""