{
  "schemaVersion": "1.0",
  "item": {
    "slug": "azure-storage-blob-py",
    "name": "Azure Storage Blob Py",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/thegovind/azure-storage-blob-py",
    "canonicalUrl": "https://clawhub.ai/thegovind/azure-storage-blob-py",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/azure-storage-blob-py",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=azure-storage-blob-py",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/azure-storage-blob-py"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/azure-storage-blob-py",
    "agentPageUrl": "https://openagent3.xyz/skills/azure-storage-blob-py/agent",
    "manifestUrl": "https://openagent3.xyz/skills/azure-storage-blob-py/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/azure-storage-blob-py/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Azure Blob Storage SDK for Python",
        "body": "Client library for Azure Blob Storage — object storage for unstructured data."
      },
      {
        "title": "Installation",
        "body": "pip install azure-storage-blob azure-identity"
      },
      {
        "title": "Environment Variables",
        "body": "AZURE_STORAGE_ACCOUNT_NAME=<your-storage-account>\n# Or use full URL\nAZURE_STORAGE_ACCOUNT_URL=https://<account>.blob.core.windows.net"
      },
      {
        "title": "Authentication",
        "body": "from azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\ncredential = DefaultAzureCredential()\naccount_url = \"https://<account>.blob.core.windows.net\"\n\nblob_service_client = BlobServiceClient(account_url, credential=credential)"
      },
      {
        "title": "Client Hierarchy",
        "body": "ClientPurposeGet FromBlobServiceClientAccount-level operationsDirect instantiationContainerClientContainer operationsblob_service_client.get_container_client()BlobClientSingle blob operationscontainer_client.get_blob_client()"
      },
      {
        "title": "Create Container",
        "body": "container_client = blob_service_client.get_container_client(\"mycontainer\")\ncontainer_client.create_container()"
      },
      {
        "title": "Upload Blob",
        "body": "# From file path\nblob_client = blob_service_client.get_blob_client(\n    container=\"mycontainer\",\n    blob=\"sample.txt\"\n)\n\nwith open(\"./local-file.txt\", \"rb\") as data:\n    blob_client.upload_blob(data, overwrite=True)\n\n# From bytes/string\nblob_client.upload_blob(b\"Hello, World!\", overwrite=True)\n\n# From stream\nimport io\nstream = io.BytesIO(b\"Stream content\")\nblob_client.upload_blob(stream, overwrite=True)"
      },
      {
        "title": "Download Blob",
        "body": "blob_client = blob_service_client.get_blob_client(\n    container=\"mycontainer\",\n    blob=\"sample.txt\"\n)\n\n# To file\nwith open(\"./downloaded.txt\", \"wb\") as file:\n    download_stream = blob_client.download_blob()\n    file.write(download_stream.readall())\n\n# To memory\ndownload_stream = blob_client.download_blob()\ncontent = download_stream.readall()  # bytes\n\n# Read into existing buffer\nstream = io.BytesIO()\nnum_bytes = blob_client.download_blob().readinto(stream)"
      },
      {
        "title": "List Blobs",
        "body": "container_client = blob_service_client.get_container_client(\"mycontainer\")\n\n# List all blobs\nfor blob in container_client.list_blobs():\n    print(f\"{blob.name} - {blob.size} bytes\")\n\n# List with prefix (folder-like)\nfor blob in container_client.list_blobs(name_starts_with=\"logs/\"):\n    print(blob.name)\n\n# Walk blob hierarchy (virtual directories)\nfor item in container_client.walk_blobs(delimiter=\"/\"):\n    if item.get(\"prefix\"):\n        print(f\"Directory: {item['prefix']}\")\n    else:\n        print(f\"Blob: {item.name}\")"
      },
      {
        "title": "Delete Blob",
        "body": "blob_client.delete_blob()\n\n# Delete with snapshots\nblob_client.delete_blob(delete_snapshots=\"include\")"
      },
      {
        "title": "Performance Tuning",
        "body": "# Configure chunk sizes for large uploads/downloads\nblob_client = BlobClient(\n    account_url=account_url,\n    container_name=\"mycontainer\",\n    blob_name=\"large-file.zip\",\n    credential=credential,\n    max_block_size=4 * 1024 * 1024,  # 4 MiB blocks\n    max_single_put_size=64 * 1024 * 1024  # 64 MiB single upload limit\n)\n\n# Parallel upload\nblob_client.upload_blob(data, max_concurrency=4)\n\n# Parallel download\ndownload_stream = blob_client.download_blob(max_concurrency=4)"
      },
      {
        "title": "SAS Tokens",
        "body": "from datetime import datetime, timedelta, timezone\nfrom azure.storage.blob import generate_blob_sas, BlobSasPermissions\n\nsas_token = generate_blob_sas(\n    account_name=\"<account>\",\n    container_name=\"mycontainer\",\n    blob_name=\"sample.txt\",\n    account_key=\"<account-key>\",  # Or use user delegation key\n    permission=BlobSasPermissions(read=True),\n    expiry=datetime.now(timezone.utc) + timedelta(hours=1)\n)\n\n# Use SAS token\nblob_url = f\"https://<account>.blob.core.windows.net/mycontainer/sample.txt?{sas_token}\""
      },
      {
        "title": "Blob Properties and Metadata",
        "body": "# Get properties\nproperties = blob_client.get_blob_properties()\nprint(f\"Size: {properties.size}\")\nprint(f\"Content-Type: {properties.content_settings.content_type}\")\nprint(f\"Last modified: {properties.last_modified}\")\n\n# Set metadata\nblob_client.set_blob_metadata(metadata={\"category\": \"logs\", \"year\": \"2024\"})\n\n# Set content type\nfrom azure.storage.blob import ContentSettings\nblob_client.set_http_headers(\n    content_settings=ContentSettings(content_type=\"application/json\")\n)"
      },
      {
        "title": "Async Client",
        "body": "from azure.identity.aio import DefaultAzureCredential\nfrom azure.storage.blob.aio import BlobServiceClient\n\nasync def upload_async():\n    credential = DefaultAzureCredential()\n    \n    async with BlobServiceClient(account_url, credential=credential) as client:\n        blob_client = client.get_blob_client(\"mycontainer\", \"sample.txt\")\n        \n        with open(\"./file.txt\", \"rb\") as data:\n            await blob_client.upload_blob(data, overwrite=True)\n\n# Download async\nasync def download_async():\n    async with BlobServiceClient(account_url, credential=credential) as client:\n        blob_client = client.get_blob_client(\"mycontainer\", \"sample.txt\")\n        \n        stream = await blob_client.download_blob()\n        data = await stream.readall()"
      },
      {
        "title": "Best Practices",
        "body": "Use DefaultAzureCredential instead of connection strings\nUse context managers for async clients\nSet overwrite=True explicitly when re-uploading\nUse max_concurrency for large file transfers\nPrefer readinto() over readall() for memory efficiency\nUse walk_blobs() for hierarchical listing\nSet appropriate content types for web-served blobs"
      }
    ],
    "body": "Azure Blob Storage SDK for Python\n\nClient library for Azure Blob Storage — object storage for unstructured data.\n\nInstallation\npip install azure-storage-blob azure-identity\n\nEnvironment Variables\nAZURE_STORAGE_ACCOUNT_NAME=<your-storage-account>\n# Or use full URL\nAZURE_STORAGE_ACCOUNT_URL=https://<account>.blob.core.windows.net\n\nAuthentication\nfrom azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\ncredential = DefaultAzureCredential()\naccount_url = \"https://<account>.blob.core.windows.net\"\n\nblob_service_client = BlobServiceClient(account_url, credential=credential)\n\nClient Hierarchy\nClient\tPurpose\tGet From\nBlobServiceClient\tAccount-level operations\tDirect instantiation\nContainerClient\tContainer operations\tblob_service_client.get_container_client()\nBlobClient\tSingle blob operations\tcontainer_client.get_blob_client()\nCore Workflow\nCreate Container\ncontainer_client = blob_service_client.get_container_client(\"mycontainer\")\ncontainer_client.create_container()\n\nUpload Blob\n# From file path\nblob_client = blob_service_client.get_blob_client(\n    container=\"mycontainer\",\n    blob=\"sample.txt\"\n)\n\nwith open(\"./local-file.txt\", \"rb\") as data:\n    blob_client.upload_blob(data, overwrite=True)\n\n# From bytes/string\nblob_client.upload_blob(b\"Hello, World!\", overwrite=True)\n\n# From stream\nimport io\nstream = io.BytesIO(b\"Stream content\")\nblob_client.upload_blob(stream, overwrite=True)\n\nDownload Blob\nblob_client = blob_service_client.get_blob_client(\n    container=\"mycontainer\",\n    blob=\"sample.txt\"\n)\n\n# To file\nwith open(\"./downloaded.txt\", \"wb\") as file:\n    download_stream = blob_client.download_blob()\n    file.write(download_stream.readall())\n\n# To memory\ndownload_stream = blob_client.download_blob()\ncontent = download_stream.readall()  # bytes\n\n# Read into existing buffer\nstream = io.BytesIO()\nnum_bytes = blob_client.download_blob().readinto(stream)\n\nList Blobs\ncontainer_client = blob_service_client.get_container_client(\"mycontainer\")\n\n# List all blobs\nfor blob in container_client.list_blobs():\n    print(f\"{blob.name} - {blob.size} bytes\")\n\n# List with prefix (folder-like)\nfor blob in container_client.list_blobs(name_starts_with=\"logs/\"):\n    print(blob.name)\n\n# Walk blob hierarchy (virtual directories)\nfor item in container_client.walk_blobs(delimiter=\"/\"):\n    if item.get(\"prefix\"):\n        print(f\"Directory: {item['prefix']}\")\n    else:\n        print(f\"Blob: {item.name}\")\n\nDelete Blob\nblob_client.delete_blob()\n\n# Delete with snapshots\nblob_client.delete_blob(delete_snapshots=\"include\")\n\nPerformance Tuning\n# Configure chunk sizes for large uploads/downloads\nblob_client = BlobClient(\n    account_url=account_url,\n    container_name=\"mycontainer\",\n    blob_name=\"large-file.zip\",\n    credential=credential,\n    max_block_size=4 * 1024 * 1024,  # 4 MiB blocks\n    max_single_put_size=64 * 1024 * 1024  # 64 MiB single upload limit\n)\n\n# Parallel upload\nblob_client.upload_blob(data, max_concurrency=4)\n\n# Parallel download\ndownload_stream = blob_client.download_blob(max_concurrency=4)\n\nSAS Tokens\nfrom datetime import datetime, timedelta, timezone\nfrom azure.storage.blob import generate_blob_sas, BlobSasPermissions\n\nsas_token = generate_blob_sas(\n    account_name=\"<account>\",\n    container_name=\"mycontainer\",\n    blob_name=\"sample.txt\",\n    account_key=\"<account-key>\",  # Or use user delegation key\n    permission=BlobSasPermissions(read=True),\n    expiry=datetime.now(timezone.utc) + timedelta(hours=1)\n)\n\n# Use SAS token\nblob_url = f\"https://<account>.blob.core.windows.net/mycontainer/sample.txt?{sas_token}\"\n\nBlob Properties and Metadata\n# Get properties\nproperties = blob_client.get_blob_properties()\nprint(f\"Size: {properties.size}\")\nprint(f\"Content-Type: {properties.content_settings.content_type}\")\nprint(f\"Last modified: {properties.last_modified}\")\n\n# Set metadata\nblob_client.set_blob_metadata(metadata={\"category\": \"logs\", \"year\": \"2024\"})\n\n# Set content type\nfrom azure.storage.blob import ContentSettings\nblob_client.set_http_headers(\n    content_settings=ContentSettings(content_type=\"application/json\")\n)\n\nAsync Client\nfrom azure.identity.aio import DefaultAzureCredential\nfrom azure.storage.blob.aio import BlobServiceClient\n\nasync def upload_async():\n    credential = DefaultAzureCredential()\n    \n    async with BlobServiceClient(account_url, credential=credential) as client:\n        blob_client = client.get_blob_client(\"mycontainer\", \"sample.txt\")\n        \n        with open(\"./file.txt\", \"rb\") as data:\n            await blob_client.upload_blob(data, overwrite=True)\n\n# Download async\nasync def download_async():\n    async with BlobServiceClient(account_url, credential=credential) as client:\n        blob_client = client.get_blob_client(\"mycontainer\", \"sample.txt\")\n        \n        stream = await blob_client.download_blob()\n        data = await stream.readall()\n\nBest Practices\nUse DefaultAzureCredential instead of connection strings\nUse context managers for async clients\nSet overwrite=True explicitly when re-uploading\nUse max_concurrency for large file transfers\nPrefer readinto() over readall() for memory efficiency\nUse walk_blobs() for hierarchical listing\nSet appropriate content types for web-served blobs"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/thegovind/azure-storage-blob-py",
    "publisherUrl": "https://clawhub.ai/thegovind/azure-storage-blob-py",
    "owner": "thegovind",
    "version": "0.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/azure-storage-blob-py",
    "downloadUrl": "https://openagent3.xyz/downloads/azure-storage-blob-py",
    "agentUrl": "https://openagent3.xyz/skills/azure-storage-blob-py/agent",
    "manifestUrl": "https://openagent3.xyz/skills/azure-storage-blob-py/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/azure-storage-blob-py/agent.md"
  }
}