100 lines
No EOL
3.1 KiB
Python
100 lines
No EOL
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
from ebay_client import EbayClient
|
|
from ebay_client.core.auth.models import EbayOAuthConfig
|
|
from ebay_client.generated.inventory.models import (
|
|
Amount,
|
|
Availability,
|
|
EbayOfferDetailsWithKeys,
|
|
InventoryItem,
|
|
ListingPolicies,
|
|
PricingSummary,
|
|
Product,
|
|
ShipToLocationAvailability,
|
|
)
|
|
|
|
|
|
def require_env(name: str) -> str:
|
|
value = os.environ.get(name)
|
|
if not value:
|
|
raise RuntimeError(f"Environment variable {name} is required")
|
|
return value
|
|
|
|
|
|
def build_client() -> EbayClient:
|
|
oauth_config = EbayOAuthConfig(
|
|
client_id=require_env("EBAY_CLIENT_ID"),
|
|
client_secret=require_env("EBAY_CLIENT_SECRET"),
|
|
default_scopes=["https://api.ebay.com/oauth/api_scope/sell.inventory"],
|
|
)
|
|
return EbayClient(oauth_config)
|
|
|
|
|
|
def build_inventory_item() -> InventoryItem:
|
|
return InventoryItem(
|
|
condition="NEW",
|
|
availability=Availability(
|
|
shipToLocationAvailability=ShipToLocationAvailability(quantity=int(os.environ.get("EBAY_AVAILABLE_QUANTITY", "1")))
|
|
),
|
|
product=Product(
|
|
title=require_env("EBAY_ITEM_TITLE"),
|
|
description=require_env("EBAY_ITEM_DESCRIPTION"),
|
|
imageUrls=[require_env("EBAY_ITEM_IMAGE_URL")],
|
|
aspects='{"Brand":["Demo Brand"],"Type":["Demo Item"]}',
|
|
),
|
|
)
|
|
|
|
|
|
def build_offer_payload(sku: str) -> EbayOfferDetailsWithKeys:
|
|
return EbayOfferDetailsWithKeys(
|
|
sku=sku,
|
|
marketplaceId=os.environ.get("EBAY_MARKETPLACE_ID", "EBAY_US"),
|
|
format="FIXED_PRICE",
|
|
availableQuantity=int(os.environ.get("EBAY_AVAILABLE_QUANTITY", "1")),
|
|
categoryId=require_env("EBAY_CATEGORY_ID"),
|
|
merchantLocationKey=require_env("EBAY_MERCHANT_LOCATION_KEY"),
|
|
listingDescription=os.environ.get("EBAY_LISTING_DESCRIPTION") or require_env("EBAY_ITEM_DESCRIPTION"),
|
|
listingDuration="GTC",
|
|
listingPolicies=ListingPolicies(
|
|
fulfillmentPolicyId=require_env("EBAY_FULFILLMENT_POLICY_ID"),
|
|
paymentPolicyId=require_env("EBAY_PAYMENT_POLICY_ID"),
|
|
returnPolicyId=require_env("EBAY_RETURN_POLICY_ID"),
|
|
),
|
|
pricingSummary=PricingSummary(
|
|
price=Amount(
|
|
currency=os.environ.get("EBAY_CURRENCY", "USD"),
|
|
value=require_env("EBAY_PRICE"),
|
|
)
|
|
),
|
|
)
|
|
|
|
|
|
def main() -> None:
|
|
client = build_client()
|
|
sku = require_env("EBAY_SKU")
|
|
content_language = os.environ.get("EBAY_CONTENT_LANGUAGE", "en-US")
|
|
|
|
item_result = client.inventory.create_or_replace_inventory_item(
|
|
sku,
|
|
build_inventory_item(),
|
|
content_language=content_language,
|
|
)
|
|
print("inventory_item_warnings:", item_result.warnings)
|
|
|
|
offer = client.inventory.create_offer(
|
|
build_offer_payload(sku),
|
|
content_language=content_language,
|
|
)
|
|
print("offer_id:", offer.offerId)
|
|
|
|
if not offer.offerId:
|
|
raise RuntimeError("create_offer did not return an offerId")
|
|
|
|
published = client.inventory.publish_offer(offer.offerId)
|
|
print("listing_id:", published.listingId)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |